Index: include/llvm/CodeGen/AsmPrinter.h =================================================================== --- include/llvm/CodeGen/AsmPrinter.h +++ include/llvm/CodeGen/AsmPrinter.h @@ -201,6 +201,10 @@ /// Return a unique ID for the current function. unsigned getFunctionNumber() const; + /// Return symbol for the function pseudo stack if the stack frame is not a + /// register based. + virtual const MCSymbol *getFunctionFrameSymbol() const { return nullptr; } + MCSymbol *getFunctionBegin() const { return CurrentFnBegin; } MCSymbol *getFunctionEnd() const { return CurrentFnEnd; } MCSymbol *getCurExceptionSym(); Index: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -557,8 +557,11 @@ Ops.append(Expr->elements_begin(), Expr->elements_end()); DIExpressionCursor Cursor(Ops); DwarfExpr.setMemoryLocationKind(); - DwarfExpr.addMachineRegExpression( - *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg); + if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol()) + addOpAddress(*Loc, FrameSymbol); + else + DwarfExpr.addMachineRegExpression( + *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg); DwarfExpr.addExpression(std::move(Cursor)); } addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); Index: lib/Target/NVPTX/NVPTXAsmPrinter.h =================================================================== --- lib/Target/NVPTX/NVPTXAsmPrinter.h +++ lib/Target/NVPTX/NVPTXAsmPrinter.h @@ -354,6 +354,8 @@ bool ignoreLoc(const MachineInstr &); std::string getVirtualRegisterName(unsigned) const; + + const MCSymbol *getFunctionFrameSymbol() const override; }; } // end namespace llvm Index: lib/Target/NVPTX/NVPTXAsmPrinter.cpp =================================================================== --- lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -496,6 +496,12 @@ VRegMapping.clear(); } +const MCSymbol *NVPTXAsmPrinter::getFunctionFrameSymbol() const { + SmallString<128> Str; + raw_svector_ostream(Str) << DEPOTNAME << getFunctionNumber(); + return OutContext.getOrCreateSymbol(Str); +} + void NVPTXAsmPrinter::emitImplicitDef(const MachineInstr *MI) const { unsigned RegNo = MI->getOperand(0).getReg(); if (TargetRegisterInfo::isVirtualRegister(RegNo)) { Index: lib/Target/NVPTX/NVPTXFrameLowering.h =================================================================== --- lib/Target/NVPTX/NVPTXFrameLowering.h +++ lib/Target/NVPTX/NVPTXFrameLowering.h @@ -25,6 +25,8 @@ bool hasFP(const MachineFunction &MF) const override; void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; + int getFrameIndexReference(const MachineFunction &MF, int FI, + unsigned &FrameReg) const override; MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, Index: lib/Target/NVPTX/NVPTXFrameLowering.cpp =================================================================== --- lib/Target/NVPTX/NVPTXFrameLowering.cpp +++ lib/Target/NVPTX/NVPTXFrameLowering.cpp @@ -64,6 +64,14 @@ } } +int NVPTXFrameLowering::getFrameIndexReference(const MachineFunction &MF, + int FI, + unsigned &FrameReg) const { + const MachineFrameInfo &MFI = MF.getFrameInfo(); + FrameReg = NVPTX::VRDepot; + return MFI.getObjectOffset(FI) - getOffsetOfLocalArea(); +} + void NVPTXFrameLowering::emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const {} Index: test/DebugInfo/NVPTX/dbg-declare-alloca.ll =================================================================== --- test/DebugInfo/NVPTX/dbg-declare-alloca.ll +++ test/DebugInfo/NVPTX/dbg-declare-alloca.ll @@ -121,12 +121,12 @@ ; CHECK: // } ; CHECK: // .section .debug_info ; CHECK: // { -; CHECK: // .b32 124 // Length of Unit +; CHECK: // .b32 133 // Length of Unit ; CHECK: // .b8 2 // DWARF version number ; CHECK: // .b8 0 ; CHECK: // .b32 .debug_abbrev // Offset Into Abbrev. Section ; CHECK: // .b8 8 // Address Size (in bytes) -; CHECK: // .b8 1 // Abbrev [1] 0xb:0x75 DW_TAG_compile_unit +; CHECK: // .b8 1 // Abbrev [1] 0xb:0x7e DW_TAG_compile_unit ; CHECK: // .b8 99 // DW_AT_producer ; CHECK: // .b8 108 ; CHECK: // .b8 97 @@ -147,7 +147,7 @@ ; CHECK: // .b8 0 ; CHECK: // .b64 Lfunc_begin0 // DW_AT_low_pc ; CHECK: // .b64 Lfunc_end0 // DW_AT_high_pc -; CHECK: // .b8 2 // Abbrev [2] 0x31:0x32 DW_TAG_subprogram +; CHECK: // .b8 2 // Abbrev [2] 0x31:0x3b DW_TAG_subprogram ; CHECK: // .b64 Lfunc_begin0 // DW_AT_low_pc ; CHECK: // .b64 Lfunc_end0 // DW_AT_high_pc ; CHECK: // .b8 117 // DW_AT_name @@ -170,17 +170,19 @@ ; CHECK: // .b8 3 // DW_AT_decl_line ; CHECK: // .b8 1 // DW_AT_prototyped ; CHECK: // .b8 1 // DW_AT_external -; CHECK: // .b8 3 // Abbrev [3] 0x56:0xc DW_TAG_variable -; CHECK: // .b8 2 // DW_AT_location +; CHECK: // .b8 3 // Abbrev [3] 0x56:0x15 DW_TAG_variable +; CHECK: // .b8 11 // DW_AT_location +; CHECK: // .b8 3 +; CHECK: // .b64 __local_depot0 ; CHECK: // .b8 35 -; CHECK: // .b8 8 +; CHECK: // .b8 0 ; CHECK: // .b8 111 // DW_AT_name ; CHECK: // .b8 0 ; CHECK: // .b8 1 // DW_AT_decl_file ; CHECK: // .b8 4 // DW_AT_decl_line -; CHECK: // .b32 99 // DW_AT_type +; CHECK: // .b32 108 // DW_AT_type ; CHECK: // .b8 0 // End Of Children Mark -; CHECK: // .b8 4 // Abbrev [4] 0x63:0x15 DW_TAG_structure_type +; CHECK: // .b8 4 // Abbrev [4] 0x6c:0x15 DW_TAG_structure_type ; CHECK: // .b8 70 // DW_AT_name ; CHECK: // .b8 111 ; CHECK: // .b8 111 @@ -188,17 +190,17 @@ ; CHECK: // .b8 4 // DW_AT_byte_size ; CHECK: // .b8 1 // DW_AT_decl_file ; CHECK: // .b8 1 // DW_AT_decl_line -; CHECK: // .b8 5 // Abbrev [5] 0x6b:0xc DW_TAG_member +; CHECK: // .b8 5 // Abbrev [5] 0x74:0xc DW_TAG_member ; CHECK: // .b8 120 // DW_AT_name ; CHECK: // .b8 0 -; CHECK: // .b32 120 // DW_AT_type +; CHECK: // .b32 129 // DW_AT_type ; CHECK: // .b8 1 // DW_AT_decl_file ; CHECK: // .b8 1 // DW_AT_decl_line ; CHECK: // .b8 2 // DW_AT_data_member_location ; CHECK: // .b8 35 ; CHECK: // .b8 0 ; CHECK: // .b8 0 // End Of Children Mark -; CHECK: // .b8 6 // Abbrev [6] 0x78:0x7 DW_TAG_base_type +; CHECK: // .b8 6 // Abbrev [6] 0x81:0x7 DW_TAG_base_type ; CHECK: // .b8 105 // DW_AT_name ; CHECK: // .b8 110 ; CHECK: // .b8 116