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