Home | History | Annotate | Download | only in LD
      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 
     63   const LDSection& getSection() const { return *m_pSection; }
     64   LDSection& getSection() { return *m_pSection; }
     65 
     66   const RelocationListType& getRelocationList() const { return m_Relocations; }
     67   RelocationListType& getRelocationList() { return m_Relocations; }
     68 
     69   size_t size() const { return m_Relocations.size(); }
     70 
     71   bool empty() const { return m_Relocations.empty(); }
     72 
     73   RelocData& append(Relocation& pRelocation);
     74   Relocation& remove(Relocation& pRelocation);
     75 
     76   const_reference front() const { return m_Relocations.front(); }
     77   reference front() { return m_Relocations.front(); }
     78   const_reference back() const { return m_Relocations.back(); }
     79   reference back() { return m_Relocations.back(); }
     80 
     81   const_iterator begin() const { return m_Relocations.begin(); }
     82   iterator begin() { return m_Relocations.begin(); }
     83   const_iterator end() const { return m_Relocations.end(); }
     84   iterator end() { return m_Relocations.end(); }
     85   const_reverse_iterator rbegin() const { return m_Relocations.rbegin(); }
     86   reverse_iterator rbegin() { return m_Relocations.rbegin(); }
     87   const_reverse_iterator rend() const { return m_Relocations.rend(); }
     88   reverse_iterator rend() { return m_Relocations.rend(); }
     89 
     90   template <class Comparator>
     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