[llvm] Move relocation specifiers to AMDGPUMCExpr::Specifier (PR #133608)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 29 17:31:08 PDT 2025
https://github.com/MaskRay created https://github.com/llvm/llvm-project/pull/133608
Similar to previous migration done for all other ELF targets.
Switch from the confusing `VariantKind` to `Specifier`, which aligns
with Arm and IBM AIX's documentation.
Moving forward, relocation specifiers should be integrated into
AMDGPUMCExpr rather than MCSymbolRefExpr::SubclassData.
(Note: the term AMDGPUMCExpr::VariantKind is for expressions
without relocation specifiers:
https://github.com/llvm/llvm-project/pull/82022
It's up to AMDGPU maintainers to integrate these constants into Specifier.
)
>From 4bd82af3423a68303043531b4849daea70e528ae Mon Sep 17 00:00:00 2001
From: Fangrui Song <i at maskray.me>
Date: Sat, 29 Mar 2025 17:30:57 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.5-bogner
---
llvm/include/llvm/MC/MCExpr.h | 8 -------
llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp | 21 ++++++++++---------
.../MCTargetDesc/AMDGPUELFObjectWriter.cpp | 19 +++++++++--------
.../AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp | 17 ++++++++-------
.../MCTargetDesc/AMDGPUMCCodeEmitter.cpp | 6 +++---
.../Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h | 16 ++++++++++++++
.../MCTargetDesc/AMDGPUTargetStreamer.cpp | 4 ++--
.../AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp | 1 +
8 files changed, 52 insertions(+), 40 deletions(-)
diff --git a/llvm/include/llvm/MC/MCExpr.h b/llvm/include/llvm/MC/MCExpr.h
index 5bfbd2d9f8e71..edecfe4dd4112 100644
--- a/llvm/include/llvm/MC/MCExpr.h
+++ b/llvm/include/llvm/MC/MCExpr.h
@@ -218,14 +218,6 @@ class MCSymbolRefExpr : public MCExpr {
VK_WASM_GOT_TLS, // Wasm global index of TLS symbol.
VK_WASM_FUNCINDEX, // Wasm function index.
- VK_AMDGPU_GOTPCREL32_LO, // symbol at gotpcrel32@lo
- VK_AMDGPU_GOTPCREL32_HI, // symbol at gotpcrel32@hi
- VK_AMDGPU_REL32_LO, // symbol at rel32@lo
- VK_AMDGPU_REL32_HI, // symbol at rel32@hi
- VK_AMDGPU_REL64, // symbol at rel64
- VK_AMDGPU_ABS32_LO, // symbol at abs32@lo
- VK_AMDGPU_ABS32_HI, // symbol at abs32@hi
-
FirstTargetSpecifier,
};
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp b/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
index 6fa97d82a668b..3d6b974d1f027 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUMCInstLower.cpp
@@ -17,6 +17,7 @@
#include "AMDGPUAsmPrinter.h"
#include "AMDGPUMachineFunction.h"
#include "MCTargetDesc/AMDGPUInstPrinter.h"
+#include "MCTargetDesc/AMDGPUMCExpr.h"
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineInstr.h"
@@ -43,24 +44,24 @@ AMDGPUMCInstLower::AMDGPUMCInstLower(MCContext &ctx,
const AsmPrinter &ap):
Ctx(ctx), ST(st), AP(ap) { }
-static MCSymbolRefExpr::VariantKind getVariantKind(unsigned MOFlags) {
+static AMDGPUMCExpr::Specifier getSpecifier(unsigned MOFlags) {
switch (MOFlags) {
default:
- return MCSymbolRefExpr::VK_None;
+ return AMDGPUMCExpr::S_None;
case SIInstrInfo::MO_GOTPCREL:
- return MCSymbolRefExpr::VK_GOTPCREL;
+ return AMDGPUMCExpr::S_GOTPCREL;
case SIInstrInfo::MO_GOTPCREL32_LO:
- return MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO;
+ return AMDGPUMCExpr::S_GOTPCREL32_LO;
case SIInstrInfo::MO_GOTPCREL32_HI:
- return MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI;
+ return AMDGPUMCExpr::S_GOTPCREL32_HI;
case SIInstrInfo::MO_REL32_LO:
- return MCSymbolRefExpr::VK_AMDGPU_REL32_LO;
+ return AMDGPUMCExpr::S_REL32_LO;
case SIInstrInfo::MO_REL32_HI:
- return MCSymbolRefExpr::VK_AMDGPU_REL32_HI;
+ return AMDGPUMCExpr::S_REL32_HI;
case SIInstrInfo::MO_ABS32_LO:
- return MCSymbolRefExpr::VK_AMDGPU_ABS32_LO;
+ return AMDGPUMCExpr::S_ABS32_LO;
case SIInstrInfo::MO_ABS32_HI:
- return MCSymbolRefExpr::VK_AMDGPU_ABS32_HI;
+ return AMDGPUMCExpr::S_ABS32_HI;
}
}
@@ -85,7 +86,7 @@ bool AMDGPUMCInstLower::lowerOperand(const MachineOperand &MO,
AP.getNameWithPrefix(SymbolName, GV);
MCSymbol *Sym = Ctx.getOrCreateSymbol(SymbolName);
const MCExpr *Expr =
- MCSymbolRefExpr::create(Sym, getVariantKind(MO.getTargetFlags()),Ctx);
+ MCSymbolRefExpr::create(Sym, getSpecifier(MO.getTargetFlags()), Ctx);
int64_t Offset = MO.getOffset();
if (Offset != 0) {
Expr = MCBinaryExpr::createAdd(Expr,
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp
index 2d960a32339f4..50531af627e4a 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUELFObjectWriter.cpp
@@ -8,6 +8,7 @@
#include "AMDGPUFixupKinds.h"
#include "AMDGPUMCTargetDesc.h"
+#include "MCTargetDesc/AMDGPUMCExpr.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELFObjectWriter.h"
#include "llvm/MC/MCValue.h"
@@ -45,24 +46,24 @@ unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
return ELF::R_AMDGPU_ABS32_LO;
}
- switch (Target.getAccessVariant()) {
+ switch (AMDGPUMCExpr::Specifier(Target.getAccessVariant())) {
default:
break;
- case MCSymbolRefExpr::VK_GOTPCREL:
+ case AMDGPUMCExpr::S_GOTPCREL:
return ELF::R_AMDGPU_GOTPCREL;
- case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO:
+ case AMDGPUMCExpr::S_GOTPCREL32_LO:
return ELF::R_AMDGPU_GOTPCREL32_LO;
- case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI:
+ case AMDGPUMCExpr::S_GOTPCREL32_HI:
return ELF::R_AMDGPU_GOTPCREL32_HI;
- case MCSymbolRefExpr::VK_AMDGPU_REL32_LO:
+ case AMDGPUMCExpr::S_REL32_LO:
return ELF::R_AMDGPU_REL32_LO;
- case MCSymbolRefExpr::VK_AMDGPU_REL32_HI:
+ case AMDGPUMCExpr::S_REL32_HI:
return ELF::R_AMDGPU_REL32_HI;
- case MCSymbolRefExpr::VK_AMDGPU_REL64:
+ case AMDGPUMCExpr::S_REL64:
return ELF::R_AMDGPU_REL64;
- case MCSymbolRefExpr::VK_AMDGPU_ABS32_LO:
+ case AMDGPUMCExpr::S_ABS32_LO:
return ELF::R_AMDGPU_ABS32_LO;
- case MCSymbolRefExpr::VK_AMDGPU_ABS32_HI:
+ case AMDGPUMCExpr::S_ABS32_HI:
return ELF::R_AMDGPU_ABS32_HI;
}
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp
index 56c53ed587e9f..6f1d89e500ed3 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCAsmInfo.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "AMDGPUMCAsmInfo.h"
+#include "MCTargetDesc/AMDGPUMCExpr.h"
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCSubtargetInfo.h"
@@ -16,14 +17,14 @@
using namespace llvm;
const MCAsmInfo::VariantKindDesc variantKindDescs[] = {
- {MCSymbolRefExpr::VK_GOTPCREL, "gotpcrel"},
- {MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO, "gotpcrel32 at lo"},
- {MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI, "gotpcrel32 at hi"},
- {MCSymbolRefExpr::VK_AMDGPU_REL32_LO, "rel32 at lo"},
- {MCSymbolRefExpr::VK_AMDGPU_REL32_HI, "rel32 at hi"},
- {MCSymbolRefExpr::VK_AMDGPU_REL64, "rel64"},
- {MCSymbolRefExpr::VK_AMDGPU_ABS32_LO, "abs32 at lo"},
- {MCSymbolRefExpr::VK_AMDGPU_ABS32_HI, "abs32 at hi"},
+ {AMDGPUMCExpr::S_GOTPCREL, "gotpcrel"},
+ {AMDGPUMCExpr::S_GOTPCREL32_LO, "gotpcrel32 at lo"},
+ {AMDGPUMCExpr::S_GOTPCREL32_HI, "gotpcrel32 at hi"},
+ {AMDGPUMCExpr::S_REL32_LO, "rel32 at lo"},
+ {AMDGPUMCExpr::S_REL32_HI, "rel32 at hi"},
+ {AMDGPUMCExpr::S_REL64, "rel64"},
+ {AMDGPUMCExpr::S_ABS32_LO, "abs32 at lo"},
+ {AMDGPUMCExpr::S_ABS32_HI, "abs32 at hi"},
};
AMDGPUMCAsmInfo::AMDGPUMCAsmInfo(const Triple &TT,
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
index 1391ef6dd09e5..1e82ee36dc0eb 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCCodeEmitter.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/AMDGPUFixupKinds.h"
+#include "MCTargetDesc/AMDGPUMCExpr.h"
#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
#include "SIDefines.h"
#include "Utils/AMDGPUBaseInfo.h"
@@ -546,9 +547,8 @@ static bool needsPCRel(const MCExpr *Expr) {
switch (Expr->getKind()) {
case MCExpr::SymbolRef: {
auto *SE = cast<MCSymbolRefExpr>(Expr);
- MCSymbolRefExpr::VariantKind Kind = SE->getKind();
- return Kind != MCSymbolRefExpr::VK_AMDGPU_ABS32_LO &&
- Kind != MCSymbolRefExpr::VK_AMDGPU_ABS32_HI;
+ auto Spec = AMDGPU::getSpecifier(SE);
+ return Spec != AMDGPUMCExpr::S_ABS32_LO && Spec != AMDGPUMCExpr::S_ABS32_HI;
}
case MCExpr::Binary: {
auto *BE = cast<MCBinaryExpr>(Expr);
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
index c0167096f022a..f38320ae79858 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUMCExpr.h
@@ -39,6 +39,19 @@ class AMDGPUMCExpr : public MCTargetExpr {
AGVK_Occupancy
};
+ // Relocation specifiers.
+ enum Specifier {
+ S_None,
+ S_GOTPCREL, // symbol at gotpcrel
+ S_GOTPCREL32_LO, // symbol at gotpcrel32@lo
+ S_GOTPCREL32_HI, // symbol at gotpcrel32@hi
+ S_REL32_LO, // symbol at rel32@lo
+ S_REL32_HI, // symbol at rel32@hi
+ S_REL64, // symbol at rel64
+ S_ABS32_LO, // symbol at abs32@lo
+ S_ABS32_HI, // symbol at abs32@hi
+ };
+
private:
VariantKind Kind;
MCContext &Ctx;
@@ -113,6 +126,9 @@ void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS,
const MCExpr *foldAMDGPUMCExpr(const MCExpr *Expr, MCContext &Ctx);
+static inline AMDGPUMCExpr::Specifier getSpecifier(const MCSymbolRefExpr *SRE) {
+ return AMDGPUMCExpr::Specifier(SRE->getKind());
+}
} // end namespace AMDGPU
} // end namespace llvm
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
index dbc4c37a77a88..a6c97a02cb959 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp
@@ -1005,8 +1005,8 @@ void AMDGPUTargetELFStreamer::EmitAmdhsaKernelDescriptor(
// It implies R_AMDGPU_REL64, but ends up being R_AMDGPU_ABS64.
Streamer.emitValue(
MCBinaryExpr::createSub(
- MCSymbolRefExpr::create(KernelCodeSymbol,
- MCSymbolRefExpr::VK_AMDGPU_REL64, Context),
+ MCSymbolRefExpr::create(KernelCodeSymbol, AMDGPUMCExpr::S_REL64,
+ Context),
MCSymbolRefExpr::create(KernelDescriptorSymbol, Context), Context),
sizeof(amdhsa::kernel_descriptor_t::kernel_code_entry_byte_offset));
for (uint32_t i = 0; i < sizeof(amdhsa::kernel_descriptor_t::reserved1); ++i)
diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
index 8195c93d847b0..0d5287443c490 100644
--- a/llvm/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
+++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/R600MCCodeEmitter.cpp
@@ -13,6 +13,7 @@
//
//===----------------------------------------------------------------------===//
+#include "MCTargetDesc/AMDGPUMCExpr.h"
#include "MCTargetDesc/R600MCTargetDesc.h"
#include "R600Defines.h"
#include "llvm/MC/MCCodeEmitter.h"
More information about the llvm-commits
mailing list