HexagonLDBackend.cpp revision f7ac0f19a1c8d0ad14bcf6456ce368b830fea886
16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonLDBackend.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 "Hexagon.h" 106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonELFDynamic.h" 116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonLDBackend.h" 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonRelocator.h" 136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "HexagonGNUInfo.h" 14f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include "HexagonAbsoluteStub.h" 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/ADT/Triple.h> 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/Support/Casting.h> 186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h> 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/IRBuilder.h> 21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Fragment/AlignFragment.h> 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Fragment/FillFragment.h> 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Fragment/RegionFragment.h> 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MemoryRegion.h> 25f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/MemoryArea.h> 266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/MsgHandling.h> 276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/TargetRegistry.h> 286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Object/ObjectBuilder.h> 29f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Fragment/Stub.h> 30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/BranchIslandFactory.h> 31f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/StubFactory.h> 32f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LD/LDContext.h> 33f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <cstring> 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesusing namespace mcld; 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonLDBackend 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonLDBackend::HexagonLDBackend(const LinkerConfig& pConfig, 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines HexagonGNUInfo* pInfo) 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines : GNULDBackend(pConfig, pInfo), 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pRelocator(NULL), 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pGOT(NULL), 47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT(NULL), 486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pPLT(NULL), 49f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pRelaDyn(NULL), 50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pRelaPLT(NULL), 516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pDynamic(NULL), 52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTSymbol(NULL), 53f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_CopyRel(llvm::ELF::R_HEX_COPY) { 546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonLDBackend::~HexagonLDBackend() 576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pRelocator; 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pGOT; 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pPLT; 61f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines delete m_pRelaDyn; 62f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines delete m_pRelaPLT; 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete m_pDynamic; 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesbool HexagonLDBackend::initRelocator() 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (NULL == m_pRelocator) { 69f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pRelocator = new HexagonRelocator(*this, config()); 706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesRelocator* HexagonLDBackend::getRelocator() 756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pRelocator); 776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return m_pRelocator; 786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonLDBackend::doPreLayout(IRBuilder& pBuilder) 816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize .dynamic data 836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (!config().isCodeStatic() && NULL == m_pDynamic) 846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pDynamic = new HexagonELFDynamic(*this, config()); 85f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 86f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .got.plt and .got sizes 87f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // when building shared object, the .got section is must 88f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((LinkerConfig::Object != config().codeGenType()) && 89f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (!config().isCodeStatic())) { 90f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines setGOTSectionSize(pBuilder); 91f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 92f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .plt size 93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (m_pPLT->hasPLT1()) 94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pPLT->finalizeSectionSize(); 95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .rela.dyn size 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!m_pRelaDyn->empty()) { 98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(!config().isCodeStatic() && 99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "static linkage should not result in a dynamic relocation section"); 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines setRelaDynSize(); 101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .rela.plt size 103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!m_pRelaPLT->empty()) { 104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(!config().isCodeStatic() && 105f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "static linkage should not result in a dynamic relocation section"); 106f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines setRelaPLTSize(); 107f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 108f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 109f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Shared libraries are compiled with -G0 so there is no need to set SData. 110f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (LinkerConfig::Object == config().codeGenType()) 111f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SetSDataSection(); 1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonLDBackend::doPostLayout(Module& pModule, IRBuilder& pBuilder) 1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// dynamic - the dynamic section of the target machine. 1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// Use co-variant return type to return its own dynamic section. 1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonELFDynamic& HexagonLDBackend::dynamic() 1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pDynamic); 1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pDynamic; 1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// dynamic - the dynamic section of the target machine. 1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// Use co-variant return type to return its own dynamic section. 1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst HexagonELFDynamic& HexagonLDBackend::dynamic() const 1296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 1306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pDynamic); 1316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pDynamic; 1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesuint64_t HexagonLDBackend::emitSectionData(const LDSection& pSection, 1356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines MemoryRegion& pRegion) const 1366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 137f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!pRegion.size()) 138f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return 0; 139f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 140f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ELFFileFormat* FileFormat = getOutputFormat(); 141f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned int EntrySize = 0; 142f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t RegionSize = 0; 143f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 144f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((LinkerConfig::Object != config().codeGenType()) && 145f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (!config().isCodeStatic())) { 146f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSection == &(FileFormat->getPLT())) { 147f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(m_pPLT && "emitSectionData failed, m_pPLT is NULL!"); 148f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 149f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned char* buffer = pRegion.getBuffer(); 150f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 151f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pPLT->applyPLT0(); 152f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pPLT->applyPLT1(); 153f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator it = m_pPLT->begin(); 154f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned int plt0_size = llvm::cast<PLTEntryBase>((*it)).size(); 155f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 156f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(buffer, llvm::cast<PLTEntryBase>((*it)).getValue(), plt0_size); 157f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += plt0_size; 158f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 159f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 160f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines PLTEntryBase* plt1 = 0; 161f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonPLT::iterator ie = m_pPLT->end(); 162f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines while (it != ie) { 163f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines plt1 = &(llvm::cast<PLTEntryBase>(*it)); 164f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines EntrySize = plt1->size(); 165f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(buffer + RegionSize, plt1->getValue(), EntrySize); 166f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += EntrySize; 167f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ++it; 168f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 169f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return RegionSize; 170f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 171f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else if (&pSection == &(FileFormat->getGOT())) { 172f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += emitGOTSectionData(pRegion); 173f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return RegionSize; 174f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 175f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else if (&pSection == &(FileFormat->getGOTPLT())) { 176f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += emitGOTPLTSectionData(pRegion, FileFormat); 177f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return RegionSize; 178f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 179f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 180f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 181f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SectionData* sect_data = pSection.getSectionData(); 182f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::const_iterator frag_iter, frag_end = sect_data->end(); 183f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint8_t* out_offset = pRegion.start(); 184f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (frag_iter = sect_data->begin(); frag_iter != frag_end; ++frag_iter) { 185f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines size_t size = frag_iter->size(); 186f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines switch(frag_iter->getKind()) { 187f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case Fragment::Fillment: { 188f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const FillFragment& fill_frag = 189f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::cast<FillFragment>(*frag_iter); 190f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (0 == fill_frag.getValueSize()) { 191f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // virtual fillment, ignore it. 192f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 193f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 194f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memset(out_offset, fill_frag.getValue(), fill_frag.size()); 195f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 196f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 197f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case Fragment::Region: { 198f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const RegionFragment& region_frag = 199f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::cast<RegionFragment>(*frag_iter); 200f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const uint8_t* start = region_frag.getRegion().start(); 201f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines memcpy(out_offset, start, size); 202f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 203f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 204f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case Fragment::Alignment: { 205f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const AlignFragment& align_frag = llvm::cast<AlignFragment>(*frag_iter); 206f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t count = size / align_frag.getValueSize(); 207f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines switch (align_frag.getValueSize()) { 208f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 1u: 209f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines std::memset(out_offset, align_frag.getValue(), count); 210f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 211f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines default: 212f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::report_fatal_error( 213f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "unsupported value size for align fragment emission yet.\n"); 214f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 215f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } // end switch 216f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 217f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 218f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case Fragment::Null: { 219f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(0x0 == size); 220f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 221f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 222f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines default: 223f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::report_fatal_error("unsupported fragment type.\n"); 224f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 225f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } // end switch 226f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines out_offset += size; 227f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } // end for 228f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 229f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return pRegion.size(); 2306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonGOT& HexagonLDBackend::getGOT() 2336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 2346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pGOT); 2356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pGOT; 2366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst HexagonGOT& HexagonLDBackend::getGOT() const 2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 2406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pGOT); 2416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pGOT; 2426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonPLT& HexagonLDBackend::getPLT() 2456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 2466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pPLT && "PLT section not exist"); 2476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pPLT; 2486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesconst HexagonPLT& HexagonLDBackend::getPLT() const 2516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 2526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(NULL != m_pPLT && "PLT section not exist"); 2536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return *m_pPLT; 2546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 256f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesOutputRelocSection& HexagonLDBackend::getRelaDyn() 257f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 258f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pRelaDyn && ".rela.dyn section not exist"); 259f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pRelaDyn; 260f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 261f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 262f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst OutputRelocSection& HexagonLDBackend::getRelaDyn() const 263f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 264f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pRelaDyn && ".rela.dyn section not exist"); 265f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pRelaDyn; 266f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 267f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 268f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesOutputRelocSection& HexagonLDBackend::getRelaPLT() 269f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 270f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pRelaPLT && ".rela.plt section not exist"); 271f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pRelaPLT; 272f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 273f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 274f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst OutputRelocSection& HexagonLDBackend::getRelaPLT() const 275f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 276f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pRelaPLT && ".rela.plt section not exist"); 277f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pRelaPLT; 278f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 279f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 280f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen HinesHexagonGOTPLT& HexagonLDBackend::getGOTPLT() 281f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 282f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pGOTPLT); 283f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pGOTPLT; 284f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 285f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 286f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesconst HexagonGOTPLT& HexagonLDBackend::getGOTPLT() const 2876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 288f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != m_pGOTPLT); 289f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return *m_pGOTPLT; 2906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 292f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonLDBackend::setRelaDynSize() 2936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 294f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 295f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines file_format->getRelaDyn().setSize 296f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (m_pRelaDyn->numOfRelocs() * getRelaEntrySize()); 2976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 2986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 299f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonLDBackend::setRelaPLTSize() 3006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 301f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 302f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines file_format->getRelaPlt().setSize 303f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (m_pRelaPLT->numOfRelocs() * getRelaEntrySize()); 3046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 3056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 306f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonLDBackend::setGOTSectionSize(IRBuilder& pBuilder) 3076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 308f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .got.plt size 309f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (LinkerConfig::DynObj == config().codeGenType() || 310f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT->hasGOT1() || 311f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines NULL != m_pGOTSymbol) { 312f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT->finalizeSectionSize(); 313f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines defineGOTSymbol(pBuilder, *(m_pGOTPLT->begin())); 314f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 315f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 316f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set .got size 317f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!m_pGOT->empty()) 318f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOT->finalizeSectionSize(); 319f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 320f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 321f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesuint64_t HexagonLDBackend::emitGOTSectionData(MemoryRegion& pRegion) const 322f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 323f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(m_pGOT && "emitGOTSectionData failed, m_pGOT is NULL!"); 324f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 325f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t* buffer = reinterpret_cast<uint32_t*>(pRegion.getBuffer()); 326f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 327f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonGOTEntry* got = 0; 328f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned int EntrySize = HexagonGOTEntry::EntrySize; 329f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t RegionSize = 0; 330f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 331f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (HexagonGOT::iterator it = m_pGOT->begin(), 332f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ie = m_pGOT->end(); it != ie; ++it, ++buffer) { 333f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines got = &(llvm::cast<HexagonGOTEntry>((*it))); 334f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *buffer = static_cast<uint32_t>(got->getValue()); 335f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += EntrySize; 336f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 337f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 338f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return RegionSize; 339f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 340f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 341f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonLDBackend::defineGOTSymbol(IRBuilder& pBuilder, 342f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment& pFrag) 343f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 344f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // define symbol _GLOBAL_OFFSET_TABLE_ 345f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (m_pGOTSymbol != NULL) { 346f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>( 347f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "_GLOBAL_OFFSET_TABLE_", 348f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 349f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 350f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Local, 351f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 352f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 353f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Create(pFrag, 0x0), 354f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 355f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 356f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 357f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 358f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "_GLOBAL_OFFSET_TABLE_", 359f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 360f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 361f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Local, 362f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 363f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 364f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Create(pFrag, 0x0), 365f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 366f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 367f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 368f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 369f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesuint64_t HexagonLDBackend::emitGOTPLTSectionData(MemoryRegion& pRegion, 370f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const ELFFileFormat* FileFormat) const 371f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 372f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(m_pGOTPLT && "emitGOTPLTSectionData failed, m_pGOTPLT is NULL!"); 373f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT->applyGOT0(FileFormat->getDynamic().addr()); 374f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT->applyAllGOTPLT(*m_pPLT); 375f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 376f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t* buffer = reinterpret_cast<uint32_t*>(pRegion.getBuffer()); 377f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 378f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines HexagonGOTEntry* got = 0; 379f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines unsigned int EntrySize = HexagonGOTEntry::EntrySize; 380f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t RegionSize = 0; 381f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 382f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (HexagonGOTPLT::iterator it = m_pGOTPLT->begin(), 383f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ie = m_pGOTPLT->end(); it != ie; ++it, ++buffer) { 384f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines got = &(llvm::cast<HexagonGOTEntry>((*it))); 385f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *buffer = static_cast<uint32_t>(got->getValue()); 386f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RegionSize += EntrySize; 387f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 388f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 389f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return RegionSize; 3906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 3916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 3926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesunsigned int 3936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesHexagonLDBackend::getTargetSectionOrder(const LDSection& pSectHdr) const 3946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 3956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const ELFFileFormat* file_format = getOutputFormat(); 3966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 397f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 398f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSectHdr == &file_format->getGOT()) { 399f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (config().options().hasNow()) 400f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_RELRO; 401f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_RELRO_LAST; 402f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 403f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 404f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSectHdr == &file_format->getGOTPLT()) { 405f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (config().options().hasNow()) 406f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_RELRO; 407f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_NON_RELRO_FIRST; 408f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 409f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 410f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSectHdr == &file_format->getPLT()) 411f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_PLT; 4126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 4136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 414f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSectHdr == m_pstart) 415f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_INIT; 416f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 417f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (&pSectHdr == m_psdata) 418f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return SHO_SMALL_DATA; 4196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 4206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return SHO_UNDEFINED; 4216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 4226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 423f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesvoid HexagonLDBackend::initTargetSections(Module& pModule, 4246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ObjectBuilder& pBuilder) 4256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 426f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 427f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((LinkerConfig::Object != config().codeGenType()) && 428f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (!config().isCodeStatic())) { 4296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 4306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize .got 4316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& got = file_format->getGOT(); 4326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pGOT = new HexagonGOT(got); 4336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 434f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // initialize .got.plt 435f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& gotplt = file_format->getGOTPLT(); 436f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTPLT = new HexagonGOTPLT(gotplt); 437f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 4386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // initialize .plt 4396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& plt = file_format->getPLT(); 4406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines m_pPLT = new HexagonPLT(plt, 441f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *m_pGOTPLT, 4426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines config()); 4436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 444f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // initialize .rela.plt 445f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& relaplt = file_format->getRelaPlt(); 446f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines relaplt.setLink(&plt); 447f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pRelaPLT = new OutputRelocSection(pModule, relaplt); 4486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 449f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // initialize .rela.dyn 450f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& reladyn = file_format->getRelaDyn(); 451f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pRelaDyn = new OutputRelocSection(pModule, reladyn); 4526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 4536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 454f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_psdata = pBuilder.CreateSection(".sdata", 455f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 456f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 457f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 458f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 4*1024); 459f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pscommon_1 = pBuilder.CreateSection(".scommon.1", 460f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 461f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 462f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 463f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1); 464f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder::CreateSectionData(*m_pscommon_1); 465f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 466f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pscommon_2 = pBuilder.CreateSection(".scommon.2", 467f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 468f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 469f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 470f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 2); 471f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder::CreateSectionData(*m_pscommon_2); 472f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 473f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pscommon_4 = pBuilder.CreateSection(".scommon.4", 474f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 475f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 476f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 477f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 4); 478f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder::CreateSectionData(*m_pscommon_4); 479f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 480f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pscommon_8 = pBuilder.CreateSection(".scommon.8", 481f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 482f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 483f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 484f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8); 485f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder::CreateSectionData(*m_pscommon_8); 486f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 487f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pstart = pBuilder.CreateSection(".start", 488f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDFileFormat::Target, 489f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHT_PROGBITS, 490f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE, 491f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 8); 492f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines IRBuilder::CreateSectionData(*m_pstart); 4936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 4946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 4956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonLDBackend::initTargetSymbols(IRBuilder& pBuilder, Module& pModule) 4966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 497f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (config().codeGenType() == LinkerConfig::Object) 498f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return; 499f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 500f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // Define the symbol _GLOBAL_OFFSET_TABLE_ if there is a symbol with the 501f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // same name in input 502f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 503f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "_GLOBAL_OFFSET_TABLE_", 504f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 505f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 506f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Local, 507f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 508f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 509f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Null(), 510f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 511f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_psdabase = 512f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 513f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "_SDA_BASE_", 514f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 515f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 516f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Absolute, 517f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 518f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 519f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Null(), 520f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 521f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 522f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "__sbss_start", 523f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 524f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 525f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Absolute, 526f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 527f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 528f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Null(), 529f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 530f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 531f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines "__sbss_end", 532f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Object, 533f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Define, 534f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Absolute, 535f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // size 536f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // value 537f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines FragmentRef::Null(), 538f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::Hidden); 539f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 540f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 541f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::initTargetStubs() 542f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 543f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != getStubFactory()) { 544f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines getStubFactory()->addPrototype 545f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (new HexagonAbsoluteStub(config().isCodeIndep())); 546f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 547f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 548f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return false; 549f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 550f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 551f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::initBRIslandFactory() 552f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 553f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL == m_pBRIslandFactory) { 554f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pBRIslandFactory = new BranchIslandFactory(maxBranchOffset(), 0); 555f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 556f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 557f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 558f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 559f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::initStubFactory() 560f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 561f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL == m_pStubFactory) { 562f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_pStubFactory = new StubFactory(); 5636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 564f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 565f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 566f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 567f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::doRelax(Module& pModule, IRBuilder& pBuilder, 568f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool& pFinished) 569f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 570f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != getStubFactory() && NULL != getBRIslandFactory()); 571f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool isRelaxed = false; 572f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 573f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // check branch relocs and create the related stubs if needed 574f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Module::obj_iterator input, inEnd = pModule.obj_end(); 575f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (input = pModule.obj_begin(); input != inEnd; ++input) { 576f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDContext::sect_iterator rs, rsEnd = (*input)->context()->relocSectEnd(); 577f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (rs = (*input)->context()->relocSectBegin(); rs != rsEnd; ++rs) { 578f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (LDFileFormat::Ignore == (*rs)->kind() || !(*rs)->hasRelocData()) 579f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 580f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines RelocData::iterator reloc, rEnd = (*rs)->getRelocData()->end(); 581f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (reloc = (*rs)->getRelocData()->begin(); reloc != rEnd; ++reloc) { 582f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines switch (reloc->type()) { 583f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case llvm::ELF::R_HEX_B22_PCREL: 584f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case llvm::ELF::R_HEX_B15_PCREL: 585f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case llvm::ELF::R_HEX_B7_PCREL: 586f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case llvm::ELF::R_HEX_B13_PCREL: 587f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case llvm::ELF::R_HEX_B9_PCREL: { 588f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Relocation* relocation = llvm::cast<Relocation>(reloc); 589f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t sym_value = 0x0; 590f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSymbol* symbol = relocation->symInfo()->outSymbol(); 591f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (symbol->hasFragRef()) { 592f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t value = symbol->fragRef()->getOutputOffset(); 593f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t addr = 594f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines symbol->fragRef()->frag()->getParent()->getSection().addr(); 595f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines sym_value = addr + value; 596f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 597f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Stub* stub = getStubFactory()->create(*relocation, // relocation 598f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines sym_value, //symbol value 599f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pBuilder, 600f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *getBRIslandFactory()); 601f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != stub) { 602f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(NULL != stub->symInfo()); 603f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // increase the size of .symtab and .strtab 604f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& symtab = file_format->getSymTab(); 605f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& strtab = file_format->getStrTab(); 606f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines symtab.setSize(symtab.size() + sizeof(llvm::ELF::Elf32_Sym)); 607f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines strtab.setSize(strtab.size() + stub->symInfo()->nameSize() + 1); 608f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines isRelaxed = true; 609f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 610f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 611f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 612f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 613f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines default: 614f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 615f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 616f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 617f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 618f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 619f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 620f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // find the first fragment w/ invalid offset due to stub insertion 621f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment* invalid = NULL; 622f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFinished = true; 623f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (BranchIslandFactory::iterator island = getBRIslandFactory()->begin(), 624f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines island_end = getBRIslandFactory()->end(); island != island_end; ++island) 625f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines { 626f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((*island).end() == file_format->getText().getSectionData()->end()) 627f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 628f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 629f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment* exit = (*island).end(); 630f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (((*island).offset() + (*island).size()) > exit->getOffset()) { 631f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines invalid = exit; 632f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFinished = false; 633f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 634f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 635f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 636f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 637f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // reset the offset of invalid fragments 638f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines while (NULL != invalid) { 639f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines invalid->setOffset(invalid->getPrevNode()->getOffset() + 640f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines invalid->getPrevNode()->size()); 641f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines invalid = invalid->getNextNode(); 642f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 643f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 644f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // reset the size of .text 645f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (isRelaxed) { 646f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines file_format->getText().setSize( 647f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines file_format->getText().getSectionData()->back().getOffset() + 648f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines file_format->getText().getSectionData()->back().size()); 649f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 650f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return isRelaxed; 6516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 6526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 6536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// finalizeSymbol - finalize the symbol value 6546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesbool HexagonLDBackend::finalizeTargetSymbols() 6556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 656f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (config().codeGenType() == LinkerConfig::Object) 657f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 658f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (m_psdabase) 659f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_psdabase->setValue(m_psdata->addr()); 660f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 661f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ELFSegment *edata = m_ELFSegmentTable.find(llvm::ELF::PT_LOAD, 662f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines llvm::ELF::PF_W, llvm::ELF::PF_X); 663f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != edata) { 664f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != f_pEData && ResolveInfo::ThreadLocal != f_pEData->type()) { 665f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines f_pEData->setValue(edata->vaddr() + edata->filesz()); 666f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 667f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != f_p_EData && ResolveInfo::ThreadLocal != f_p_EData->type()) { 668f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines f_p_EData->setValue(edata->vaddr() + edata->filesz()); 669f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 670f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != f_pBSSStart && 671f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ResolveInfo::ThreadLocal != f_pBSSStart->type()) { 672f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines f_pBSSStart->setValue(edata->vaddr() + edata->filesz()); 673f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 674f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != f_pEnd && ResolveInfo::ThreadLocal != f_pEnd->type()) { 675f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines f_pEnd->setValue(((edata->vaddr() + 676f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines edata->memsz()) + 7) & ~7); 677f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 678f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL != f_p_End && ResolveInfo::ThreadLocal != f_p_End->type()) { 679f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines f_p_End->setValue(((edata->vaddr() + 680f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines edata->memsz()) + 7) & ~7); 681f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 682f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 683f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 684f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 685f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 686f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// merge Input Sections 687f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::mergeSection(Module& pModule, LDSection& pInputSection) 688f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 689f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((pInputSection.flag() & llvm::ELF::SHF_HEX_GPREL) || 690f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (pInputSection.kind() == LDFileFormat::LinkOnce) || 691f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (pInputSection.kind() == LDFileFormat::Target)) { 692f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData *sd = NULL; 693f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (!m_psdata->hasSectionData()) { 694f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines sd = IRBuilder::CreateSectionData(*m_psdata); 695f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines m_psdata->setSectionData(sd); 696f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 697f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines sd = m_psdata->getSectionData(); 698f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MoveSectionDataAndSort(*pInputSection.getSectionData(), *sd); 699f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 700f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 701f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder builder(config(), pModule); 702f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return builder.MergeSection(pInputSection); 703f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 704f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 705f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 706f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 707f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::SetSDataSection() { 708f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData *pTo = (m_psdata->getSectionData()); 709f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 710f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pTo) { 711f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MoveCommonData(*m_pscommon_1->getSectionData(), *pTo); 712f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MoveCommonData(*m_pscommon_2->getSectionData(), *pTo); 713f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MoveCommonData(*m_pscommon_4->getSectionData(), *pTo); 714f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MoveCommonData(*m_pscommon_8->getSectionData(), *pTo); 715f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 716f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType& to_list = pTo->getFragmentList(); 717f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType::iterator fragTo, fragToEnd = to_list.end(); 718f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t offset = 0; 719f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (fragTo = to_list.begin(); fragTo != fragToEnd; ++fragTo) { 720f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fragTo->setOffset(offset); 721f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines offset += fragTo->size(); 722f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 723f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 724f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set up pTo's header 725f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pTo->getSection().setSize(offset); 726f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 727f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType& newlist = pTo->getFragmentList(); 728f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 729f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (fragTo = newlist.begin(), fragToEnd = newlist.end(); 730f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fragTo != fragToEnd; ++fragTo) { 731f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fragTo->setParent(pTo); 732f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 733f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 734f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 735f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 736f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 737f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 738f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// allocateCommonSymbols - allocate common symbols in the corresponding 739f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// sections. This is called at pre-layout stage. 740f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// @refer Google gold linker: common.cc: 214 741f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::allocateCommonSymbols(Module& pModule) 742f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 743f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory& symbol_list = pModule.getSymbolTable(); 744f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 745f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (symbol_list.emptyCommons() && symbol_list.emptyLocals()) { 746f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SetSDataSection(); 747f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 748f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 749f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 750f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines int8_t maxGPSize = config().options().getGPSize(); 751f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 752f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SymbolCategory::iterator com_sym, com_end; 753f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 754f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // get corresponding BSS LDSection 755f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 756f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& bss_sect = file_format->getBSS(); 757f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines LDSection& tbss_sect = file_format->getTBSS(); 758f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 759f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // get or create corresponding BSS SectionData 760f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData* bss_sect_data = NULL; 761f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (bss_sect.hasSectionData()) 762f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bss_sect_data = bss_sect.getSectionData(); 763f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 764f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bss_sect_data = IRBuilder::CreateSectionData(bss_sect); 765f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 766f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData* tbss_sect_data = NULL; 767f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (tbss_sect.hasSectionData()) 768f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines tbss_sect_data = tbss_sect.getSectionData(); 769f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 770f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines tbss_sect_data = IRBuilder::CreateSectionData(tbss_sect); 771f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 772f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // remember original BSS size 773f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t bss_offset = bss_sect.size(); 774f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint64_t tbss_offset = tbss_sect.size(); 775f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 776f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // allocate all local common symbols 777f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines com_end = symbol_list.localEnd(); 778f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 779f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (com_sym = symbol_list.localBegin(); com_sym != com_end; ++com_sym) { 780f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (ResolveInfo::Common == (*com_sym)->desc()) { 781f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // We have to reset the description of the symbol here. When doing 782f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // incremental linking, the output relocatable object may have common 783f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // symbols. Therefore, we can not treat common symbols as normal symbols 784f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // when emitting the regular name pools. We must change the symbols' 785f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // description here. 786f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define); 787f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size()); 788f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 789f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 790f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines switch((*com_sym)->size()) { 791f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 1: 792f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 0) 793f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 794f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 795f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_1->getSectionData()), 796f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 797f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 798f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 2: 799f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 1) 800f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 801f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 802f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_2->getSectionData()), 803f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 804f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 805f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 4: 806f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 3) 807f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 808f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 809f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_4->getSectionData()), 810f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 811f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 812f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 8: 813f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 7) 814f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 815f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 816f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_8->getSectionData()), 817f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 818f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 819f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines default: 820f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 821f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 822f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 823f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (ResolveInfo::ThreadLocal == (*com_sym)->type()) { 824f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // allocate TLS common symbol in tbss section 825f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines tbss_offset += ObjectBuilder::AppendFragment(*frag, 826f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *tbss_sect_data, 827f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 828f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 829f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // FIXME: how to identify small and large common symbols? 830f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 831f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bss_offset += ObjectBuilder::AppendFragment(*frag, 832f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *bss_sect_data, 833f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 834f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 835f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 836f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 837f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 838f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // allocate all global common symbols 839f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines com_end = symbol_list.commonEnd(); 840f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (com_sym = symbol_list.commonBegin(); com_sym != com_end; ++com_sym) { 841f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // We have to reset the description of the symbol here. When doing 842f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // incremental linking, the output relocatable object may have common 843f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // symbols. Therefore, we can not treat common symbols as normal symbols 844f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // when emitting the regular name pools. We must change the symbols' 845f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // description here. 846f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->resolveInfo()->setDesc(ResolveInfo::Define); 847f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment* frag = new FillFragment(0x0, 1, (*com_sym)->size()); 848f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->setFragmentRef(FragmentRef::Create(*frag, 0)); 849f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 850f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines switch((*com_sym)->size()) { 851f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 1: 852f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 0) 853f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 854f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 855f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_1->getSectionData()), 856f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 857f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 858f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 2: 859f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 1) 860f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 861f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 862f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_2->getSectionData()), 863f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 864f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 865f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 4: 866f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 3) 867f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 868f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 869f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_4->getSectionData()), 870f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 871f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 872f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines case 8: 873f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (maxGPSize <= 7) 874f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 875f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, 876f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *(m_pscommon_8->getSectionData()), 877f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 878f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 879f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines default: 880f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 881f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 882f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 883f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (ResolveInfo::ThreadLocal == (*com_sym)->type()) { 884f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // allocate TLS common symbol in tbss section 885f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines tbss_offset += ObjectBuilder::AppendFragment(*frag, 886f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *tbss_sect_data, 887f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 888f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 889f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // FIXME: how to identify small and large common symbols? 890f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 891f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bss_offset += ObjectBuilder::AppendFragment(*frag, 892f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines *bss_sect_data, 893f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (*com_sym)->value()); 894f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 895f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 896f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 897f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bss_sect.setSize(bss_offset); 898f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines tbss_sect.setSize(tbss_offset); 899f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines symbol_list.changeCommonsToGlobal(); 900f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SetSDataSection(); 901f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 902f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 903f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 904f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::MoveCommonData(SectionData &pFrom, SectionData &pTo) 905f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 906f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType& to_list = pTo.getFragmentList(); 907f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType::iterator frag, fragEnd = to_list.end(); 908f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 909f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t pFromFlag = pFrom.getSection().align(); 910f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool found = false; 911f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 912f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType::iterator fragInsert; 913f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 914f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (frag = to_list.begin(); frag != fragEnd; ++frag) { 915f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (frag->getKind() == mcld::Fragment::Alignment) { 916f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fragInsert = frag; 917f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 918f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 919f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((frag->getKind() != mcld::Fragment::Region) && 920f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (frag->getKind() != mcld::Fragment::Fillment)) { 921f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 922f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 923f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t flag = frag->getParent()->getSection().align(); 924f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFromFlag < flag) { 925f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines found = true; 926f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 927f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 928f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 929f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AlignFragment* align = NULL; 930f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFrom.getSection().align() > 1) { 931f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // if the align constraint is larger than 1, append an alignment 932f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines align = new AlignFragment(pFrom.getSection().align(), // alignment 933f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // the filled value 934f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1u, // the size of filled value 935f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFrom.getSection().align() - 1 // max bytes to emit 936f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ); 937f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFrom.getFragmentList().push_front(align); 938f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 939f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (found) 940f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines to_list.splice(fragInsert, pFrom.getFragmentList()); 941f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 942f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines to_list.splice(frag, pFrom.getFragmentList()); 943f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 944f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 945f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 946f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 947f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::readSection(Input& pInput, SectionData& pSD) 948f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 949f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines Fragment* frag = NULL; 950f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t offset = pInput.fileOffset() + pSD.getSection().offset(); 951f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t size = pSD.getSection().size(); 952f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 953f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pSD.getSection().type() == llvm::ELF::SHT_NOBITS) { 954f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag = new FillFragment(0x0, 1, size); 955f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 956f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 957f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines MemoryRegion* region = pInput.memArea()->request(offset, size); 958f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (NULL == region) { 959f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // If the input section's size is zero, we got a NULL region. 960f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // use a virtual fill fragment 961f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag = new FillFragment(0x0, 0, 0); 962f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 963f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else { 964f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag = new RegionFragment(*region); 965f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 966f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 967f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 968f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ObjectBuilder::AppendFragment(*frag, pSD); 969f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return true; 970f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines} 971f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 972f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// MoveSectionData - move the fragments of pTO section data to pTo 973f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool HexagonLDBackend::MoveSectionDataAndSort(SectionData& pFrom, SectionData& pTo) 974f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines{ 975f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines assert(&pFrom != &pTo && "Cannot move section data to itself!"); 976f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType& to_list = pTo.getFragmentList(); 977f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType::iterator frag, fragEnd = to_list.end(); 978f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 979f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t pFromFlag = pFrom.getSection().align(); 980f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool found = false; 981f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 982f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData::FragmentListType::iterator fragInsert; 983f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 984f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (frag = to_list.begin(); frag != fragEnd; ++frag) { 985f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (frag->getKind() == mcld::Fragment::Alignment) { 986f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines fragInsert = frag; 987f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 988f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 989f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if ((frag->getKind() != mcld::Fragment::Region) && 990f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines (frag->getKind() != mcld::Fragment::Fillment)) { 991f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines continue; 992f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 993f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t flag = frag->getParent()->getSection().align(); 994f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFromFlag < flag) { 995f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines found = true; 996f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines break; 997f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 998f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 999f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines AlignFragment* align = NULL; 1000f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFrom.getSection().align() > 1) { 1001f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // if the align constraint is larger than 1, append an alignment 1002f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines align = new AlignFragment(pFrom.getSection().align(), // alignment 1003f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 0x0, // the filled value 1004f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1u, // the size of filled value 1005f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFrom.getSection().align() - 1 // max bytes to emit 1006f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ); 1007f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pFrom.getFragmentList().push_front(align); 1008f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 1009f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (found) 1010f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines to_list.splice(fragInsert, pFrom.getFragmentList()); 1011f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines else 1012f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines to_list.splice(frag, pFrom.getFragmentList()); 1013f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1014f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines uint32_t offset = 0; 1015f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines for (frag = to_list.begin(); frag != fragEnd; ++frag) { 1016f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines frag->setOffset(offset); 1017f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines offset += frag->size(); 1018f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines } 1019f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1020f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // set up pTo's header 1021f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pTo.getSection().setSize(offset); 1022f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1023f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFrom.getSection().align() > pTo.getSection().align()) 1024f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pTo.getSection().setAlign(pFrom.getSection().align()); 1025f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 1026f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines if (pFrom.getSection().flag() > pTo.getSection().flag()) 1027f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines pTo.getSection().setFlag(pFrom.getSection().flag()); 10286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 10296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 10306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 10316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// doCreateProgramHdrs - backend can implement this function to create the 10326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// target-dependent segments 10336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesvoid HexagonLDBackend::doCreateProgramHdrs(Module& pModule) 10346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 10356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // TODO 10366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 10376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 10386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld { 10396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 10406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 1041f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/// createHexagonLDBackend - the help funtion to create corresponding 10426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines/// HexagonLDBackend 10436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesTargetLDBackend* createHexagonLDBackend(const llvm::Target& pTarget, 10446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LinkerConfig& pConfig) 10456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 10466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 10476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(0 && "MachO linker is not supported yet"); 10486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /** 10496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return new HexagonMachOLDBackend(createHexagonMachOArchiveReader, 10506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines createHexagonMachOObjectReader, 10516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines createHexagonMachOObjectWriter); 10526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines **/ 10536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 10546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 10556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines assert(0 && "COFF linker is not supported yet"); 10566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines /** 10576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return new HexagonCOFFLDBackend(createHexagonCOFFArchiveReader, 10586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines createHexagonCOFFObjectReader, 10596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines createHexagonCOFFObjectWriter); 10606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines **/ 10616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 1062f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return new HexagonLDBackend(pConfig, new HexagonGNUInfo(pConfig.targets())); 10636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 10646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 10656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld 10666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 10676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 10686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// Force static initialization. 10696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===// 10706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesextern "C" void MCLDInitializeHexagonLDBackend() { 10716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines // Register the linker backend 1072f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines mcld::TargetRegistry::RegisterTargetLDBackend(TheHexagonTarget, 10736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines createHexagonLDBackend); 10746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 1075