[CodeGen][NVPTX] Add a TRI function get the Dwarf register number for a virtual register. (#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.
This commit is contained in:
Craig Topper
2025-02-27 08:07:30 -08:00
committed by GitHub
parent 79a28aa0a4
commit 4af2e36b1d
4 changed files with 18 additions and 10 deletions

View File

@@ -1111,6 +1111,10 @@ public:
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

View File

@@ -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;

View File

@@ -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;

View File

@@ -72,6 +72,7 @@ public:
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);