[llvm] 976de53 - [MC,MachO] Replace SectionAddrMap workaround with cleaner variable handling
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 6 13:07:46 PDT 2025
Author: Fangrui Song
Date: 2025-04-06T13:07:40-07:00
New Revision: 976de53f1008a9e06c94a99fdd59d0f523feaef7
URL: https://github.com/llvm/llvm-project/commit/976de53f1008a9e06c94a99fdd59d0f523feaef7
DIFF: https://github.com/llvm/llvm-project/commit/976de53f1008a9e06c94a99fdd59d0f523feaef7.diff
LOG: [MC,MachO] Replace SectionAddrMap workaround with cleaner variable handling
Mach-O's ARM and X86 writers use MCExpr's `SectionAddrMap *Addrs`
argument to compute label differences, which was a bit of a hack. The
AArch64MachObjectWriter does this better by using `getSymbolAddress` in
its `recordRelocation` function.
This commit:
1. Moves the `SectionAddrMap` logic into the Mach-O code, removing the
workaround.
2. Fixes a bug in `MachObjectWriter::getSymbolAddress` where it failed
to subtract the `SymB` value. This bug has been present since commit
b200f93125eb019d69c220fa447faea4f5d4eb8a (2011).
Added:
Modified:
llvm/lib/MC/MachObjectWriter.cpp
llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
Removed:
################################################################################
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 9e6e3f5e28e54..7fac6c78bc1a8 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -120,7 +120,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbol &S,
if (Target.getAddSym())
Address += getSymbolAddress(*Target.getAddSym(), Asm);
if (Target.getSubSym())
- Address += getSymbolAddress(*Target.getSubSym(), Asm);
+ Address -= getSymbolAddress(*Target.getSubSym(), Asm);
return Address;
}
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
index 03ad4149f766b..009607eb357f1 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
@@ -416,9 +416,17 @@ void ARMMachObjectWriter::recordRelocation(MachObjectWriter *Writer,
} else {
// Resolve constant variables.
if (A->isVariable()) {
- int64_t Res;
- if (A->getVariableValue()->evaluateAsAbsolute(
- Res, Asm, Writer->getSectionAddressMap())) {
+ MCValue Val;
+ bool Relocatable =
+ A->getVariableValue()->evaluateAsRelocatable(Val, &Asm);
+ int64_t Res = Val.getConstant();
+ bool isAbs = Val.isAbsolute();
+ if (Relocatable && Val.getAddSym() && Val.getSubSym()) {
+ Res += Writer->getSymbolAddress(*Val.getAddSym(), Asm) -
+ Writer->getSymbolAddress(*Val.getSubSym(), Asm);
+ isAbs = true;
+ }
+ if (isAbs) {
FixedValue = Res;
return;
}
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
index f2055d29ce7e0..10df56a05c4e4 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
@@ -246,19 +246,8 @@ void X86MachObjectWriter::RecordX86_64Relocation(
if (IsPCRel)
Value -= FixupAddress + (1 << Log2Size);
} else if (Symbol->isVariable()) {
- const MCExpr *Value = Symbol->getVariableValue();
- int64_t Res;
- bool isAbs =
- Value->evaluateAsAbsolute(Res, Asm, Writer->getSectionAddressMap());
- if (isAbs) {
- FixedValue = Res;
- return;
- } else {
- Asm.getContext().reportError(Fixup.getLoc(),
- "unsupported relocation of variable '" +
- Symbol->getName() + "'");
- return;
- }
+ FixedValue = Writer->getSymbolAddress(*Symbol, Asm);
+ return;
} else {
Asm.getContext().reportError(
Fixup.getLoc(), "unsupported relocation of undefined symbol '" +
@@ -548,9 +537,17 @@ void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
// Resolve constant variables.
if (A->isVariable()) {
- int64_t Res;
- if (A->getVariableValue()->evaluateAsAbsolute(
- Res, Asm, Writer->getSectionAddressMap())) {
+ MCValue Val;
+ bool Relocatable =
+ A->getVariableValue()->evaluateAsRelocatable(Val, &Asm);
+ int64_t Res = Val.getConstant();
+ bool isAbs = Val.isAbsolute();
+ if (Relocatable && Val.getAddSym() && Val.getSubSym()) {
+ Res += Writer->getSymbolAddress(*Val.getAddSym(), Asm) -
+ Writer->getSymbolAddress(*Val.getSubSym(), Asm);
+ isAbs = true;
+ }
+ if (isAbs) {
FixedValue = Res;
return;
}
More information about the llvm-commits
mailing list