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
155a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hinesconst Relocator* AArch64GNULDBackend::getRelocator() const
156a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines{
157a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  assert(NULL != m_pRelocator);
158a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines  return m_pRelocator;
159a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines}
160a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines
161551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesRelocator* AArch64GNULDBackend::getRelocator()
162551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
163551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pRelocator);
164551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return m_pRelocator;
165551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
166551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
167551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::defineGOTSymbol(IRBuilder& pBuilder)
168551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
169551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // define symbol _GLOBAL_OFFSET_TABLE_ when .got create
170551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (m_pGOTSymbol != NULL) {
171551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Unresolve>(
172551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     "_GLOBAL_OFFSET_TABLE_",
173551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Object,
174551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Define,
175551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Local,
176551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     0x0, // size
177551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     0x0, // value
178551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0),
179551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Hidden);
180551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
181551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  else {
182551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pGOTSymbol = pBuilder.AddSymbol<IRBuilder::Force, IRBuilder::Resolve>(
183551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     "_GLOBAL_OFFSET_TABLE_",
184551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Object,
185551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Define,
186551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Local,
187551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     0x0, // size
188551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     0x0, // value
189551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     FragmentRef::Create(*(m_pGOTPLT->begin()), 0x0),
190551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                     ResolveInfo::Hidden);
191551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
192551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
193551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
194551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doPreLayout(IRBuilder& pBuilder)
195551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
196551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // initialize .dynamic data
197551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (!config().isCodeStatic() && NULL == m_pDynamic)
198551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pDynamic = new AArch64ELFDynamic(*this, config());
199551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
200551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (LinkerConfig::Object != config().codeGenType()) {
201551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .got size
202551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (config().options().hasNow()) {
203551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // when building shared object, the GOTPLT section is must
204551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (LinkerConfig::DynObj == config().codeGenType() ||
205551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          m_pGOT->hasGOT1() ||
206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          NULL != m_pGOTSymbol) {
207551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOT->finalizeSectionSize();
208551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        defineGOTSymbol(pBuilder);
209551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      }
210551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
211551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    else {
212551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // when building shared object, the GOTPLT section is must
213551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (LinkerConfig::DynObj == config().codeGenType() ||
214551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          m_pGOTPLT->hasGOT1() ||
215551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines          NULL != m_pGOTSymbol) {
216551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOTPLT->finalizeSectionSize();
217551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        defineGOTSymbol(pBuilder);
218551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      }
219551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      if (m_pGOT->hasGOT1())
220551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines        m_pGOT->finalizeSectionSize();
221551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
222551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
223551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .plt size
224551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (m_pPLT->hasPLT1())
225551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pPLT->finalizeSectionSize();
226551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
227551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    ELFFileFormat* file_format = getOutputFormat();
228551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .rela.dyn size
229551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (!m_pRelaDyn->empty()) {
230551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      assert(!config().isCodeStatic() &&
231551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines            "static linkage should not result in a dynamic relocation section");
232551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      file_format->getRelaDyn().setSize(
233551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                m_pRelaDyn->numOfRelocs() * getRelaEntrySize());
234551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
235551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
236551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    // set .rela.plt size
237551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (!m_pRelaPLT->empty()) {
238551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      assert(!config().isCodeStatic() &&
239551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines            "static linkage should not result in a dynamic relocation section");
240551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      file_format->getRelaPlt().setSize(
241551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                m_pRelaPLT->numOfRelocs() * getRelaEntrySize());
242551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
243551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
244551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
245551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
246551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doPostLayout(Module& pModule, IRBuilder& pBuilder)
247551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
248551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const ELFFileFormat *file_format = getOutputFormat();
249551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
250551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // apply PLT
251551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT()) {
252551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(NULL != m_pPLT);
253551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pPLT->applyPLT0();
254551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    m_pPLT->applyPLT1();
255551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
256551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
257551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // apply GOTPLT
258551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if ((config().options().hasNow() && file_format->hasGOT()) ||
259551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines       file_format->hasGOTPLT()) {
260551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(NULL != m_pGOTPLT);
261551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (LinkerConfig::DynObj == config().codeGenType())
262551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT->applyGOT0(file_format->getDynamic().addr());
263551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    else {
264551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      // executable file and object file? should fill with zero.
265551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      m_pGOTPLT->applyGOT0(0);
266551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    }
267551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
268551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
269551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
270551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64ELFDynamic& AArch64GNULDBackend::dynamic()
271551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
272551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pDynamic);
273551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pDynamic;
274551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
275551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
276551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64ELFDynamic& AArch64GNULDBackend::dynamic() const
277551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
278551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pDynamic);
279551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pDynamic;
280551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
281551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
282551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesuint64_t AArch64GNULDBackend::emitSectionData(const LDSection& pSection,
283551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                              MemoryRegion& pRegion) const
284551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
285551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(pRegion.size() && "Size of MemoryRegion is zero!");
286551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
287551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const ELFFileFormat* file_format = getOutputFormat();
288551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
289551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT() && (&pSection == &(file_format->getPLT()))) {
290551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pPLT->emit(pRegion);
291551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
292551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
293551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
294551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOT() && (&pSection == &(file_format->getGOT()))) {
295551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pGOT->emit(pRegion);
296551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
297551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
298551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
299551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOTPLT() && (&pSection == &(file_format->getGOTPLT()))) {
300551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    uint64_t result = m_pGOT->emit(pRegion);
301551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return result;
302551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
303551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
304551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
305551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return pRegion.size();
306551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
307551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
308551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesunsigned int
309551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GNULDBackend::getTargetSectionOrder(const LDSection& pSectHdr) const
310551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
311551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  const ELFFileFormat* file_format = getOutputFormat();
312551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
313551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOT() && (&pSectHdr == &file_format->getGOT())) {
314551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    if (config().options().hasNow())
315551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines      return SHO_RELRO;
316551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_RELRO_LAST;
317551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
318551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
319551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasGOTPLT() && (&pSectHdr == &file_format->getGOTPLT()))
320551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_NON_RELRO_FIRST;
321551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
322551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (file_format->hasPLT() && (&pSectHdr == &file_format->getPLT()))
323551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return SHO_PLT;
324551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
325551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return SHO_UNDEFINED;
326551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
327551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
328551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::doRelax(Module& pModule,
329551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                  IRBuilder& pBuilder,
330551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                  bool& pFinished)
331551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
332551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
333551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return false;
334551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
335551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
336551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::initTargetStubs()
337551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
338551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
339551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
340551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
341551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
342551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesvoid AArch64GNULDBackend::doCreateProgramHdrs(Module& pModule)
343551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
344551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
345551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
346551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
347551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::finalizeTargetSymbols()
348551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
349551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
350551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
351551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
352551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
353551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::mergeSection(Module& pModule,
354551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                       const Input& pInput,
355551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                       LDSection& pSection)
356551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
357551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
358551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
359551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
360551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
361551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesbool AArch64GNULDBackend::readSection(Input& pInput, SectionData& pSD)
362551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
363551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // TODO
364551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return true;
365551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
366551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
367551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GOT& AArch64GNULDBackend::getGOT()
368551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
369551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pGOT && "GOT section not exist");
370551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOT;
371551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
372551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
373551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOT() const
374551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
375551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pGOT && "GOT section not exist");
376551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOT;
377551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
378551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
379551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64GOT& AArch64GNULDBackend::getGOTPLT()
380551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
381551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pGOTPLT && "GOTPLT section not exist");
382551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOTPLT;
383551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
384551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
385551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64GOT& AArch64GNULDBackend::getGOTPLT() const
386551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
387551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pGOTPLT && "GOTPLT section not exist");
388551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pGOTPLT;
389551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
390551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
391551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesAArch64PLT& AArch64GNULDBackend::getPLT()
392551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
393551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pPLT && "PLT section not exist");
394551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pPLT;
395551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
396551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
397551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst AArch64PLT& AArch64GNULDBackend::getPLT() const
398551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
399551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pPLT && "PLT section not exist");
400551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pPLT;
401551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
402551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
403551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaDyn()
404551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
405551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pRelaDyn && ".rela.dyn section not exist");
406551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaDyn;
407551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
408551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
409551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaDyn() const
410551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
411551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pRelaDyn && ".rela.dyn section not exist");
412551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaDyn;
413551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
414551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
415551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesOutputRelocSection& AArch64GNULDBackend::getRelaPLT()
416551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
417551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pRelaPLT && ".rela.plt section not exist");
418551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaPLT;
419551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
420551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
421551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesconst OutputRelocSection& AArch64GNULDBackend::getRelaPLT() const
422551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
423551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  assert(NULL != m_pRelaPLT && ".rela.plt section not exist");
424551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return *m_pRelaPLT;
425551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
426551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
427551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesnamespace mcld {
428551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
429551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
430551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//  createAArch64LDBackend - the help funtion to create corresponding
431551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//  AArch64LDBackend
432551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
433551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen HinesTargetLDBackend* createAArch64LDBackend(const LinkerConfig& pConfig)
434551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines{
435551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSDarwin()) {
436551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "MachO linker is not supported yet");
437551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    /**
438551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return new AArch64MachOLDBackend(createAArch64MachOArchiveReader,
439551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                     createAArch64MachOObjectReader,
440551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                     createAArch64MachOObjectWriter);
441551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    **/
442551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
443551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  if (pConfig.targets().triple().isOSWindows()) {
444551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    assert(0 && "COFF linker is not supported yet");
445551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    /**
446551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    return new AArch64COFFLDBackend(createAArch64COFFArchiveReader,
447551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                    createAArch64COFFObjectReader,
448551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                    createAArch64COFFObjectWriter);
449551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    **/
450551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  }
451551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  return new AArch64GNULDBackend(pConfig,
452551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines     new AArch64GNUInfo(pConfig.targets().triple()));
453551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
454551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
455551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines} // namespace of mcld
456551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
457551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
458551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines// Force static initialization.
459551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines//===----------------------------------------------------------------------===//
460551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hinesextern "C" void MCLDInitializeAArch64LDBackend() {
461551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  // Register the linker backend
462551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  mcld::TargetRegistry::RegisterTargetLDBackend(TheAArch64Target,
463551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                                createAArch64LDBackend);
464551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines}
465551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
466