//===- HexagonPLT.cpp -----------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "HexagonPLT.h"
#include <llvm/Support/ELF.h>
#include <llvm/Support/Casting.h>
#include <mcld/LD/LDSection.h>
#include <mcld/LinkerConfig.h>
#include <mcld/Support/MsgHandling.h>
using namespace mcld;
//===----------------------------------------------------------------------===//
// PLT entry data
//===----------------------------------------------------------------------===//
HexagonDynPLT0::HexagonDynPLT0(SectionData& pParent)
: PLT::Entry<sizeof(hexagon_dyn_plt0)>(pParent)
{
}
HexagonExecPLT0::HexagonExecPLT0(SectionData& pParent)
: PLT::Entry<sizeof(hexagon_exec_plt0)>(pParent)
{
}
//===----------------------------------------------------------------------===//
// HexagonPLT
//===----------------------------------------------------------------------===//
HexagonPLT::HexagonPLT(LDSection& pSection,
HexagonGOT &pGOTPLT,
const LinkerConfig& pConfig)
: PLT(pSection),
m_GOT(pGOTPLT),
m_Config(pConfig)
{
assert(LinkerConfig::DynObj == m_Config.codeGenType() ||
LinkerConfig::Exec == m_Config.codeGenType() ||
LinkerConfig::Binary == m_Config.codeGenType());
if (LinkerConfig::DynObj == m_Config.codeGenType()) {
m_PLT0 = hexagon_dyn_plt0;
m_PLT0Size = sizeof (hexagon_dyn_plt0);
// create PLT0
new HexagonDynPLT0(*m_SectionData);
}
else {
m_PLT0 = hexagon_exec_plt0;
m_PLT0Size = sizeof (hexagon_exec_plt0);
// create PLT0
new HexagonExecPLT0(*m_SectionData);
}
m_Last = m_SectionData->begin();
}
HexagonPLT::~HexagonPLT()
{
}
PLTEntryBase* HexagonPLT::getPLT0() const
{
iterator first = m_SectionData->getFragmentList().begin();
assert(first != m_SectionData->getFragmentList().end() &&
"FragmentList is empty, getPLT0 failed!");
PLTEntryBase* plt0 = &(llvm::cast<PLTEntryBase>(*first));
return plt0;
}
void HexagonPLT::finalizeSectionSize()
{
uint64_t size = 0;
// plt0 size
size = getPLT0()->size();
m_Section.setSize(size);
uint32_t offset = 0;
SectionData::iterator frag, fragEnd = m_SectionData->end();
for (frag = m_SectionData->begin(); frag != fragEnd; ++frag) {
frag->setOffset(offset);
offset += frag->size();
}
}
void HexagonPLT::reserveEntry(size_t pNum)
{
}