Index: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h +++ llvm/trunk/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: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -578,8 +578,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: llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.h =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.h +++ llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.h @@ -310,6 +310,8 @@ } std::string getVirtualRegisterName(unsigned) const; + + const MCSymbol *getFunctionFrameSymbol() const override; }; } // end namespace llvm Index: llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ llvm/trunk/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -495,6 +495,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: llvm/trunk/lib/Target/NVPTX/NVPTXFrameLowering.h =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXFrameLowering.h +++ llvm/trunk/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: llvm/trunk/lib/Target/NVPTX/NVPTXFrameLowering.cpp =================================================================== --- llvm/trunk/lib/Target/NVPTX/NVPTXFrameLowering.cpp +++ llvm/trunk/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: llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll =================================================================== --- llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll +++ llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll @@ -123,12 +123,12 @@ ; CHECK: // } ; CHECK: // .section .debug_info ; CHECK: // { -; CHECK: // .b32 126 // Length of Unit +; CHECK: // .b32 135 // 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:0x77 DW_TAG_compile_unit +; CHECK: // .b8 1 // Abbrev [1] 0xb:0x80 DW_TAG_compile_unit ; CHECK: // .b8 99 // DW_AT_producer ; CHECK: // .b8 108 ; CHECK: // .b8 97 @@ -149,7 +149,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:0x34 DW_TAG_subprogram +; CHECK: // .b8 2 // Abbrev [2] 0x31:0x3d DW_TAG_subprogram ; CHECK: // .b64 Lfunc_begin0 // DW_AT_low_pc ; CHECK: // .b64 Lfunc_end0 // DW_AT_high_pc ; CHECK: // .b8 1 // DW_AT_frame_base @@ -174,17 +174,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] 0x58:0xc DW_TAG_variable -; CHECK: // .b8 2 // DW_AT_location +; CHECK: // .b8 3 // Abbrev [3] 0x58: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 101 // DW_AT_type +; CHECK: // .b32 110 // DW_AT_type ; CHECK: // .b8 0 // End Of Children Mark -; CHECK: // .b8 4 // Abbrev [4] 0x65:0x15 DW_TAG_structure_type +; CHECK: // .b8 4 // Abbrev [4] 0x6e:0x15 DW_TAG_structure_type ; CHECK: // .b8 70 // DW_AT_name ; CHECK: // .b8 111 ; CHECK: // .b8 111 @@ -192,17 +194,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] 0x6d:0xc DW_TAG_member +; CHECK: // .b8 5 // Abbrev [5] 0x76:0xc DW_TAG_member ; CHECK: // .b8 120 // DW_AT_name ; CHECK: // .b8 0 -; CHECK: // .b32 122 // DW_AT_type +; CHECK: // .b32 131 // 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] 0x7a:0x7 DW_TAG_base_type +; CHECK: // .b8 6 // Abbrev [6] 0x83:0x7 DW_TAG_base_type ; CHECK: // .b8 105 // DW_AT_name ; CHECK: // .b8 110 ; CHECK: // .b8 116