122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- RelocData.h --------------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_RELOCDATA_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_RELOCDATA_H_
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
12a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include "mcld/ADT/ilist_sort.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Relocation.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactoryListTraits.h"
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
19d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <llvm/ADT/ilist.h>
20d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <llvm/ADT/ilist_node.h>
21d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao#include <llvm/Support/DataTypes.h>
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list>
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class RelocData
30d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  \brief RelocData stores Relocation.
31d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines *  Since Relocations are created by GCFactory, we use GCFactoryListTraits for
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines *the
34d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao *  RelocationList here to avoid iplist to delete Relocations.
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass RelocData {
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
38d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  friend class Chunk<RelocData, MCLD_SECTIONS_PER_INPUT>;
39d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  RelocData();
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  explicit RelocData(LDSection& pSection);
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef llvm::iplist<Relocation, GCFactoryListTraits<Relocation> >
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      RelocationListType;
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
47d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::reference reference;
48d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::const_reference const_reference;
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
50d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::iterator iterator;
51d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::const_iterator const_iterator;
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
53d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::reverse_iterator reverse_iterator;
54d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  typedef RelocationListType::const_reverse_iterator const_reverse_iterator;
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
57d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  static RelocData* Create(LDSection& pSection);
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  static void Destroy(RelocData*& pSection);
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
61d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  static void Clear();
62d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
63d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const LDSection& getSection() const { return *m_pSection; }
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection& getSection() { return *m_pSection; }
65d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao
66d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const RelocationListType& getRelocationList() const { return m_Relocations; }
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  RelocationListType& getRelocationList() { return m_Relocations; }
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
69d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  size_t size() const { return m_Relocations.size(); }
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
71d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  bool empty() const { return m_Relocations.empty(); }
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
73d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  RelocData& append(Relocation& pRelocation);
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Relocation& remove(Relocation& pRelocation);
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_reference front() const { return m_Relocations.front(); }
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  reference front() { return m_Relocations.front(); }
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_reference back() const { return m_Relocations.back(); }
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  reference back() { return m_Relocations.back(); }
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_iterator begin() const { return m_Relocations.begin(); }
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  iterator begin() { return m_Relocations.begin(); }
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_iterator end() const { return m_Relocations.end(); }
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  iterator end() { return m_Relocations.end(); }
85d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  const_reverse_iterator rbegin() const { return m_Relocations.rbegin(); }
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  reverse_iterator rbegin() { return m_Relocations.rbegin(); }
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_reverse_iterator rend() const { return m_Relocations.rend(); }
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  reverse_iterator rend() { return m_Relocations.rend(); }
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  template <class Comparator>
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void sort(Comparator pComparator) {
92a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines    mcld::sort(m_Relocations, pComparator);
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
96d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  RelocationListType m_Relocations;
97d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao  LDSection* m_pSection;
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DISALLOW_COPY_AND_ASSIGN(RelocData);
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_RELOCDATA_H_
106