• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===- RelocData.h --------------------------------------------------------===//
2  //
3  //                     The MCLinker Project
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  #ifndef MCLD_LD_RELOCDATA_H_
10  #define MCLD_LD_RELOCDATA_H_
11  
12  #include "mcld/ADT/ilist_sort.h"
13  #include "mcld/Config/Config.h"
14  #include "mcld/Fragment/Relocation.h"
15  #include "mcld/Support/Allocators.h"
16  #include "mcld/Support/Compiler.h"
17  #include "mcld/Support/GCFactoryListTraits.h"
18  
19  #include <llvm/ADT/ilist.h>
20  #include <llvm/ADT/ilist_node.h>
21  #include <llvm/Support/DataTypes.h>
22  
23  #include <list>
24  
25  namespace mcld {
26  
27  class LDSection;
28  
29  /** \class RelocData
30   *  \brief RelocData stores Relocation.
31   *
32   *  Since Relocations are created by GCFactory, we use GCFactoryListTraits for
33   *the
34   *  RelocationList here to avoid iplist to delete Relocations.
35   */
36  class RelocData {
37   private:
38    friend class Chunk<RelocData, MCLD_SECTIONS_PER_INPUT>;
39  
40    RelocData();
41    explicit RelocData(LDSection& pSection);
42  
43   public:
44    typedef llvm::iplist<Relocation, GCFactoryListTraits<Relocation> >
45        RelocationListType;
46  
47    typedef RelocationListType::reference reference;
48    typedef RelocationListType::const_reference const_reference;
49  
50    typedef RelocationListType::iterator iterator;
51    typedef RelocationListType::const_iterator const_iterator;
52  
53    typedef RelocationListType::reverse_iterator reverse_iterator;
54    typedef RelocationListType::const_reverse_iterator const_reverse_iterator;
55  
56   public:
57    static RelocData* Create(LDSection& pSection);
58  
59    static void Destroy(RelocData*& pSection);
60  
61    static void Clear();
62  
getSection()63    const LDSection& getSection() const { return *m_pSection; }
getSection()64    LDSection& getSection() { return *m_pSection; }
65  
getRelocationList()66    const RelocationListType& getRelocationList() const { return m_Relocations; }
getRelocationList()67    RelocationListType& getRelocationList() { return m_Relocations; }
68  
size()69    size_t size() const { return m_Relocations.size(); }
70  
empty()71    bool empty() const { return m_Relocations.empty(); }
72  
73    RelocData& append(Relocation& pRelocation);
74    Relocation& remove(Relocation& pRelocation);
75  
front()76    const_reference front() const { return m_Relocations.front(); }
front()77    reference front() { return m_Relocations.front(); }
back()78    const_reference back() const { return m_Relocations.back(); }
back()79    reference back() { return m_Relocations.back(); }
80  
begin()81    const_iterator begin() const { return m_Relocations.begin(); }
begin()82    iterator begin() { return m_Relocations.begin(); }
end()83    const_iterator end() const { return m_Relocations.end(); }
end()84    iterator end() { return m_Relocations.end(); }
rbegin()85    const_reverse_iterator rbegin() const { return m_Relocations.rbegin(); }
rbegin()86    reverse_iterator rbegin() { return m_Relocations.rbegin(); }
rend()87    const_reverse_iterator rend() const { return m_Relocations.rend(); }
rend()88    reverse_iterator rend() { return m_Relocations.rend(); }
89  
90    template <class Comparator>
sort(Comparator pComparator)91    void sort(Comparator pComparator) {
92      mcld::sort(m_Relocations, pComparator);
93    }
94  
95   private:
96    RelocationListType m_Relocations;
97    LDSection* m_pSection;
98  
99   private:
100    DISALLOW_COPY_AND_ASSIGN(RelocData);
101  };
102  
103  }  // namespace mcld
104  
105  #endif  // MCLD_LD_RELOCDATA_H_
106