34 AArch64ELFObjectWriter(uint8_t OSABI,
bool IsILP32);
36 ~AArch64ELFObjectWriter()
override =
default;
39 unsigned getRelocType(
const MCFixup &,
const MCValue &,
40 bool IsPCRel)
const override;
41 bool needsRelocateWithSymbol(
const MCValue &,
unsigned Type)
const override;
43 void sortRelocs(std::vector<ELFRelocationEntry> &Relocs)
override;
50AArch64ELFObjectWriter::AArch64ELFObjectWriter(
uint8_t OSABI,
bool IsILP32)
56 IsILP32 ? ELF::R_AARCH64_P32_##rtype : ELF::R_AARCH64_##rtype
59bool AArch64ELFObjectWriter::isNonILP32reloc(
const MCFixup &
Fixup,
77 "absolute MOV relocation is not supported in ILP32");
85unsigned AArch64ELFObjectWriter::getRelocType(
const MCFixup &
Fixup,
86 const MCValue &Target,
115 " can only be used in a .word directive");
116 return ELF::R_AARCH64_NONE;
130 return ELF::R_AARCH64_NONE;
132 return R_CLS(PREL16);
134 return R_CLS(PREL32);
139 "relocation is not supported in ILP32");
140 return ELF::R_AARCH64_NONE;
142 return ELF::R_AARCH64_PREL64;
147 "ADR AUTH relocation is not supported in ILP32");
148 return ELF::R_AARCH64_NONE;
150 return ELF::R_AARCH64_AUTH_GOT_ADR_PREL_LO21;
154 return R_CLS(ADR_PREL_LO21);
157 return R_CLS(ADR_PREL_PG_HI21);
161 "invalid fixup for 32-bit pcrel ADRP instruction "
163 return ELF::R_AARCH64_NONE;
165 return ELF::R_AARCH64_ADR_PREL_PG_HI21_NC;
168 return R_CLS(ADR_GOT_PAGE);
172 "ADRP AUTH relocation is not supported in ILP32");
173 return ELF::R_AARCH64_NONE;
175 return ELF::R_AARCH64_AUTH_ADR_GOT_PAGE;
178 return R_CLS(TLSIE_ADR_GOTTPREL_PAGE21);
180 return R_CLS(TLSDESC_ADR_PAGE21);
184 "ADRP AUTH relocation is not supported in ILP32");
185 return ELF::R_AARCH64_NONE;
187 return ELF::R_AARCH64_AUTH_TLSDESC_ADR_PAGE21;
190 return ELF::R_AARCH64_NONE;
192 return R_CLS(JUMP26);
194 return R_CLS(CALL26);
197 return R_CLS(TLSIE_LD_GOTTPREL_PREL19);
199 return R_CLS(GOT_LD_PREL19);
203 "LDR AUTH relocation is not supported in ILP32");
204 return ELF::R_AARCH64_NONE;
206 return ELF::R_AARCH64_AUTH_GOT_LD_PREL19;
208 return R_CLS(LD_PREL_LO19);
210 return R_CLS(TSTBR14);
213 "relocation of PAC/AUT instructions is not supported");
214 return ELF::R_AARCH64_NONE;
218 "relocation of compare-and-branch instructions not supported");
219 return ELF::R_AARCH64_NONE;
221 return R_CLS(CONDBR19);
224 return ELF::R_AARCH64_NONE;
227 if (IsILP32 && isNonILP32reloc(
Fixup, RefKind))
228 return ELF::R_AARCH64_NONE;
229 switch (
Fixup.getKind()) {
232 return ELF::R_AARCH64_NONE;
238 return ELF::R_AARCH64_GOTPCREL32;
240 return ELF::R_AARCH64_PLT32;
247 "8 byte absolute data relocation is not supported in ILP32");
248 return ELF::R_AARCH64_NONE;
251 return ELF::R_AARCH64_AUTH_ABS64;
253 return ELF::R_AARCH64_TLS_DTPREL64;
255 return ELF::R_AARCH64_FUNCINIT64;
256 return ELF::R_AARCH64_ABS64;
260 return R_CLS(TLSLD_ADD_DTPREL_HI12);
262 return R_CLS(TLSLE_ADD_TPREL_HI12);
264 return R_CLS(TLSLD_ADD_DTPREL_LO12_NC);
266 return R_CLS(TLSLD_ADD_DTPREL_LO12);
268 return R_CLS(TLSLE_ADD_TPREL_LO12_NC);
270 return R_CLS(TLSLE_ADD_TPREL_LO12);
272 return R_CLS(TLSDESC_ADD_LO12);
276 "ADD AUTH relocation is not supported in ILP32");
277 return ELF::R_AARCH64_NONE;
279 return ELF::R_AARCH64_AUTH_TLSDESC_ADD_LO12;
284 "ADD AUTH relocation is not supported in ILP32");
285 return ELF::R_AARCH64_NONE;
287 return ELF::R_AARCH64_AUTH_GOT_ADD_LO12_NC;
290 return R_CLS(ADD_ABS_LO12_NC);
293 return ELF::R_AARCH64_NONE;
296 return R_CLS(LDST8_ABS_LO12_NC);
298 return R_CLS(TLSLD_LDST8_DTPREL_LO12);
300 return R_CLS(TLSLD_LDST8_DTPREL_LO12_NC);
302 return R_CLS(TLSLE_LDST8_TPREL_LO12);
304 return R_CLS(TLSLE_LDST8_TPREL_LO12_NC);
307 "invalid fixup for 8-bit load/store instruction");
308 return ELF::R_AARCH64_NONE;
311 return R_CLS(LDST16_ABS_LO12_NC);
313 return R_CLS(TLSLD_LDST16_DTPREL_LO12);
315 return R_CLS(TLSLD_LDST16_DTPREL_LO12_NC);
317 return R_CLS(TLSLE_LDST16_TPREL_LO12);
319 return R_CLS(TLSLE_LDST16_TPREL_LO12_NC);
322 "invalid fixup for 16-bit load/store instruction");
323 return ELF::R_AARCH64_NONE;
326 return R_CLS(LDST32_ABS_LO12_NC);
328 return R_CLS(TLSLD_LDST32_DTPREL_LO12);
330 return R_CLS(TLSLD_LDST32_DTPREL_LO12_NC);
332 return R_CLS(TLSLE_LDST32_TPREL_LO12);
334 return R_CLS(TLSLE_LDST32_TPREL_LO12_NC);
337 return ELF::R_AARCH64_P32_LD32_GOT_LO12_NC;
339 "relocation is not supported in LP64");
340 return ELF::R_AARCH64_NONE;
346 "4 byte checked GOT load/store relocation is not supported");
348 return ELF::R_AARCH64_NONE;
352 return ELF::R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC;
354 "relocation is not supported in LP64");
355 return ELF::R_AARCH64_NONE;
359 return ELF::R_AARCH64_P32_TLSDESC_LD32_LO12;
362 "4 byte TLSDESC load/store relocation is not supported in LP64");
363 return ELF::R_AARCH64_NONE;
367 "invalid fixup for 32-bit load/store instruction "
368 "fixup_aarch64_ldst_imm12_scale4");
369 return ELF::R_AARCH64_NONE;
372 return R_CLS(LDST64_ABS_LO12_NC);
378 return ELF::R_AARCH64_LD64_GOTPAGE_LO15;
379 return (IsAuth ? ELF::R_AARCH64_AUTH_LD64_GOT_LO12_NC
380 : ELF::R_AARCH64_LD64_GOT_LO12_NC);
383 "64-bit load/store relocation is not supported in ILP32");
384 return ELF::R_AARCH64_NONE;
387 return R_CLS(TLSLD_LDST64_DTPREL_LO12);
389 return R_CLS(TLSLD_LDST64_DTPREL_LO12_NC);
391 return R_CLS(TLSLE_LDST64_TPREL_LO12);
393 return R_CLS(TLSLE_LDST64_TPREL_LO12_NC);
396 return ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
398 "64-bit load/store relocation is not supported in ILP32");
399 return ELF::R_AARCH64_NONE;
403 return ELF::R_AARCH64_TLSDESC_LD64_LO12;
405 "64-bit load/store relocation is not supported in ILP32");
406 return ELF::R_AARCH64_NONE;
410 return ELF::R_AARCH64_AUTH_TLSDESC_LD64_LO12;
413 "64-bit load/store AUTH relocation is not supported in ILP32");
414 return ELF::R_AARCH64_NONE;
417 "invalid fixup for 64-bit load/store instruction");
418 return ELF::R_AARCH64_NONE;
421 return R_CLS(LDST128_ABS_LO12_NC);
423 return R_CLS(TLSLD_LDST128_DTPREL_LO12);
425 return R_CLS(TLSLD_LDST128_DTPREL_LO12_NC);
427 return R_CLS(TLSLE_LDST128_TPREL_LO12);
429 return R_CLS(TLSLE_LDST128_TPREL_LO12_NC);
432 "invalid fixup for 128-bit load/store instruction");
433 return ELF::R_AARCH64_NONE;
437 return ELF::R_AARCH64_MOVW_UABS_G3;
439 return ELF::R_AARCH64_MOVW_UABS_G2;
441 return ELF::R_AARCH64_MOVW_SABS_G2;
443 return ELF::R_AARCH64_MOVW_UABS_G2_NC;
445 return R_CLS(MOVW_UABS_G1);
447 return ELF::R_AARCH64_MOVW_SABS_G1;
449 return ELF::R_AARCH64_MOVW_UABS_G1_NC;
451 return R_CLS(MOVW_UABS_G0);
453 return R_CLS(MOVW_SABS_G0);
455 return R_CLS(MOVW_UABS_G0_NC);
457 return ELF::R_AARCH64_MOVW_PREL_G3;
459 return ELF::R_AARCH64_MOVW_PREL_G2;
461 return ELF::R_AARCH64_MOVW_PREL_G2_NC;
463 return R_CLS(MOVW_PREL_G1);
465 return ELF::R_AARCH64_MOVW_PREL_G1_NC;
467 return R_CLS(MOVW_PREL_G0);
469 return R_CLS(MOVW_PREL_G0_NC);
471 return ELF::R_AARCH64_TLS_DTPREL64;
473 return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G2;
475 return R_CLS(TLSLD_MOVW_DTPREL_G1);
477 return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC;
479 return R_CLS(TLSLD_MOVW_DTPREL_G0);
481 return R_CLS(TLSLD_MOVW_DTPREL_G0_NC);
483 return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G2;
485 return R_CLS(TLSLE_MOVW_TPREL_G1);
487 return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC;
489 return R_CLS(TLSLE_MOVW_TPREL_G0);
491 return R_CLS(TLSLE_MOVW_TPREL_G0_NC);
493 return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1;
495 return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC;
497 return ELF::R_AARCH64_NONE;
500 return ELF::R_AARCH64_NONE;
507bool AArch64ELFObjectWriter::needsRelocateWithSymbol(
const MCValue &Val,
516 static_cast<const MCSymbolELF *
>(Val.
getAddSym())->isMemtag())
525void AArch64ELFObjectWriter::sortRelocs(
526 std::vector<ELFRelocationEntry> &Relocs) {
530 std::stable_partition(Relocs.begin(), Relocs.end(),
531 [](
const ELFRelocationEntry &R) {
532 return R.Type != ELF::R_AARCH64_PATCHINST;
536std::unique_ptr<MCObjectTargetWriter>
538 return std::make_unique<AArch64ELFObjectWriter>(OSABI, IsILP32);
static Error reportError(StringRef Message)
PowerPC TLS Dynamic Call Fixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
const MCSymbol * getAddSym() const
uint32_t getSpecifier() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Specifier getSymbolLoc(Specifier S)
@ fixup_aarch64_pcrel_branch9
@ fixup_aarch64_pcrel_branch16
@ fixup_aarch64_ldst_imm12_scale4
@ fixup_aarch64_pcrel_call26
@ fixup_aarch64_pcrel_branch26
@ fixup_aarch64_pcrel_branch19
@ fixup_aarch64_ldr_pcrel_imm19
@ fixup_aarch64_pcrel_adr_imm21
@ fixup_aarch64_pcrel_branch14
@ fixup_aarch64_ldst_imm12_scale2
@ fixup_aarch64_ldst_imm12_scale16
@ fixup_aarch64_pcrel_adrp_imm21
@ fixup_aarch64_add_imm12
@ fixup_aarch64_ldst_imm12_scale8
@ fixup_aarch64_ldst_imm12_scale1
StringRef getSpecifierName(Specifier S)
Return the string representation of the ELF relocation specifier (e.g.
bool isNotChecked(Specifier S)
Specifier getAddressFrag(Specifier S)
bool isRelocation(MCFixupKind FixupKind)
This is an optimization pass for GlobalISel generic memory operations.
@ FK_Data_8
A eight-byte fixup.
@ FK_Data_1
A one-byte fixup.
@ FK_Data_4
A four-byte fixup.
@ FK_Data_2
A two-byte fixup.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
std::unique_ptr< MCObjectTargetWriter > createAArch64ELFObjectWriter(uint8_t OSABI, bool IsILP32)