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