[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