//===- LDContext.cpp ------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/LDContext.h>
#include <mcld/LD/LDSection.h>
#include <mcld/LD/LDSymbol.h>
#include <llvm/ADT/StringRef.h>
using namespace mcld;
//===----------------------------------------------------------------------===//
// LDContext
//===----------------------------------------------------------------------===//
LDContext& LDContext::appendSection(LDSection& pSection)
{
if (LDFileFormat::Relocation == pSection.kind())
m_RelocSections.push_back(&pSection);
pSection.setIndex(m_SectionTable.size());
m_SectionTable.push_back(&pSection);
return *this;
}
LDSection* LDContext::getSection(unsigned int pIdx)
{
if (pIdx >= m_SectionTable.size())
return NULL;
return m_SectionTable[pIdx];
}
const LDSection* LDContext::getSection(unsigned int pIdx) const
{
if (pIdx >= m_SectionTable.size())
return NULL;
return m_SectionTable[pIdx];
}
LDSection* LDContext::getSection(const std::string& pName)
{
sect_iterator sect_iter, sect_end = sectEnd();
for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
if(NULL != *sect_iter && (*sect_iter)->name() == pName)
return *sect_iter;
}
return NULL;
}
const LDSection* LDContext::getSection(const std::string& pName) const
{
const_sect_iterator sect_iter, sect_end = sectEnd();
for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
if(NULL != *sect_iter && (*sect_iter)->name() == pName)
return *sect_iter;
}
return NULL;
}
size_t LDContext::getSectionIdx(const std::string& pName) const
{
size_t result = 1;
size_t size = m_SectionTable.size();
for (; result != size; ++result)
if (m_SectionTable[result]->name() == pName)
return result;
return 0;
}
LDSymbol* LDContext::getSymbol(unsigned int pIdx)
{
if (pIdx >= m_SymTab.size())
return NULL;
return m_SymTab[pIdx];
}
const LDSymbol* LDContext::getSymbol(unsigned int pIdx) const
{
if (pIdx >= m_SymTab.size())
return NULL;
return m_SymTab[pIdx];
}
LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName)
{
size_t sym = 1;
size_t size = m_SymTab.size();
for (; sym < size; ++sym)
if (m_SymTab[sym]->name() == pName)
return m_SymTab[sym];
return NULL;
}
const LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) const
{
size_t sym = 1;
size_t size = m_SymTab.size();
for (; sym < size; ++sym)
if (m_SymTab[sym]->name() == pName)
return m_SymTab[sym];
return NULL;
}