//===- LDContext.h --------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LD_LDCONTEXT_H_ #define MCLD_LD_LDCONTEXT_H_ #include "mcld/LD/LDFileFormat.h" #include #include #include #include namespace llvm { class StringRef; } // namespace llvm namespace mcld { class LDSymbol; class LDSection; /** \class LDContext * \brief LDContext stores the data which a object file should has */ class LDContext { public: typedef std::vector SectionTable; typedef SectionTable::iterator sect_iterator; typedef SectionTable::const_iterator const_sect_iterator; typedef std::vector SymbolTable; typedef SymbolTable::iterator sym_iterator; typedef SymbolTable::const_iterator const_sym_iterator; public: // ----- sections ----- // LDContext& appendSection(LDSection& pSection); const_sect_iterator sectBegin() const { return m_SectionTable.begin(); } sect_iterator sectBegin() { return m_SectionTable.begin(); } const_sect_iterator sectEnd() const { return m_SectionTable.end(); } sect_iterator sectEnd() { return m_SectionTable.end(); } const LDSection* getSection(unsigned int pIdx) const; LDSection* getSection(unsigned int pIdx); const LDSection* getSection(const std::string& pName) const; LDSection* getSection(const std::string& pName); size_t getSectionIdx(const std::string& pName) const; size_t numOfSections() const { return m_SectionTable.size(); } // ----- symbols ----- // const LDSymbol* getSymbol(unsigned int pIdx) const; LDSymbol* getSymbol(unsigned int pIdx); const LDSymbol* getSymbol(const llvm::StringRef& pName) const; LDSymbol* getSymbol(const llvm::StringRef& pName); void addSymbol(LDSymbol* pSym) { m_SymTab.push_back(pSym); } const_sym_iterator symTabBegin() const { return m_SymTab.begin(); } sym_iterator symTabBegin() { return m_SymTab.begin(); } const_sym_iterator symTabEnd() const { return m_SymTab.end(); } sym_iterator symTabEnd() { return m_SymTab.end(); } // ----- relocations ----- // const_sect_iterator relocSectBegin() const { return m_RelocSections.begin(); } sect_iterator relocSectBegin() { return m_RelocSections.begin(); } const_sect_iterator relocSectEnd() const { return m_RelocSections.end(); } sect_iterator relocSectEnd() { return m_RelocSections.end(); } private: SectionTable m_SectionTable; SymbolTable m_SymTab; SectionTable m_RelocSections; // FIXME : maintain a map
}; } // namespace mcld #endif // MCLD_LD_LDCONTEXT_H_