//===- LDContext.h --------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LDCONTEXT_H #define MCLD_LDCONTEXT_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <vector> #include <mcld/LD/LDFileFormat.h> #include <llvm/Support/DataTypes.h> #include <string> #include <cassert> namespace llvm { class StringRef; } 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<LDSection*> SectionTable; typedef SectionTable::iterator sect_iterator; typedef SectionTable::const_iterator const_sect_iterator; typedef std::vector<LDSymbol*> 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); } // ----- 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<section name, section index> }; } // namespace of mcld #endif