RelocData.h revision f33f6de54db174aa679a4b6d1e040d37e95541c0
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#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15#include <mcld/Config/Config.h> 16#include <mcld/Fragment/Relocation.h> 17#include <mcld/Support/Allocators.h> 18#include <mcld/Support/GCFactoryListTraits.h> 19 20#include <llvm/ADT/ilist.h> 21#include <llvm/ADT/ilist_node.h> 22#include <llvm/Support/DataTypes.h> 23 24#include <list> 25 26namespace mcld { 27 28class LDSection; 29 30/** \class RelocData 31 * \brief RelocData stores Relocation. 32 * 33 * Since Relocations are created by GCFactory, we use GCFactoryListTraits for the 34 * RelocationList here to avoid iplist to delete Relocations. 35 */ 36class RelocData 37{ 38private: 39 friend class Chunk<RelocData, MCLD_SECTIONS_PER_INPUT>; 40 41 RelocData(); 42 explicit RelocData(LDSection &pSection); 43 44 RelocData(const RelocData &); // DO NOT IMPLEMENT 45 RelocData& operator=(const RelocData &); // DO NOT IMPLEMENT 46 47public: 48 typedef llvm::iplist<Relocation, 49 GCFactoryListTraits<Relocation> > RelocationListType; 50 51 typedef RelocationListType::reference reference; 52 typedef RelocationListType::const_reference const_reference; 53 54 typedef RelocationListType::iterator iterator; 55 typedef RelocationListType::const_iterator const_iterator; 56 57 typedef RelocationListType::reverse_iterator reverse_iterator; 58 typedef RelocationListType::const_reverse_iterator const_reverse_iterator; 59 60public: 61 static RelocData* Create(LDSection& pSection); 62 63 static void Destroy(RelocData*& pSection); 64 65 static void Clear(); 66 67 const LDSection& getSection() const { return *m_pSection; } 68 LDSection& getSection() { return *m_pSection; } 69 70 const RelocationListType& getRelocationList() const { return m_Relocations; } 71 RelocationListType& getRelocationList() { return m_Relocations; } 72 73 size_t size() const { return m_Relocations.size(); } 74 75 bool empty() const { return m_Relocations.empty(); } 76 77 RelocData& append(Relocation& pRelocation); 78 Relocation& remove(Relocation& pRelocation); 79 80 reference front () { return m_Relocations.front(); } 81 const_reference front () const { return m_Relocations.front(); } 82 reference back () { return m_Relocations.back(); } 83 const_reference back () const { return m_Relocations.back(); } 84 85 const_iterator begin () const { return m_Relocations.begin(); } 86 iterator begin () { return m_Relocations.begin(); } 87 const_iterator end () const { return m_Relocations.end(); } 88 iterator end () { return m_Relocations.end(); } 89 const_reverse_iterator rbegin() const { return m_Relocations.rbegin(); } 90 reverse_iterator rbegin() { return m_Relocations.rbegin(); } 91 const_reverse_iterator rend () const { return m_Relocations.rend(); } 92 reverse_iterator rend () { return m_Relocations.rend(); } 93 94 template<class Comparator> void sort(Comparator pComparator) { 95 /* FIXME: use llvm::iplist::sort */ 96 std::list<Relocation*> relocs; 97 for (iterator it = begin(), ie = end(); it != ie; ++it) 98 relocs.push_back(it); 99 relocs.sort(pComparator); 100 m_Relocations.clear(); 101 for (std::list<Relocation*>::iterator it = relocs.begin(), 102 ie = relocs.end(); it != ie; ++it) 103 m_Relocations.push_back(*it); 104 } 105 106private: 107 RelocationListType m_Relocations; 108 LDSection* m_pSection; 109 110}; 111 112} // namespace of mcld 113 114#endif 115 116