1 //===- LDContext.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_LDCONTEXT_H 10 #define MCLD_LDCONTEXT_H 11 #ifdef ENABLE_UNITTEST 12 #include <gtest.h> 13 #endif 14 15 #include <vector> 16 #include <mcld/LD/LDFileFormat.h> 17 #include <llvm/Support/DataTypes.h> 18 #include <string> 19 #include <cassert> 20 21 namespace llvm { 22 class StringRef; 23 } 24 25 namespace mcld { 26 27 class LDSymbol; 28 class LDSection; 29 30 /** \class LDContext 31 * \brief LDContext stores the data which a object file should has 32 */ 33 class LDContext 34 { 35 public: 36 typedef std::vector<LDSection*> SectionTable; 37 typedef SectionTable::iterator sect_iterator; 38 typedef SectionTable::const_iterator const_sect_iterator; 39 40 typedef std::vector<LDSymbol*> SymbolTable; 41 typedef SymbolTable::iterator sym_iterator; 42 typedef SymbolTable::const_iterator const_sym_iterator; 43 44 public: 45 // ----- sections ----- // 46 LDContext& appendSection(LDSection& pSection); 47 48 const_sect_iterator sectBegin() const { return m_SectionTable.begin(); } 49 sect_iterator sectBegin() { return m_SectionTable.begin(); } 50 51 const_sect_iterator sectEnd() const { return m_SectionTable.end(); } 52 sect_iterator sectEnd() { return m_SectionTable.end(); } 53 54 const LDSection* getSection(unsigned int pIdx) const; 55 LDSection* getSection(unsigned int pIdx); 56 57 const LDSection* getSection(const std::string& pName) const; 58 LDSection* getSection(const std::string& pName); 59 60 size_t getSectionIdx(const std::string& pName) const; 61 62 size_t numOfSections() const 63 { return m_SectionTable.size(); } 64 65 // ----- symbols ----- // 66 const LDSymbol* getSymbol(unsigned int pIdx) const; 67 LDSymbol* getSymbol(unsigned int pIdx); 68 69 const LDSymbol* getSymbol(const llvm::StringRef& pName) const; 70 LDSymbol* getSymbol(const llvm::StringRef& pName); 71 72 void addSymbol(LDSymbol* pSym) 73 { m_SymTab.push_back(pSym); } 74 75 // ----- relocations ----- // 76 const_sect_iterator relocSectBegin() const { return m_RelocSections.begin(); } 77 sect_iterator relocSectBegin() { return m_RelocSections.begin(); } 78 79 const_sect_iterator relocSectEnd() const { return m_RelocSections.end(); } 80 sect_iterator relocSectEnd() { return m_RelocSections.end(); } 81 82 private: 83 SectionTable m_SectionTable; 84 SymbolTable m_SymTab; 85 SectionTable m_RelocSections; 86 87 // FIXME : maintain a map<section name, section index> 88 }; 89 90 91 } // namespace of mcld 92 93 #endif 94 95