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
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/IRBuilder.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/AlignFragment.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/FillFragment.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/NullFragment.h"
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/RegionFragment.h"
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/Stub.h"
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/BranchIslandFactory.h"
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFFileFormat.h"
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegment.h"
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ELFSegmentFactory.h"
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/LDContext.h"
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/StubFactory.h"
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryRegion.h"
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryArea.h"
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h"
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h"
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFAttribute.h"
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/GNUInfo.h"
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/ObjectBuilder.h"
35551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
36551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Triple.h>
37551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/ADT/Twine.h>
38551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines#include <llvm/Support/Casting.h>
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/Support/ELF.h>
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cstring>
42551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
44551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
45551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
46551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// AArch64GNULDBackend
47551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
48551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::AArch64GNULDBackend(const LinkerConfig& pConfig,
49551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                         GNUInfo* pInfo)
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : GNULDBackend(pConfig, pInfo),
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pRelocator(NULL),
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pGOT(NULL),
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pGOTPLT(NULL),
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pPLT(NULL),
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pRelaDyn(NULL),
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pRelaPLT(NULL),
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pDynamic(NULL),
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pGOTSymbol(NULL) {
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6137b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GNULDBackend::~AArch64GNULDBackend() {
62551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pRelocator != NULL)
63551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    delete m_pRelocator;
64551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pGOT == m_pGOTPLT) {
65551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (m_pGOT != NULL)
66551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      delete m_pGOT;
67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  } else {
68551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (m_pGOT != NULL)
69551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      delete m_pGOT;
70551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (m_pGOTPLT != NULL)
71551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      delete m_pGOTPLT;
72551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
73551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pPLT != NULL)
74551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    delete m_pPLT;
75551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pRelaDyn != NULL)
76551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    delete m_pRelaDyn;
77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pRelaPLT != NULL)
78551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    delete m_pRelaPLT;
79551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pDynamic != NULL)
80551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    delete m_pDynamic;
81551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
82551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
83551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSections(Module& pModule,
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                             ObjectBuilder& pBuilder) {
85551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (LinkerConfig::Object != config().codeGenType()) {
86551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    ELFFileFormat* file_format = getOutputFormat();
87551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
88551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // initialize .got
89551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    LDSection& got = file_format->getGOT();
90551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pGOT = new AArch64GOT(got);
91551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (config().options().hasNow()) {
92551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // when -z now is given, there will be only one .got section (contains
93551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // both GOTPLT and normal GOT entries), create GOT0 for .got section and
94551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // set m_pGOTPLT to the same .got
95551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOT->createGOT0();
96551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT = m_pGOT;
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else {
98551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // Otherwise, got should be seperated to two sections, .got and .got.plt
99551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // initialize .got.plt
100551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      LDSection& gotplt = file_format->getGOTPLT();
101551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT = new AArch64GOT(gotplt);
102551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT->createGOT0();
103551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
104551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
105551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // initialize .plt
106551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    LDSection& plt = file_format->getPLT();
107551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pPLT = new AArch64PLT(plt, *m_pGOTPLT);
108551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
109551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // initialize .rela.plt
110551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    LDSection& relaplt = file_format->getRelaPlt();
111551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    relaplt.setLink(&plt);
112551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pRelaPLT = new OutputRelocSection(pModule, relaplt);
113551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
114551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // initialize .rela.dyn
115551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    LDSection& reladyn = file_format->getRelaDyn();
116551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pRelaDyn = new OutputRelocSection(pModule, reladyn);
117551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
118551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
119551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::initTargetSymbols(IRBuilder& pBuilder,
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                            Module& pModule) {
122551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // Define the symbol _GLOBAL_OFFSET_TABLE_ if there is a symbol with the
123551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // same name in input
124551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (LinkerConfig::Object != config().codeGenType()) {
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_pGOTSymbol =
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        pBuilder.AddSymbol<IRBuilder::AsReferred, IRBuilder::Resolve>(
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines            "_GLOBAL_OFFSET_TABLE_",
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Object,
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Define,
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Local,
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines            0x0,  // size
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines            0x0,  // value
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines            FragmentRef::Null(),
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ResolveInfo::Hidden);
135551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
136551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
137551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::initRelocator() {
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (m_pRelocator == NULL) {
140551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pRelocator = new AArch64Relocator(*this, config());
141551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
142551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
143551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
14537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst Relocator* AArch64GNULDBackend::getRelocator() const {
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelocator != NULL);
1470dea6bc96bb52346737966839ac68644f7939f58Stephen Hines  return m_pRelocator;
1480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines}
1490dea6bc96bb52346737966839ac68644f7939f58Stephen Hines
15037b74a387bb3993387029859c2d9d051c41c724eStephen HinesRelocator* AArch64GNULDBackend::getRelocator() {
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelocator != NULL);
152551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return m_pRelocator;
153551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
15537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::defineGOTSymbol(IRBuilder& pBuilder) {
156551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // define symbol _GLOBAL_OFFSET_TABLE_ when .got create
157551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pGOTSymbol != NULL) {
158551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines        "_GLOBAL_OFFSET_TABLE_",
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Object,
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Define,
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Local,
16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        0x0,  // size
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines        0x0,  // value
16537b74a387bb3993387029859c2d9d051c41c724eStephen Hines        FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0),
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Hidden);
16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  } else {
168551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>(
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines        "_GLOBAL_OFFSET_TABLE_",
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Object,
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Define,
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Local,
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines        0x0,  // size
17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines        0x0,  // value
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines        FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0),
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines        ResolveInfo::Hidden);
177551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
178551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
179551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doPreLayout(IRBuilder& pBuilder) {
181551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // initialize .dynamic data
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (!config().isCodeStatic() && m_pDynamic == NULL)
183551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pDynamic = new AArch64ELFDynamic(*this, config());
184551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
185551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (LinkerConfig::Object != config().codeGenType()) {
186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .got size
187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (config().options().hasNow()) {
188551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // when building shared object, the GOTPLT section is must
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      if (LinkerConfig::DynObj == config().codeGenType() || m_pGOT->hasGOT1() ||
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines          m_pGOTSymbol != NULL) {
191551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOT->finalizeSectionSize();
192551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        defineGOTSymbol(pBuilder);
193551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      }
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    } else {
195551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // when building shared object, the GOTPLT section is must
196551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (LinkerConfig::DynObj == config().codeGenType() ||
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines          m_pGOTPLT->hasGOT1() || m_pGOTSymbol != NULL) {
198551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOTPLT->finalizeSectionSize();
199551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        defineGOTSymbol(pBuilder);
200551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      }
201551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (m_pGOT->hasGOT1())
202551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOT->finalizeSectionSize();
203551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
204551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
205551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .plt size
206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (m_pPLT->hasPLT1())
207551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pPLT->finalizeSectionSize();
208551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
209551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    ELFFileFormat* file_format = getOutputFormat();
210551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .rela.dyn size
211551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (!m_pRelaDyn->empty()) {
21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert(
21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          !config().isCodeStatic() &&
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines          "static linkage should not result in a dynamic relocation section");
21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      file_format->getRelaDyn().setSize(m_pRelaDyn->numOfRelocs() *
21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        getRelaEntrySize());
217551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
218551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
219551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .rela.plt size
220551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (!m_pRelaPLT->empty()) {
22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      assert(
22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines          !config().isCodeStatic() &&
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          "static linkage should not result in a dynamic relocation section");
22437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      file_format->getRelaPlt().setSize(m_pRelaPLT->numOfRelocs() *
22537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        getRelaEntrySize());
226551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
227551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
228551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
229551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
23037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doPostLayout(Module& pModule, IRBuilder& pBuilder) {
23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const ELFFileFormat* file_format = getOutputFormat();
232551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
233551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // apply PLT
234551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT()) {
23537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    assert(m_pPLT != NULL);
236551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pPLT->applyPLT0();
237551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pPLT->applyPLT1();
238551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
239551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
240551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // apply GOTPLT
241551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if ((config().options().hasNow() && file_format->hasGOT()) ||
24237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      file_format->hasGOTPLT()) {
24337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    assert(m_pGOTPLT != NULL);
244551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (LinkerConfig::DynObj == config().codeGenType())
245551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT->applyGOT0(file_format->getDynamic().addr());
246551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    else {
247551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // executable file and object file? should fill with zero.
248551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT->applyGOT0(0);
249551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
250551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
251551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
252551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
25337b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64ELFDynamic& AArch64GNULDBackend::dynamic() {
25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pDynamic != NULL);
255551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pDynamic;
256551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
257551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
25837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64ELFDynamic& AArch64GNULDBackend::dynamic() const {
25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pDynamic != NULL);
260551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pDynamic;
261551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
262551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
263551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesuint64_t AArch64GNULDBackend::emitSectionData(const LDSection& pSection,
26437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                              MemoryRegion& pRegion) const {
265551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(pRegion.size() && "Size of MemoryRegion is zero!");
266551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
267551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const ELFFileFormat* file_format = getOutputFormat();
268551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
269551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT() && (&pSection == &(file_format->getPLT()))) {
270551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pPLT->emit(pRegion);
271551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
272551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
273551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
274551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOT() && (&pSection == &(file_format->getGOT()))) {
275551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pGOT->emit(pRegion);
276551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
277551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
278551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
279551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOTPLT() && (&pSection == &(file_format->getGOTPLT()))) {
280551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pGOT->emit(pRegion);
281551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
282551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
283551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
284551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
285551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return pRegion.size();
286551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
287551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
28837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesunsigned int AArch64GNULDBackend::getTargetSectionOrder(
28937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const LDSection& pSectHdr) const {
290551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const ELFFileFormat* file_format = getOutputFormat();
291551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
292551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOT() && (&pSectHdr == &file_format->getGOT())) {
293551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (config().options().hasNow())
294551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      return SHO_RELRO;
295551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_RELRO_LAST;
296551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
297551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
298551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOTPLT() && (&pSectHdr == &file_format->getGOTPLT()))
299551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_NON_RELRO_FIRST;
300551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
301551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT() && (&pSectHdr == &file_format->getPLT()))
302551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_PLT;
303551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
304551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return SHO_UNDEFINED;
305551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
306551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
307551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::doRelax(Module& pModule,
308551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                  IRBuilder& pBuilder,
30937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  bool& pFinished) {
310551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
311551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return false;
312551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
313551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
31437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::initTargetStubs() {
315551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
316551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
317551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
318551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
31937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid AArch64GNULDBackend::doCreateProgramHdrs(Module& pModule) {
320551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
321551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
322551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
32337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::finalizeTargetSymbols() {
324551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
325551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
326551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
327551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
328551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::mergeSection(Module& pModule,
329551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                       const Input& pInput,
33037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                       LDSection& pSection) {
331551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
332551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
333551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
334551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
33537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool AArch64GNULDBackend::readSection(Input& pInput, SectionData& pSD) {
336551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
337551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
338551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
339551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
34037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GOT& AArch64GNULDBackend::getGOT() {
34137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pGOT != NULL && "GOT section not exist");
342551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOT;
343551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
344551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
34537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOT() const {
34637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pGOT != NULL && "GOT section not exist");
347551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOT;
348551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
349551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
35037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64GOT& AArch64GNULDBackend::getGOTPLT() {
35137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pGOTPLT != NULL && "GOTPLT section not exist");
352551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOTPLT;
353551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
354551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
35537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOTPLT() const {
35637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pGOTPLT != NULL && "GOTPLT section not exist");
357551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOTPLT;
358551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
359551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
36037b74a387bb3993387029859c2d9d051c41c724eStephen HinesAArch64PLT& AArch64GNULDBackend::getPLT() {
36137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pPLT != NULL && "PLT section not exist");
362551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pPLT;
363551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
364551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
36537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst AArch64PLT& AArch64GNULDBackend::getPLT() const {
36637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pPLT != NULL && "PLT section not exist");
367551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pPLT;
368551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
369551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
37037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaDyn() {
37137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelaDyn != NULL && ".rela.dyn section not exist");
372551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaDyn;
373551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
374551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
37537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaDyn() const {
37637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelaDyn != NULL && ".rela.dyn section not exist");
377551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaDyn;
378551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
379551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
38037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaPLT() {
38137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelaPLT != NULL && ".rela.plt section not exist");
382551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaPLT;
383551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
384551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
38537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaPLT() const {
38637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  assert(m_pRelaPLT != NULL && ".rela.plt section not exist");
387551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaPLT;
388551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
389551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
390551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
391551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//  createAArch64LDBackend - the help funtion to create corresponding
392551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//  AArch64LDBackend
393551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
39437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTargetLDBackend* createAArch64LDBackend(const LinkerConfig& pConfig) {
395551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSDarwin()) {
396551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "MachO linker is not supported yet");
397551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    /**
398551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return new AArch64MachOLDBackend(createAArch64MachOArchiveReader,
399551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                     createAArch64MachOObjectReader,
400551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                     createAArch64MachOObjectWriter);
401551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    **/
402551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
403551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSWindows()) {
404551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "COFF linker is not supported yet");
405551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    /**
406551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return new AArch64COFFLDBackend(createAArch64COFFArchiveReader,
407551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                    createAArch64COFFObjectReader,
408551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                    createAArch64COFFObjectWriter);
409551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    **/
410551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
41137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return new AArch64GNULDBackend(
41237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pConfig, new AArch64GNUInfo(pConfig.targets().triple()));
413551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
414551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
41537b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
416551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
417551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
418551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// Force static initialization.
419551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
420551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64LDBackend() {
421551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // Register the linker backend
42237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  mcld::TargetRegistry::RegisterTargetLDBackend(mcld::TheAArch64Target,
42337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                                mcld::createAArch64LDBackend);
424551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
425