[llvm] [CodeGen][NVPTX] Add a TRI function get the Dwarf register number for a virtual register. (PR #129017)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 26 23:19:13 PST 2025
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/129017
NVPTX needs to be able to get the Dwarf register number for a virtual register. The interface we have for this today is on MCRegisterInfo and take a MCRegister argument. It shouldn't be legal to convert a Register containing a virtual register to an MCRegister.
This patch adds a getDwarfRegNumForVirtReg function that takes a Register to TRI and splits the NVPTX override of getDwarfRegNum.
>From c9aaa9386ea410cbec091cba56862b64589c7a4e Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 26 Feb 2025 22:51:30 -0800
Subject: [PATCH] [CodeGen][NVPTX] Add a TRI function get the Dwarf register
number for a virtual register.
NVPTX needs to be able to get the Dwarf register number for a virtual
register. The interface we have for this today is on MCRegisterInfo
and take a MCRegister argument. It shouldn't be legal to convert a
Register containing a virtual register to an MCRegister.
This patch adds a getDwarfRegNumForVirtReg function to TRI and splits
the NVPTX override of getDwarfRegNum.
---
.../include/llvm/CodeGen/TargetRegisterInfo.h | 4 ++++
.../CodeGen/AsmPrinter/DwarfExpression.cpp | 2 +-
llvm/lib/Target/NVPTX/NVPTXRegisterInfo.cpp | 21 +++++++++++--------
llvm/lib/Target/NVPTX/NVPTXRegisterInfo.h | 1 +
4 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/TargetRegisterInfo.h b/llvm/include/llvm/CodeGen/TargetRegisterInfo.h
index 79f014edb58c8..3206cc4518821 100644
--- a/llvm/include/llvm/CodeGen/TargetRegisterInfo.h
+++ b/llvm/include/llvm/CodeGen/TargetRegisterInfo.h
@@ -1111,6 +1111,10 @@ class TargetRegisterInfo : public MCRegisterInfo {
prependOffsetExpression(const DIExpression *Expr, unsigned PrependFlags,
const StackOffset &Offset) const;
+ virtual int64_t getDwarfRegNumForVirtReg(Register RegNum, bool isEH) const {
+ llvm_unreachable("getDwarfRegNumForVirtReg does not exist on this target");
+ }
+
/// Spill the register so it can be used by the register scavenger.
/// Return true if the register was spilled, false otherwise.
/// If this function does not spill the register, the scavenger
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
index f5d2863ae70b7..e684054ffa3e4 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
@@ -106,7 +106,7 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,
return true;
}
// Try getting dwarf register for virtual register anyway, eg. for NVPTX.
- int64_t Reg = TRI.getDwarfRegNum(MachineReg, false);
+ int64_t Reg = TRI.getDwarfRegNumForVirtReg(MachineReg, false);
if (Reg > 0) {
DwarfRegs.push_back(Register::createRegister(Reg, nullptr));
return true;
diff --git a/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.cpp b/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.cpp
index 229c438edf723..142388893082a 100644
--- a/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.cpp
+++ b/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.cpp
@@ -170,15 +170,18 @@ void NVPTXRegisterInfo::addToDebugRegisterMap(
}
int64_t NVPTXRegisterInfo::getDwarfRegNum(MCRegister RegNum, bool isEH) const {
- if (RegNum.isPhysical()) {
- StringRef Name = NVPTXInstPrinter::getRegisterName(RegNum.id());
- // In NVPTXFrameLowering.cpp, we do arrange for %Depot to be accessible from
- // %SP. Using the %Depot register doesn't provide any debug info in
- // cuda-gdb, but switching it to %SP does.
- if (RegNum.id() == NVPTX::VRDepot)
- Name = "%SP";
- return encodeRegisterForDwarf(Name);
- }
+ StringRef Name = NVPTXInstPrinter::getRegisterName(RegNum.id());
+ // In NVPTXFrameLowering.cpp, we do arrange for %Depot to be accessible from
+ // %SP. Using the %Depot register doesn't provide any debug info in
+ // cuda-gdb, but switching it to %SP does.
+ if (RegNum.id() == NVPTX::VRDepot)
+ Name = "%SP";
+ return encodeRegisterForDwarf(Name);
+}
+
+int64_t NVPTXRegisterInfo::getDwarfRegNumForVirtReg(Register RegNum,
+ bool isEH) const {
+ assert(RegNum.isVirtual());
uint64_t lookup = debugRegisterMap.lookup(RegNum.id());
if (lookup)
return lookup;
diff --git a/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.h b/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.h
index cfec7377fd634..1334bfa035a96 100644
--- a/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.h
+++ b/llvm/lib/Target/NVPTX/NVPTXRegisterInfo.h
@@ -72,6 +72,7 @@ class NVPTXRegisterInfo : public NVPTXGenRegisterInfo {
StringRef RegisterName) const;
void clearDebugRegisterMap() const;
int64_t getDwarfRegNum(MCRegister RegNum, bool isEH) const override;
+ int64_t getDwarfRegNumForVirtReg(Register RegNum, bool isEH) const override;
};
StringRef getNVPTXRegClassName(const TargetRegisterClass *RC);
More information about the llvm-commits
mailing list