blob: 8533fe3da0389ee0e1fa5f824a595a9eb633a369 [file] [log] [blame]
//===- 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_