[llvm] 6e857b4 - MC: Move R_PPC64_TOC case to PowerPCAsmBackend

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sun May 18 22:32:13 PDT 2025


Author: Fangrui Song
Date: 2025-05-18T22:32:07-07:00
New Revision: 6e857b49cc2809692c295806ad02288645d60017

URL: https://github.com/llvm/llvm-project/commit/6e857b49cc2809692c295806ad02288645d60017
DIFF: https://github.com/llvm/llvm-project/commit/6e857b49cc2809692c295806ad02288645d60017.diff

LOG: MC: Move R_PPC64_TOC case to PowerPCAsmBackend

Added: 
    

Modified: 
    llvm/include/llvm/MC/MCValue.h
    llvm/lib/MC/ELFObjectWriter.cpp
    llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
    llvm/test/MC/PowerPC/ppc64-relocs-01.s

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/MC/MCValue.h b/llvm/include/llvm/MC/MCValue.h
index abed825ac0c59..417c4689d1b47 100644
--- a/llvm/include/llvm/MC/MCValue.h
+++ b/llvm/include/llvm/MC/MCValue.h
@@ -46,6 +46,7 @@ class MCValue {
   void setSpecifier(uint32_t S) { Specifier = S; }
 
   const MCSymbol *getAddSym() const { return SymA; }
+  void setAddSym(const MCSymbol *A) { SymA = A; }
   const MCSymbol *getSubSym() const { return SymB; }
 
   /// Is this an absolute (as opposed to relocatable) value.

diff  --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 4fb78b320f114..ba950b217e70c 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -1350,8 +1350,6 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
                  MCFixupKindInfo::FKF_IsPCRel;
   uint64_t FixupOffset = Asm.getFragmentOffset(*Fragment) + Fixup.getOffset();
   uint64_t Addend = Target.getConstant();
-  // Handle special fixups like ADD/SUB relocation pairs.
-
   if (auto *RefB = Target.getSubSym()) {
     const auto &SymB = cast<MCSymbolELF>(*RefB);
     if (SymB.isUndefined()) {
@@ -1397,12 +1395,6 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm,
     SymA = cast<MCSymbolELF>(SecA->getBeginSymbol());
     SymA->setUsedInReloc();
   } else {
-    // In PPC64 ELFv1, .quad .TOC. at tocbase in the .opd section is expected to
-    // reference the null symbol.
-    if (Type == ELF::R_PPC64_TOC &&
-        TargetObjectWriter->getEMachine() == ELF::EM_PPC64)
-      SymA = nullptr;
-
     if (SymA) {
       if (const MCSymbolELF *R = Renames.lookup(SymA))
         SymA = R;

diff  --git a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
index 136bb4817706f..eea00b2e94def 100644
--- a/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
+++ b/llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "MCTargetDesc/PPCFixupKinds.h"
+#include "MCTargetDesc/PPCMCExpr.h"
 #include "MCTargetDesc/PPCMCTargetDesc.h"
 #include "llvm/BinaryFormat/ELF.h"
 #include "llvm/BinaryFormat/MachO.h"
@@ -133,6 +134,18 @@ class PPCAsmBackend : public MCAsmBackend {
                 : InfosBE)[Kind - FirstTargetFixupKind];
   }
 
+  bool addReloc(MCAssembler &Asm, const MCFragment &F, const MCFixup &Fixup,
+                const MCValue &TargetVal, uint64_t &FixedValue, bool IsResolved,
+                const MCSubtargetInfo *STI) override {
+    // In PPC64 ELFv1, .quad .TOC. at tocbase in the .opd section is expected to
+    // reference the null symbol.
+    auto Target = TargetVal;
+    if (Target.getSpecifier() == PPCMCExpr::VK_TOCBASE)
+      Target.setAddSym(nullptr);
+    return MCAsmBackend::addReloc(Asm, F, Fixup, Target, FixedValue, IsResolved,
+                                  STI);
+  }
+
   void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
                   const MCValue &Target, MutableArrayRef<char> Data,
                   uint64_t Value, bool IsResolved,

diff  --git a/llvm/test/MC/PowerPC/ppc64-relocs-01.s b/llvm/test/MC/PowerPC/ppc64-relocs-01.s
index 0cc0c106717ae..8aedaba916d9d 100644
--- a/llvm/test/MC/PowerPC/ppc64-relocs-01.s
+++ b/llvm/test/MC/PowerPC/ppc64-relocs-01.s
@@ -1,5 +1,5 @@
 # RUN: llvm-mc -triple=powerpc64-unknown-linux-gnu -filetype=obj %s | \
-# RUN: llvm-readobj -r - | FileCheck %s
+# RUN: llvm-readobj -rs - | FileCheck %s
 
         .section .opd,"aw", at progbits
 access_int64:
@@ -44,3 +44,5 @@ number64:
 # CHECK-NEXT:   }
 
 # CHECK-NEXT: ]
+# CHECK:      Symbols [
+# CHECK:      .TOC.


        


More information about the llvm-commits mailing list