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