AArch64LDBackend.cpp revision 533eae20118036f425f27bf0536ef0ccbb090b65
1551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===- AArch64LDBackend.cpp -----------------------------------------------===// 2551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 3551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// The MCLinker Project 4551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 5551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// This file is distributed under the University of Illinois Open Source 6551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// License. See LICENSE.TXT for details. 7551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// 8551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 9551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64.h" 10551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64ELFDynamic.h" 11551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64GNUInfo.h" 12551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64LDBackend.h" 13551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include "AArch64Relocator.h" 14551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 15551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <cstring> 16551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 17551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Triple.h> 18551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Twine.h> 19551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/Support/ELF.h> 20551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/Support/Casting.h> 21551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 22551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/IRBuilder.h> 23551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LinkerConfig.h> 24551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Fragment/FillFragment.h> 25551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Fragment/AlignFragment.h> 26551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Fragment/RegionFragment.h> 27551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Fragment/Stub.h> 28551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Fragment/NullFragment.h> 29551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Support/MemoryRegion.h> 30551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Support/MemoryArea.h> 31551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Support/MsgHandling.h> 32551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Support/TargetRegistry.h> 33551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/BranchIslandFactory.h> 34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/StubFactory.h> 35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/LDContext.h> 36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/ELFFileFormat.h> 37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/ELFSegmentFactory.h> 38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/LD/ELFSegment.h> 39551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Target/ELFAttribute.h> 40551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Target/GNUInfo.h> 41551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <mcld/Object/ObjectBuilder.h> 42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 43551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesusing namespace mcld; 44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64GNULDBackend 47551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::AArch64GNULDBackend(const LinkerConfig& pConfig, 49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines GNUInfo* pInfo) 50551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines : GNULDBackend(pConfig, pInfo), 51551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelocator(NULL), 52551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT(NULL), 53551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT(NULL), 54551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT(NULL), 55551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaDyn(NULL), 56551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaPLT(NULL), 57551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // m_pAttrData(NULL), 58551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pDynamic(NULL), 59533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines m_pGOTSymbol(NULL) 60533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines // m_pAttributes(NULL) 61533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines{ 62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::~AArch64GNULDBackend() 65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelocator != NULL) 67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelocator; 68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT == m_pGOTPLT) { 69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT != NULL) 70551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOT; 71551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } else { 72551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT != NULL) 73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOT; 74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOTPLT != NULL) 75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pGOTPLT; 76551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pPLT != NULL) 78551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pPLT; 79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelaDyn != NULL) 80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelaDyn; 81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pRelaPLT != NULL) 82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pRelaPLT; 83551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pDynamic != NULL) 84551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines delete m_pDynamic; 85551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSections(Module& pModule, 88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ObjectBuilder& pBuilder) 89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 94551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 95551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .got 96551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& got = file_format->getGOT(); 97551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT = new AArch64GOT(got); 98551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) { 99551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when -z now is given, there will be only one .got section (contains 100551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // both GOTPLT and normal GOT entries), create GOT0 for .got section and 101551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set m_pGOTPLT to the same .got 102551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->createGOT0(); 103551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT = m_pGOT; 104551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 105551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines else { 106551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Otherwise, got should be seperated to two sections, .got and .got.plt 107551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .got.plt 108551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& gotplt = file_format->getGOTPLT(); 109551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT = new AArch64GOT(gotplt); 110551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->createGOT0(); 111551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 112551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 113551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .plt 114551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& plt = file_format->getPLT(); 115551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT = new AArch64PLT(plt, *m_pGOTPLT); 116551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 117551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .rela.plt 118551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& relaplt = file_format->getRelaPlt(); 119551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines relaplt.setLink(&plt); 120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaPLT = new OutputRelocSection(pModule, relaplt); 121551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 122551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .rela.dyn 123551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& reladyn = file_format->getRelaDyn(); 124551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaDyn = new OutputRelocSection(pModule, reladyn); 125551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 126551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 127551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 128551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSymbols(IRBuilder& pBuilder, 129551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines Module& pModule) 130551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 131551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Define the symbol _GLOBAL_OFFSET_TABLE_ if there is a symbol with the 132551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // same name in input 133551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 134551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>( 135551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines "_GLOBAL_OFFSET_TABLE_", 136551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Object, 137551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Define, 138551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Local, 139551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // size 140551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // value 141551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines FragmentRef::Null(), 142551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Hidden); 143551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 145551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 146551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 147551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::initRelocator() 148551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 149551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (NULL == m_pRelocator) { 150551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelocator = new AArch64Relocator(*this, config()); 151551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 152551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 153551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 155551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesRelocator* AArch64GNULDBackend::getRelocator() 156551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 157551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pRelocator); 158551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return m_pRelocator; 159551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 160551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 161551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::defineGOTSymbol(IRBuilder& pBuilder) 162551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 163551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // define symbol _GLOBAL_OFFSET_TABLE_ when .got create 164551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOTSymbol != NULL) { 165551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>( 166551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines "_GLOBAL_OFFSET_TABLE_", 167551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Object, 168551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Define, 169551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Local, 170551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // size 171551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // value 172551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0), 173551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Hidden); 174551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 175551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines else { 176551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>( 177551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines "_GLOBAL_OFFSET_TABLE_", 178551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Object, 179551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Define, 180551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Local, 181551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // size 182551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 0x0, // value 183551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0), 184551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ResolveInfo::Hidden); 185551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 188551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doPreLayout(IRBuilder& pBuilder) 189551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 190551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // initialize .dynamic data 191551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!config().isCodeStatic() && NULL == m_pDynamic) 192551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pDynamic = new AArch64ELFDynamic(*this, config()); 193551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 194551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::Object != config().codeGenType()) { 195551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .got size 196551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) { 197551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when building shared object, the GOTPLT section is must 198551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::DynObj == config().codeGenType() || 199551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->hasGOT1() || 200551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines NULL != m_pGOTSymbol) { 201551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->finalizeSectionSize(); 202551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines defineGOTSymbol(pBuilder); 203551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 204551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 205551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines else { 206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // when building shared object, the GOTPLT section is must 207551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::DynObj == config().codeGenType() || 208551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->hasGOT1() || 209551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines NULL != m_pGOTSymbol) { 210551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->finalizeSectionSize(); 211551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines defineGOTSymbol(pBuilder); 212551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 213551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pGOT->hasGOT1()) 214551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOT->finalizeSectionSize(); 215551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 216551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 217551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .plt size 218551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (m_pPLT->hasPLT1()) 219551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->finalizeSectionSize(); 220551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 221551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines ELFFileFormat* file_format = getOutputFormat(); 222551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .rela.dyn size 223551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!m_pRelaDyn->empty()) { 224551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(!config().isCodeStatic() && 225551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines "static linkage should not result in a dynamic relocation section"); 226551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines file_format->getRelaDyn().setSize( 227551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaDyn->numOfRelocs() * getRelaEntrySize()); 228551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 229551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 230551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // set .rela.plt size 231551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (!m_pRelaPLT->empty()) { 232551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(!config().isCodeStatic() && 233551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines "static linkage should not result in a dynamic relocation section"); 234551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines file_format->getRelaPlt().setSize( 235551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pRelaPLT->numOfRelocs() * getRelaEntrySize()); 236551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 237551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 238551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 239551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 240551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doPostLayout(Module& pModule, IRBuilder& pBuilder) 241551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 242551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ELFFileFormat *file_format = getOutputFormat(); 243551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 244551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // apply PLT 245551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT()) { 246551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pPLT); 247551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->applyPLT0(); 248551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pPLT->applyPLT1(); 249551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 250551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 251551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // apply GOTPLT 252551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if ((config().options().hasNow() && file_format->hasGOT()) || 253551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines file_format->hasGOTPLT()) { 254551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pGOTPLT); 255551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (LinkerConfig::DynObj == config().codeGenType()) 256551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->applyGOT0(file_format->getDynamic().addr()); 257551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines else { 258551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // executable file and object file? should fill with zero. 259551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines m_pGOTPLT->applyGOT0(0); 260551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 261551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 262551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 263551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 264551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64ELFDynamic& AArch64GNULDBackend::dynamic() 265551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 266551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pDynamic); 267551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pDynamic; 268551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 269551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 270551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64ELFDynamic& AArch64GNULDBackend::dynamic() const 271551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 272551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pDynamic); 273551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pDynamic; 274551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 275551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 276551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesuint64_t AArch64GNULDBackend::emitSectionData(const LDSection& pSection, 277551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines MemoryRegion& pRegion) const 278551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 279551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(pRegion.size() && "Size of MemoryRegion is zero!"); 280551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 281551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ELFFileFormat* file_format = getOutputFormat(); 282551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 283551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT() && (&pSection == &(file_format->getPLT()))) { 284551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pPLT->emit(pRegion); 285551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 286551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 287551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 288551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOT() && (&pSection == &(file_format->getGOT()))) { 289551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pGOT->emit(pRegion); 290551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 291551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 292551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 293551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOTPLT() && (&pSection == &(file_format->getGOTPLT()))) { 294551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines uint64_t result = m_pGOT->emit(pRegion); 295551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return result; 296551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 297551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 298551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 299551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return pRegion.size(); 300551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 301551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 302551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesunsigned int 303551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::getTargetSectionOrder(const LDSection& pSectHdr) const 304551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 305551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ELFFileFormat* file_format = getOutputFormat(); 306551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 307551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOT() && (&pSectHdr == &file_format->getGOT())) { 308551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (config().options().hasNow()) 309551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_RELRO; 310551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_RELRO_LAST; 311551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 312551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 313551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasGOTPLT() && (&pSectHdr == &file_format->getGOTPLT())) 314551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_NON_RELRO_FIRST; 315551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 316551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (file_format->hasPLT() && (&pSectHdr == &file_format->getPLT())) 317551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_PLT; 318551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 319551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return SHO_UNDEFINED; 320551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 321551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 322551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::doRelax(Module& pModule, 323551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines IRBuilder& pBuilder, 324551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines bool& pFinished) 325551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 326551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 327551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return false; 328551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 329551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 330551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::initTargetStubs() 331551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 332551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 333551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 334551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 335551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 336551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doCreateProgramHdrs(Module& pModule) 337551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 338551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 339551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 340551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 341551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::finalizeTargetSymbols() 342551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 343551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 344551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 345551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 346551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 347551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::mergeSection(Module& pModule, 348551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const Input& pInput, 349551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines LDSection& pSection) 350551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 351551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 352551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 353551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 354551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 355551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::readSection(Input& pInput, SectionData& pSD) 356551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 357551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // TODO 358551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return true; 359551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 360551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 361551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GOT& AArch64GNULDBackend::getGOT() 362551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 363551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pGOT && "GOT section not exist"); 364551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOT; 365551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 366551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 367551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOT() const 368551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 369551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pGOT && "GOT section not exist"); 370551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOT; 371551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 372551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 373551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GOT& AArch64GNULDBackend::getGOTPLT() 374551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 375551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pGOTPLT && "GOTPLT section not exist"); 376551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOTPLT; 377551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 378551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 379551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOTPLT() const 380551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 381551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pGOTPLT && "GOTPLT section not exist"); 382551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pGOTPLT; 383551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 384551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 385551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64PLT& AArch64GNULDBackend::getPLT() 386551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 387551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pPLT && "PLT section not exist"); 388551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pPLT; 389551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 390551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 391551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64PLT& AArch64GNULDBackend::getPLT() const 392551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 393551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pPLT && "PLT section not exist"); 394551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pPLT; 395551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 396551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 397551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaDyn() 398551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 399551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pRelaDyn && ".rela.dyn section not exist"); 400551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaDyn; 401551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 402551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 403551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaDyn() const 404551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 405551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pRelaDyn && ".rela.dyn section not exist"); 406551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaDyn; 407551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 408551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 409551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaPLT() 410551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 411551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pRelaPLT && ".rela.plt section not exist"); 412551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaPLT; 413551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 414551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 415551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaPLT() const 416551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 417551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(NULL != m_pRelaPLT && ".rela.plt section not exist"); 418551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return *m_pRelaPLT; 419551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 420551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 421551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesnamespace mcld { 422551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 423551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 424551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// createAArch64LDBackend - the help funtion to create corresponding 425551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64LDBackend 426551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 427551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesTargetLDBackend* createAArch64LDBackend(const LinkerConfig& pConfig) 428551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{ 429551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSDarwin()) { 430551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "MachO linker is not supported yet"); 431551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /** 432551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return new AArch64MachOLDBackend(createAArch64MachOArchiveReader, 433551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64MachOObjectReader, 434551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64MachOObjectWriter); 435551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines **/ 436551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 437551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines if (pConfig.targets().triple().isOSWindows()) { 438551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines assert(0 && "COFF linker is not supported yet"); 439551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines /** 440551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return new AArch64COFFLDBackend(createAArch64COFFArchiveReader, 441551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64COFFObjectReader, 442551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64COFFObjectWriter); 443551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines **/ 444551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } 445551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines return new AArch64GNULDBackend(pConfig, 446551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines new AArch64GNUInfo(pConfig.targets().triple())); 447551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 448551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 449551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} // namespace of mcld 450551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 451551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 452551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// Force static initialization. 453551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===// 454551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64LDBackend() { 455551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines // Register the linker backend 456551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines mcld::TargetRegistry::RegisterTargetLDBackend(TheAArch64Target, 457551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines createAArch64LDBackend); 458551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} 459551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 460