[llvm] 6f0a35f - [AArch64] Use FirsRelocationKind+i fixup kinds to force relocations
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 20:57:13 PDT 2025
Author: Fangrui Song
Date: 2025-04-17T20:57:09-07:00
New Revision: 6f0a35fbd3296d3f4154e19f189130edcd0980bd
URL: https://github.com/llvm/llvm-project/commit/6f0a35fbd3296d3f4154e19f189130edcd0980bd
DIFF: https://github.com/llvm/llvm-project/commit/6f0a35fbd3296d3f4154e19f189130edcd0980bd.diff
LOG: [AArch64] Use FirsRelocationKind+i fixup kinds to force relocations
For RELA targets, fixup kinds that force relocations (GOT, TLS, ALIGN,
RELAX, etc) can bypass `applyFixup` and be encoded as
`FirstRelocationKind+i`, as seen in LoongArch.
Added:
Modified:
llvm/include/llvm/MC/MCFixup.h
llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/MCFixup.h b/llvm/include/llvm/MC/MCFixup.h
index f27ddeae8b173..2f2717d689049 100644
--- a/llvm/include/llvm/MC/MCFixup.h
+++ b/llvm/include/llvm/MC/MCFixup.h
@@ -89,6 +89,10 @@ class MCFixup {
FI.Loc = Loc;
return FI;
}
+ static MCFixup create(uint32_t Offset, const MCExpr *Value, unsigned Kind,
+ SMLoc Loc = SMLoc()) {
+ return create(Offset, Value, MCFixupKind(Kind), Loc);
+ }
MCFixupKind getKind() const { return Kind; }
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
index b43de2dba92a2..9600ba508a110 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
@@ -67,9 +67,9 @@ class AArch64AsmBackend : public MCAsmBackend {
{"fixup_aarch64_pcrel_branch26", 0, 26, PCRelFlagVal},
{"fixup_aarch64_pcrel_call26", 0, 26, PCRelFlagVal}};
- // Fixup kinds from .reloc directive are like R_AARCH64_NONE. They do not
- // require any extra processing.
- if (Kind >= FirstLiteralRelocationKind)
+ // Fixup kinds from raw relocation types and .reloc directives force
+ // relocations and do not need these fields.
+ if (Kind >= FirstRelocationKind)
return MCAsmBackend::getFixupKindInfo(FK_NONE);
if (Kind < FirstTargetFixupKind)
@@ -442,7 +442,7 @@ void AArch64AsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
if (!Value)
return; // Doesn't change encoding.
unsigned Kind = Fixup.getKind();
- if (Kind >= FirstLiteralRelocationKind)
+ if (Kind >= FirstRelocationKind)
return;
unsigned NumBytes = getFixupKindNumBytes(Kind);
MCFixupKindInfo Info = getFixupKindInfo(Fixup.getKind());
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
index 44ecc0c2706b1..4457cff30101e 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp
@@ -127,6 +127,11 @@ unsigned AArch64ELFObjectWriter::getRelocType(MCContext &Ctx,
break;
}
+ // Extract the relocation type from the fixup kind, after applying STT_TLS as
+ // needed.
+ if (Kind >= FirstRelocationKind)
+ return Kind - FirstRelocationKind;
+
if (IsPCRel) {
switch (Kind) {
case FK_Data_1:
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
index bd43c73396463..9f9b6aba3fe6c 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCCodeEmitter.cpp
@@ -749,9 +749,8 @@ void AArch64MCCodeEmitter::encodeInstruction(const MCInst &MI,
auto Reloc = STI.getTargetTriple().getEnvironment() == Triple::GNUILP32
? ELF::R_AARCH64_P32_TLSDESC_CALL
: ELF::R_AARCH64_TLSDESC_CALL;
- Fixups.push_back(
- MCFixup::create(0, MI.getOperand(0).getExpr(),
- MCFixupKind(FirstLiteralRelocationKind + Reloc)));
+ Fixups.push_back(MCFixup::create(0, MI.getOperand(0).getExpr(),
+ FirstRelocationKind + Reloc));
return;
}
More information about the llvm-commits
mailing list