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