HexagonPLT.cpp revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonPLT.cpp -----------------------------------------------------===// 26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// The MCLinker Project 46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source 66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details. 76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// 86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonPLT.h" 106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/ELF.h> 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/Casting.h> 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LD/LDSection.h> 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h> 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MsgHandling.h> 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesusing namespace mcld; 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// PLT entry data 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonDynPLT0::HexagonDynPLT0(SectionData& pParent) 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : PLT::Entry<sizeof(hexagon_dyn_plt0)>(pParent) 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonExecPLT0::HexagonExecPLT0(SectionData& pParent) 296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : PLT::Entry<sizeof(hexagon_exec_plt0)>(pParent) 306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonPLT 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonPLT::HexagonPLT(LDSection& pSection, 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonGOT &pGOTPLT, 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LinkerConfig& pConfig) 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : PLT(pSection), 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_GOT(pGOTPLT), 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Config(pConfig) 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(LinkerConfig::DynObj == m_Config.codeGenType() || 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LinkerConfig::Exec == m_Config.codeGenType() || 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LinkerConfig::Binary == m_Config.codeGenType()); 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (LinkerConfig::DynObj == m_Config.codeGenType()) { 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_PLT0 = hexagon_dyn_plt0; 496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_PLT0Size = sizeof (hexagon_dyn_plt0); 506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // create PLT0 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines new HexagonDynPLT0(*m_SectionData); 526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines else { 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_PLT0 = hexagon_exec_plt0; 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_PLT0Size = sizeof (hexagon_exec_plt0); 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // create PLT0 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines new HexagonExecPLT0(*m_SectionData); 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Last = m_SectionData->begin(); 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonPLT::~HexagonPLT() 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesPLTEntryBase* HexagonPLT::getPLT0() const 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines iterator first = m_SectionData->getFragmentList().begin(); 696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(first != m_SectionData->getFragmentList().end() && 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines "FragmentList is empty, getPLT0 failed!"); 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines PLTEntryBase* plt0 = &(llvm::cast<PLTEntryBase>(*first)); 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return plt0; 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonPLT::finalizeSectionSize() 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint64_t size = 0; 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // plt0 size 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines size = getPLT0()->size(); 836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_Section.setSize(size); 856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines uint32_t offset = 0; 876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines SectionData::iterator frag, fragEnd = m_SectionData->end(); 886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines for (frag = m_SectionData->begin(); frag != fragEnd; ++frag) { 896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines frag->setOffset(offset); 906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines offset += frag->size(); 916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonPLT::reserveEntry(size_t pNum) 956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 98