[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