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 
sectBegin()46   const_sect_iterator sectBegin() const { return m_SectionTable.begin(); }
sectBegin()47   sect_iterator sectBegin() { return m_SectionTable.begin(); }
48 
sectEnd()49   const_sect_iterator sectEnd() const { return m_SectionTable.end(); }
sectEnd()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 
numOfSections()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 
addSymbol(LDSymbol * pSym)69   void addSymbol(LDSymbol* pSym) { m_SymTab.push_back(pSym); }
70 
symTabBegin()71   const_sym_iterator symTabBegin() const { return m_SymTab.begin(); }
symTabBegin()72   sym_iterator symTabBegin() { return m_SymTab.begin(); }
73 
symTabEnd()74   const_sym_iterator symTabEnd() const { return m_SymTab.end(); }
symTabEnd()75   sym_iterator symTabEnd() { return m_SymTab.end(); }
76 
77   // -----  relocations  ----- //
relocSectBegin()78   const_sect_iterator relocSectBegin() const { return m_RelocSections.begin(); }
relocSectBegin()79   sect_iterator relocSectBegin() { return m_RelocSections.begin(); }
80 
relocSectEnd()81   const_sect_iterator relocSectEnd() const { return m_RelocSections.end(); }
relocSectEnd()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