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
20namespace llvm {
21class StringRef;
22}  // namespace llvm
23
24namespace mcld {
25
26class LDSymbol;
27class LDSection;
28
29/** \class LDContext
30 *  \brief LDContext stores the data which a object file should has
31 */
32class 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