ELF_aarch64.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. //===----- ELF_aarch64.cpp - JIT linker implementation for ELF/aarch64 ----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // ELF/aarch64 jit-link implementation.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "llvm/ExecutionEngine/JITLink/ELF_aarch64.h"
  13. #include "EHFrameSupportImpl.h"
  14. #include "ELFLinkGraphBuilder.h"
  15. #include "JITLinkGeneric.h"
  16. #include "llvm/BinaryFormat/ELF.h"
  17. #include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
  18. #include "llvm/ExecutionEngine/JITLink/aarch64.h"
  19. #include "llvm/Object/ELFObjectFile.h"
  20. #include "llvm/Support/Endian.h"
  21. #define DEBUG_TYPE "jitlink"
  22. using namespace llvm;
  23. using namespace llvm::jitlink;
  24. namespace {
  25. class ELFJITLinker_aarch64 : public JITLinker<ELFJITLinker_aarch64> {
  26. friend class JITLinker<ELFJITLinker_aarch64>;
  27. public:
  28. ELFJITLinker_aarch64(std::unique_ptr<JITLinkContext> Ctx,
  29. std::unique_ptr<LinkGraph> G,
  30. PassConfiguration PassConfig)
  31. : JITLinker(std::move(Ctx), std::move(G), std::move(PassConfig)) {}
  32. private:
  33. Error applyFixup(LinkGraph &G, Block &B, const Edge &E) const {
  34. return aarch64::applyFixup(G, B, E);
  35. }
  36. };
  37. template <typename ELFT>
  38. class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
  39. private:
  40. enum ELFAArch64RelocationKind : Edge::Kind {
  41. ELFCall26 = Edge::FirstRelocation,
  42. ELFAdrPage21,
  43. ELFAddAbs12,
  44. ELFLdSt8Abs12,
  45. ELFLdSt16Abs12,
  46. ELFLdSt32Abs12,
  47. ELFLdSt64Abs12,
  48. ELFLdSt128Abs12,
  49. ELFMovwAbsG0,
  50. ELFMovwAbsG1,
  51. ELFMovwAbsG2,
  52. ELFMovwAbsG3,
  53. ELFAbs64,
  54. ELFPrel32,
  55. ELFPrel64,
  56. ELFAdrGOTPage21,
  57. ELFLd64GOTLo12,
  58. ELFTLSDescAdrPage21,
  59. ELFTLSDescAddLo12,
  60. ELFTLSDescLd64Lo12,
  61. ELFTLSDescCall,
  62. };
  63. static Expected<ELFAArch64RelocationKind>
  64. getRelocationKind(const uint32_t Type) {
  65. using namespace aarch64;
  66. switch (Type) {
  67. case ELF::R_AARCH64_CALL26:
  68. case ELF::R_AARCH64_JUMP26:
  69. return ELFCall26;
  70. case ELF::R_AARCH64_ADR_PREL_PG_HI21:
  71. return ELFAdrPage21;
  72. case ELF::R_AARCH64_ADD_ABS_LO12_NC:
  73. return ELFAddAbs12;
  74. case ELF::R_AARCH64_LDST8_ABS_LO12_NC:
  75. return ELFLdSt8Abs12;
  76. case ELF::R_AARCH64_LDST16_ABS_LO12_NC:
  77. return ELFLdSt16Abs12;
  78. case ELF::R_AARCH64_LDST32_ABS_LO12_NC:
  79. return ELFLdSt32Abs12;
  80. case ELF::R_AARCH64_LDST64_ABS_LO12_NC:
  81. return ELFLdSt64Abs12;
  82. case ELF::R_AARCH64_LDST128_ABS_LO12_NC:
  83. return ELFLdSt128Abs12;
  84. case ELF::R_AARCH64_MOVW_UABS_G0_NC:
  85. return ELFMovwAbsG0;
  86. case ELF::R_AARCH64_MOVW_UABS_G1_NC:
  87. return ELFMovwAbsG1;
  88. case ELF::R_AARCH64_MOVW_UABS_G2_NC:
  89. return ELFMovwAbsG2;
  90. case ELF::R_AARCH64_MOVW_UABS_G3:
  91. return ELFMovwAbsG3;
  92. case ELF::R_AARCH64_ABS64:
  93. return ELFAbs64;
  94. case ELF::R_AARCH64_PREL32:
  95. return ELFPrel32;
  96. case ELF::R_AARCH64_PREL64:
  97. return ELFPrel64;
  98. case ELF::R_AARCH64_ADR_GOT_PAGE:
  99. return ELFAdrGOTPage21;
  100. case ELF::R_AARCH64_LD64_GOT_LO12_NC:
  101. return ELFLd64GOTLo12;
  102. case ELF::R_AARCH64_TLSDESC_ADR_PAGE21:
  103. return ELFTLSDescAdrPage21;
  104. case ELF::R_AARCH64_TLSDESC_ADD_LO12:
  105. return ELFTLSDescAddLo12;
  106. case ELF::R_AARCH64_TLSDESC_LD64_LO12:
  107. return ELFTLSDescLd64Lo12;
  108. case ELF::R_AARCH64_TLSDESC_CALL:
  109. return ELFTLSDescCall;
  110. }
  111. return make_error<JITLinkError>(
  112. "Unsupported aarch64 relocation:" + formatv("{0:d}: ", Type) +
  113. object::getELFRelocationTypeName(ELF::EM_AARCH64, Type));
  114. }
  115. Error addRelocations() override {
  116. LLVM_DEBUG(dbgs() << "Processing relocations:\n");
  117. using Base = ELFLinkGraphBuilder<ELFT>;
  118. using Self = ELFLinkGraphBuilder_aarch64<ELFT>;
  119. for (const auto &RelSect : Base::Sections)
  120. if (Error Err = Base::forEachRelaRelocation(RelSect, this,
  121. &Self::addSingleRelocation))
  122. return Err;
  123. return Error::success();
  124. }
  125. Error addSingleRelocation(const typename ELFT::Rela &Rel,
  126. const typename ELFT::Shdr &FixupSect,
  127. Block &BlockToFix) {
  128. using support::ulittle32_t;
  129. using Base = ELFLinkGraphBuilder<ELFT>;
  130. uint32_t SymbolIndex = Rel.getSymbol(false);
  131. auto ObjSymbol = Base::Obj.getRelocationSymbol(Rel, Base::SymTabSec);
  132. if (!ObjSymbol)
  133. return ObjSymbol.takeError();
  134. Symbol *GraphSymbol = Base::getGraphSymbol(SymbolIndex);
  135. if (!GraphSymbol)
  136. return make_error<StringError>(
  137. formatv("Could not find symbol at given index, did you add it to "
  138. "JITSymbolTable? index: {0}, shndx: {1} Size of table: {2}",
  139. SymbolIndex, (*ObjSymbol)->st_shndx,
  140. Base::GraphSymbols.size()),
  141. inconvertibleErrorCode());
  142. uint32_t Type = Rel.getType(false);
  143. Expected<ELFAArch64RelocationKind> RelocKind = getRelocationKind(Type);
  144. if (!RelocKind)
  145. return RelocKind.takeError();
  146. int64_t Addend = Rel.r_addend;
  147. orc::ExecutorAddr FixupAddress =
  148. orc::ExecutorAddr(FixupSect.sh_addr) + Rel.r_offset;
  149. Edge::OffsetT Offset = FixupAddress - BlockToFix.getAddress();
  150. // Get a pointer to the fixup content.
  151. const void *FixupContent = BlockToFix.getContent().data() +
  152. (FixupAddress - BlockToFix.getAddress());
  153. Edge::Kind Kind = Edge::Invalid;
  154. switch (*RelocKind) {
  155. case ELFCall26: {
  156. Kind = aarch64::Branch26PCRel;
  157. break;
  158. }
  159. case ELFAdrPage21: {
  160. Kind = aarch64::Page21;
  161. break;
  162. }
  163. case ELFAddAbs12: {
  164. Kind = aarch64::PageOffset12;
  165. break;
  166. }
  167. case ELFLdSt8Abs12: {
  168. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  169. if (!aarch64::isLoadStoreImm12(Instr) ||
  170. aarch64::getPageOffset12Shift(Instr) != 0)
  171. return make_error<JITLinkError>(
  172. "R_AARCH64_LDST8_ABS_LO12_NC target is not a "
  173. "LDRB/STRB (imm12) instruction");
  174. Kind = aarch64::PageOffset12;
  175. break;
  176. }
  177. case ELFLdSt16Abs12: {
  178. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  179. if (!aarch64::isLoadStoreImm12(Instr) ||
  180. aarch64::getPageOffset12Shift(Instr) != 1)
  181. return make_error<JITLinkError>(
  182. "R_AARCH64_LDST16_ABS_LO12_NC target is not a "
  183. "LDRH/STRH (imm12) instruction");
  184. Kind = aarch64::PageOffset12;
  185. break;
  186. }
  187. case ELFLdSt32Abs12: {
  188. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  189. if (!aarch64::isLoadStoreImm12(Instr) ||
  190. aarch64::getPageOffset12Shift(Instr) != 2)
  191. return make_error<JITLinkError>(
  192. "R_AARCH64_LDST32_ABS_LO12_NC target is not a "
  193. "LDR/STR (imm12, 32 bit) instruction");
  194. Kind = aarch64::PageOffset12;
  195. break;
  196. }
  197. case ELFLdSt64Abs12: {
  198. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  199. if (!aarch64::isLoadStoreImm12(Instr) ||
  200. aarch64::getPageOffset12Shift(Instr) != 3)
  201. return make_error<JITLinkError>(
  202. "R_AARCH64_LDST64_ABS_LO12_NC target is not a "
  203. "LDR/STR (imm12, 64 bit) instruction");
  204. Kind = aarch64::PageOffset12;
  205. break;
  206. }
  207. case ELFLdSt128Abs12: {
  208. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  209. if (!aarch64::isLoadStoreImm12(Instr) ||
  210. aarch64::getPageOffset12Shift(Instr) != 4)
  211. return make_error<JITLinkError>(
  212. "R_AARCH64_LDST128_ABS_LO12_NC target is not a "
  213. "LDR/STR (imm12, 128 bit) instruction");
  214. Kind = aarch64::PageOffset12;
  215. break;
  216. }
  217. case ELFMovwAbsG0: {
  218. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  219. if (!aarch64::isMoveWideImm16(Instr) ||
  220. aarch64::getMoveWide16Shift(Instr) != 0)
  221. return make_error<JITLinkError>(
  222. "R_AARCH64_MOVW_UABS_G0_NC target is not a "
  223. "MOVK/MOVZ (imm16, LSL #0) instruction");
  224. Kind = aarch64::MoveWide16;
  225. break;
  226. }
  227. case ELFMovwAbsG1: {
  228. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  229. if (!aarch64::isMoveWideImm16(Instr) ||
  230. aarch64::getMoveWide16Shift(Instr) != 16)
  231. return make_error<JITLinkError>(
  232. "R_AARCH64_MOVW_UABS_G1_NC target is not a "
  233. "MOVK/MOVZ (imm16, LSL #16) instruction");
  234. Kind = aarch64::MoveWide16;
  235. break;
  236. }
  237. case ELFMovwAbsG2: {
  238. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  239. if (!aarch64::isMoveWideImm16(Instr) ||
  240. aarch64::getMoveWide16Shift(Instr) != 32)
  241. return make_error<JITLinkError>(
  242. "R_AARCH64_MOVW_UABS_G2_NC target is not a "
  243. "MOVK/MOVZ (imm16, LSL #32) instruction");
  244. Kind = aarch64::MoveWide16;
  245. break;
  246. }
  247. case ELFMovwAbsG3: {
  248. uint32_t Instr = *(const ulittle32_t *)FixupContent;
  249. if (!aarch64::isMoveWideImm16(Instr) ||
  250. aarch64::getMoveWide16Shift(Instr) != 48)
  251. return make_error<JITLinkError>(
  252. "R_AARCH64_MOVW_UABS_G3 target is not a "
  253. "MOVK/MOVZ (imm16, LSL #48) instruction");
  254. Kind = aarch64::MoveWide16;
  255. break;
  256. }
  257. case ELFAbs64: {
  258. Kind = aarch64::Pointer64;
  259. break;
  260. }
  261. case ELFPrel32: {
  262. Kind = aarch64::Delta32;
  263. break;
  264. }
  265. case ELFPrel64: {
  266. Kind = aarch64::Delta64;
  267. break;
  268. }
  269. case ELFAdrGOTPage21: {
  270. Kind = aarch64::RequestGOTAndTransformToPage21;
  271. break;
  272. }
  273. case ELFLd64GOTLo12: {
  274. Kind = aarch64::RequestGOTAndTransformToPageOffset12;
  275. break;
  276. }
  277. case ELFTLSDescAdrPage21: {
  278. Kind = aarch64::RequestTLSDescEntryAndTransformToPage21;
  279. break;
  280. }
  281. case ELFTLSDescAddLo12:
  282. case ELFTLSDescLd64Lo12: {
  283. Kind = aarch64::RequestTLSDescEntryAndTransformToPageOffset12;
  284. break;
  285. }
  286. case ELFTLSDescCall: {
  287. return Error::success();
  288. }
  289. };
  290. Edge GE(Kind, Offset, *GraphSymbol, Addend);
  291. LLVM_DEBUG({
  292. dbgs() << " ";
  293. printEdge(dbgs(), BlockToFix, GE, aarch64::getEdgeKindName(Kind));
  294. dbgs() << "\n";
  295. });
  296. BlockToFix.addEdge(std::move(GE));
  297. return Error::success();
  298. }
  299. /// Return the string name of the given ELF aarch64 edge kind.
  300. const char *getELFAArch64RelocationKindName(Edge::Kind R) {
  301. switch (R) {
  302. case ELFCall26:
  303. return "ELFCall26";
  304. case ELFAdrPage21:
  305. return "ELFAdrPage21";
  306. case ELFAddAbs12:
  307. return "ELFAddAbs12";
  308. case ELFLdSt8Abs12:
  309. return "ELFLdSt8Abs12";
  310. case ELFLdSt16Abs12:
  311. return "ELFLdSt16Abs12";
  312. case ELFLdSt32Abs12:
  313. return "ELFLdSt32Abs12";
  314. case ELFLdSt64Abs12:
  315. return "ELFLdSt64Abs12";
  316. case ELFLdSt128Abs12:
  317. return "ELFLdSt128Abs12";
  318. case ELFMovwAbsG0:
  319. return "ELFMovwAbsG0";
  320. case ELFMovwAbsG1:
  321. return "ELFMovwAbsG1";
  322. case ELFMovwAbsG2:
  323. return "ELFMovwAbsG2";
  324. case ELFMovwAbsG3:
  325. return "ELFMovwAbsG3";
  326. case ELFAbs64:
  327. return "ELFAbs64";
  328. case ELFPrel32:
  329. return "ELFPrel32";
  330. case ELFPrel64:
  331. return "ELFPrel64";
  332. case ELFAdrGOTPage21:
  333. return "ELFAdrGOTPage21";
  334. case ELFLd64GOTLo12:
  335. return "ELFLd64GOTLo12";
  336. case ELFTLSDescAdrPage21:
  337. return "ELFTLSDescAdrPage21";
  338. case ELFTLSDescAddLo12:
  339. return "ELFTLSDescAddLo12";
  340. case ELFTLSDescLd64Lo12:
  341. return "ELFTLSDescLd64Lo12";
  342. case ELFTLSDescCall:
  343. return "ELFTLSDescCall";
  344. default:
  345. return getGenericEdgeKindName(static_cast<Edge::Kind>(R));
  346. }
  347. }
  348. public:
  349. ELFLinkGraphBuilder_aarch64(StringRef FileName,
  350. const object::ELFFile<ELFT> &Obj, const Triple T)
  351. : ELFLinkGraphBuilder<ELFT>(Obj, std::move(T), FileName,
  352. aarch64::getEdgeKindName) {}
  353. };
  354. // TLS Info Builder.
  355. class TLSInfoTableManager_ELF_aarch64
  356. : public TableManager<TLSInfoTableManager_ELF_aarch64> {
  357. public:
  358. static StringRef getSectionName() { return "$__TLSINFO"; }
  359. static const uint8_t TLSInfoEntryContent[16];
  360. bool visitEdge(LinkGraph &G, Block *B, Edge &E) { return false; }
  361. Symbol &createEntry(LinkGraph &G, Symbol &Target) {
  362. // the TLS Info entry's key value will be written by the fixTLVSectionByName
  363. // pass, so create mutable content.
  364. auto &TLSInfoEntry = G.createMutableContentBlock(
  365. getTLSInfoSection(G), G.allocateContent(getTLSInfoEntryContent()),
  366. orc::ExecutorAddr(), 8, 0);
  367. TLSInfoEntry.addEdge(aarch64::Pointer64, 8, Target, 0);
  368. return G.addAnonymousSymbol(TLSInfoEntry, 0, 16, false, false);
  369. }
  370. private:
  371. Section &getTLSInfoSection(LinkGraph &G) {
  372. if (!TLSInfoTable)
  373. TLSInfoTable = &G.createSection(getSectionName(), orc::MemProt::Read);
  374. return *TLSInfoTable;
  375. }
  376. ArrayRef<char> getTLSInfoEntryContent() const {
  377. return {reinterpret_cast<const char *>(TLSInfoEntryContent),
  378. sizeof(TLSInfoEntryContent)};
  379. }
  380. Section *TLSInfoTable = nullptr;
  381. };
  382. const uint8_t TLSInfoTableManager_ELF_aarch64::TLSInfoEntryContent[16] = {
  383. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*pthread key */
  384. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*data address*/
  385. };
  386. // TLS Descriptor Builder.
  387. class TLSDescTableManager_ELF_aarch64
  388. : public TableManager<TLSDescTableManager_ELF_aarch64> {
  389. public:
  390. TLSDescTableManager_ELF_aarch64(
  391. TLSInfoTableManager_ELF_aarch64 &TLSInfoTableManager)
  392. : TLSInfoTableManager(TLSInfoTableManager) {}
  393. static StringRef getSectionName() { return "$__TLSDESC"; }
  394. static const uint8_t TLSDescEntryContent[16];
  395. bool visitEdge(LinkGraph &G, Block *B, Edge &E) {
  396. Edge::Kind KindToSet = Edge::Invalid;
  397. switch (E.getKind()) {
  398. case aarch64::RequestTLSDescEntryAndTransformToPage21: {
  399. KindToSet = aarch64::Page21;
  400. break;
  401. }
  402. case aarch64::RequestTLSDescEntryAndTransformToPageOffset12: {
  403. KindToSet = aarch64::PageOffset12;
  404. break;
  405. }
  406. default:
  407. return false;
  408. }
  409. assert(KindToSet != Edge::Invalid &&
  410. "Fell through switch, but no new kind to set");
  411. DEBUG_WITH_TYPE("jitlink", {
  412. dbgs() << " Fixing " << G.getEdgeKindName(E.getKind()) << " edge at "
  413. << B->getFixupAddress(E) << " (" << B->getAddress() << " + "
  414. << formatv("{0:x}", E.getOffset()) << ")\n";
  415. });
  416. E.setKind(KindToSet);
  417. E.setTarget(getEntryForTarget(G, E.getTarget()));
  418. return true;
  419. }
  420. Symbol &createEntry(LinkGraph &G, Symbol &Target) {
  421. auto &EntryBlock =
  422. G.createContentBlock(getTLSDescSection(G), getTLSDescBlockContent(),
  423. orc::ExecutorAddr(), 8, 0);
  424. EntryBlock.addEdge(aarch64::Pointer64, 0, getTLSDescResolver(G), 0);
  425. EntryBlock.addEdge(aarch64::Pointer64, 8,
  426. TLSInfoTableManager.getEntryForTarget(G, Target), 0);
  427. return G.addAnonymousSymbol(EntryBlock, 0, 8, false, false);
  428. }
  429. private:
  430. Section &getTLSDescSection(LinkGraph &G) {
  431. if (!GOTSection)
  432. GOTSection = &G.createSection(getSectionName(), orc::MemProt::Read);
  433. return *GOTSection;
  434. }
  435. Symbol &getTLSDescResolver(LinkGraph &G) {
  436. if (!TLSDescResolver)
  437. TLSDescResolver = &G.addExternalSymbol("__tlsdesc_resolver", 8, false);
  438. return *TLSDescResolver;
  439. }
  440. ArrayRef<char> getTLSDescBlockContent() {
  441. return {reinterpret_cast<const char *>(TLSDescEntryContent),
  442. sizeof(TLSDescEntryContent)};
  443. }
  444. Section *GOTSection = nullptr;
  445. Symbol *TLSDescResolver = nullptr;
  446. TLSInfoTableManager_ELF_aarch64 &TLSInfoTableManager;
  447. };
  448. const uint8_t TLSDescTableManager_ELF_aarch64::TLSDescEntryContent[16] = {
  449. 0x00, 0x00, 0x00, 0x00,
  450. 0x00, 0x00, 0x00, 0x00, /*resolver function pointer*/
  451. 0x00, 0x00, 0x00, 0x00,
  452. 0x00, 0x00, 0x00, 0x00 /*pointer to tls info*/
  453. };
  454. Error buildTables_ELF_aarch64(LinkGraph &G) {
  455. LLVM_DEBUG(dbgs() << "Visiting edges in graph:\n");
  456. aarch64::GOTTableManager GOT;
  457. aarch64::PLTTableManager PLT(GOT);
  458. TLSInfoTableManager_ELF_aarch64 TLSInfo;
  459. TLSDescTableManager_ELF_aarch64 TLSDesc(TLSInfo);
  460. visitExistingEdges(G, GOT, PLT, TLSDesc, TLSInfo);
  461. return Error::success();
  462. }
  463. } // namespace
  464. namespace llvm {
  465. namespace jitlink {
  466. Expected<std::unique_ptr<LinkGraph>>
  467. createLinkGraphFromELFObject_aarch64(MemoryBufferRef ObjectBuffer) {
  468. LLVM_DEBUG({
  469. dbgs() << "Building jitlink graph for new input "
  470. << ObjectBuffer.getBufferIdentifier() << "...\n";
  471. });
  472. auto ELFObj = object::ObjectFile::createELFObjectFile(ObjectBuffer);
  473. if (!ELFObj)
  474. return ELFObj.takeError();
  475. assert((*ELFObj)->getArch() == Triple::aarch64 &&
  476. "Only AArch64 (little endian) is supported for now");
  477. auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj);
  478. return ELFLinkGraphBuilder_aarch64<object::ELF64LE>((*ELFObj)->getFileName(),
  479. ELFObjFile.getELFFile(),
  480. (*ELFObj)->makeTriple())
  481. .buildGraph();
  482. }
  483. void link_ELF_aarch64(std::unique_ptr<LinkGraph> G,
  484. std::unique_ptr<JITLinkContext> Ctx) {
  485. PassConfiguration Config;
  486. const Triple &TT = G->getTargetTriple();
  487. if (Ctx->shouldAddDefaultTargetPasses(TT)) {
  488. // Add eh-frame passses.
  489. Config.PrePrunePasses.push_back(DWARFRecordSectionSplitter(".eh_frame"));
  490. Config.PrePrunePasses.push_back(EHFrameEdgeFixer(
  491. ".eh_frame", 8, aarch64::Pointer32, aarch64::Pointer64,
  492. aarch64::Delta32, aarch64::Delta64, aarch64::NegDelta32));
  493. // Add a mark-live pass.
  494. if (auto MarkLive = Ctx->getMarkLivePass(TT))
  495. Config.PrePrunePasses.push_back(std::move(MarkLive));
  496. else
  497. Config.PrePrunePasses.push_back(markAllSymbolsLive);
  498. // Add an in-place GOT/TLS/Stubs build pass.
  499. Config.PostPrunePasses.push_back(buildTables_ELF_aarch64);
  500. }
  501. if (auto Err = Ctx->modifyPassConfig(*G, Config))
  502. return Ctx->notifyFailed(std::move(Err));
  503. ELFJITLinker_aarch64::link(std::move(Ctx), std::move(G), std::move(Config));
  504. }
  505. } // namespace jitlink
  506. } // namespace llvm