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