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