95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
//===- 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 <llvm/Support/DataTypes.h>
|
|
|
|
#include <cassert>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
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<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); }
|
|
|
|
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<section name, section index>
|
|
};
|
|
|
|
} // namespace mcld
|
|
|
|
#endif // MCLD_LD_LDCONTEXT_H_
|