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_FUNCINIT64;
254 return ELF::R_AARCH64_ABS64;
258 return R_CLS(TLSLD_ADD_DTPREL_HI12);
260 return R_CLS(TLSLE_ADD_TPREL_HI12);
262 return R_CLS(TLSLD_ADD_DTPREL_LO12_NC);
264 return R_CLS(TLSLD_ADD_DTPREL_LO12);
266 return R_CLS(TLSLE_ADD_TPREL_LO12_NC);
268 return R_CLS(TLSLE_ADD_TPREL_LO12);
270 return R_CLS(TLSDESC_ADD_LO12);
274 "ADD AUTH relocation is not supported in ILP32");
275 return ELF::R_AARCH64_NONE;
277 return ELF::R_AARCH64_AUTH_TLSDESC_ADD_LO12;
282 "ADD AUTH relocation is not supported in ILP32");
283 return ELF::R_AARCH64_NONE;
285 return ELF::R_AARCH64_AUTH_GOT_ADD_LO12_NC;
288 return R_CLS(ADD_ABS_LO12_NC);
291 return ELF::R_AARCH64_NONE;
294 return R_CLS(LDST8_ABS_LO12_NC);
296 return R_CLS(TLSLD_LDST8_DTPREL_LO12);
298 return R_CLS(TLSLD_LDST8_DTPREL_LO12_NC);
300 return R_CLS(TLSLE_LDST8_TPREL_LO12);
302 return R_CLS(TLSLE_LDST8_TPREL_LO12_NC);
305 "invalid fixup for 8-bit load/store instruction");
306 return ELF::R_AARCH64_NONE;
309 return R_CLS(LDST16_ABS_LO12_NC);
311 return R_CLS(TLSLD_LDST16_DTPREL_LO12);
313 return R_CLS(TLSLD_LDST16_DTPREL_LO12_NC);
315 return R_CLS(TLSLE_LDST16_TPREL_LO12);
317 return R_CLS(TLSLE_LDST16_TPREL_LO12_NC);
320 "invalid fixup for 16-bit load/store instruction");
321 return ELF::R_AARCH64_NONE;
324 return R_CLS(LDST32_ABS_LO12_NC);
326 return R_CLS(TLSLD_LDST32_DTPREL_LO12);
328 return R_CLS(TLSLD_LDST32_DTPREL_LO12_NC);
330 return R_CLS(TLSLE_LDST32_TPREL_LO12);
332 return R_CLS(TLSLE_LDST32_TPREL_LO12_NC);
335 return ELF::R_AARCH64_P32_LD32_GOT_LO12_NC;
337 "relocation is not supported in LP64");
338 return ELF::R_AARCH64_NONE;
344 "4 byte checked GOT load/store relocation is not supported");
346 return ELF::R_AARCH64_NONE;
350 return ELF::R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC;
352 "relocation is not supported in LP64");
353 return ELF::R_AARCH64_NONE;
357 return ELF::R_AARCH64_P32_TLSDESC_LD32_LO12;
360 "4 byte TLSDESC load/store relocation is not supported in LP64");
361 return ELF::R_AARCH64_NONE;
365 "invalid fixup for 32-bit load/store instruction "
366 "fixup_aarch64_ldst_imm12_scale4");
367 return ELF::R_AARCH64_NONE;
370 return R_CLS(LDST64_ABS_LO12_NC);
376 return ELF::R_AARCH64_LD64_GOTPAGE_LO15;
377 return (IsAuth ? ELF::R_AARCH64_AUTH_LD64_GOT_LO12_NC
378 : ELF::R_AARCH64_LD64_GOT_LO12_NC);
381 "64-bit load/store relocation is not supported in ILP32");
382 return ELF::R_AARCH64_NONE;
385 return R_CLS(TLSLD_LDST64_DTPREL_LO12);
387 return R_CLS(TLSLD_LDST64_DTPREL_LO12_NC);
389 return R_CLS(TLSLE_LDST64_TPREL_LO12);
391 return R_CLS(TLSLE_LDST64_TPREL_LO12_NC);
394 return ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
396 "64-bit load/store relocation is not supported in ILP32");
397 return ELF::R_AARCH64_NONE;
401 return ELF::R_AARCH64_TLSDESC_LD64_LO12;
403 "64-bit load/store relocation is not supported in ILP32");
404 return ELF::R_AARCH64_NONE;
408 return ELF::R_AARCH64_AUTH_TLSDESC_LD64_LO12;
411 "64-bit load/store AUTH relocation is not supported in ILP32");
412 return ELF::R_AARCH64_NONE;
415 "invalid fixup for 64-bit load/store instruction");
416 return ELF::R_AARCH64_NONE;
419 return R_CLS(LDST128_ABS_LO12_NC);
421 return R_CLS(TLSLD_LDST128_DTPREL_LO12);
423 return R_CLS(TLSLD_LDST128_DTPREL_LO12_NC);
425 return R_CLS(TLSLE_LDST128_TPREL_LO12);
427 return R_CLS(TLSLE_LDST128_TPREL_LO12_NC);
430 "invalid fixup for 128-bit load/store instruction");
431 return ELF::R_AARCH64_NONE;
435 return ELF::R_AARCH64_MOVW_UABS_G3;
437 return ELF::R_AARCH64_MOVW_UABS_G2;
439 return ELF::R_AARCH64_MOVW_SABS_G2;
441 return ELF::R_AARCH64_MOVW_UABS_G2_NC;
443 return R_CLS(MOVW_UABS_G1);
445 return ELF::R_AARCH64_MOVW_SABS_G1;
447 return ELF::R_AARCH64_MOVW_UABS_G1_NC;
449 return R_CLS(MOVW_UABS_G0);
451 return R_CLS(MOVW_SABS_G0);
453 return R_CLS(MOVW_UABS_G0_NC);
455 return ELF::R_AARCH64_MOVW_PREL_G3;
457 return ELF::R_AARCH64_MOVW_PREL_G2;
459 return ELF::R_AARCH64_MOVW_PREL_G2_NC;
461 return R_CLS(MOVW_PREL_G1);
463 return ELF::R_AARCH64_MOVW_PREL_G1_NC;
465 return R_CLS(MOVW_PREL_G0);
467 return R_CLS(MOVW_PREL_G0_NC);
469 return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G2;
471 return R_CLS(TLSLD_MOVW_DTPREL_G1);
473 return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC;
475 return R_CLS(TLSLD_MOVW_DTPREL_G0);
477 return R_CLS(TLSLD_MOVW_DTPREL_G0_NC);
479 return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G2;
481 return R_CLS(TLSLE_MOVW_TPREL_G1);
483 return ELF::R_AARCH64_TLSLE_MOVW_TPREL_G1_NC;
485 return R_CLS(TLSLE_MOVW_TPREL_G0);
487 return R_CLS(TLSLE_MOVW_TPREL_G0_NC);
489 return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G1;
491 return ELF::R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC;
493 return ELF::R_AARCH64_NONE;
496 return ELF::R_AARCH64_NONE;
503bool AArch64ELFObjectWriter::needsRelocateWithSymbol(
const MCValue &Val,
512 static_cast<const MCSymbolELF *
>(Val.
getAddSym())->isMemtag())
521void AArch64ELFObjectWriter::sortRelocs(
522 std::vector<ELFRelocationEntry> &Relocs) {
526 std::stable_partition(Relocs.begin(), Relocs.end(),
527 [](
const ELFRelocationEntry &R) {
528 return R.Type != ELF::R_AARCH64_PATCHINST;
532std::unique_ptr<MCObjectTargetWriter>
534 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)