Index: lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp +++ lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp @@ -275,9 +275,12 @@ clobberRegisterUses(RegVars, MO.getReg(), DbgValues, LiveEntries, MI); // If this is a register def operand, it may end a debug value - // range. Ignore defs of the frame register in the prologue. + // range. Ignore frame-register defs in the epilogue and prologue, + // we expect debuggers to understand that stack-locations are + // invalid outside of the function body. else if (MO.getReg() != FrameReg || - !MI.getFlag(MachineInstr::FrameSetup)) { + (!MI.getFlag(MachineInstr::FrameDestroy) && + !MI.getFlag(MachineInstr::FrameSetup))) { for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid(); ++AI) clobberRegisterUses(RegVars, *AI, DbgValues, LiveEntries, MI); Index: test/DebugInfo/COFF/pieces.ll =================================================================== --- test/DebugInfo/COFF/pieces.ll +++ test/DebugInfo/COFF/pieces.ll @@ -104,8 +104,9 @@ ; ASM: #APP ; ASM: #NO_APP ; ASM: movl [[offset_o_x]](%rsp), %eax # 4-byte Reload -; ASM: [[spill_o_x_end:\.Ltmp[0-9]+]]: ; ASM: retq +; ASM-NEXT: [[spill_o_x_end:\.Ltmp[0-9]+]]: +; ASM-NEXT: .Lfunc_end4: ; ASM-LABEL: .short 4423 # Record kind: S_GPROC32_ID @@ -231,7 +232,7 @@ ; ASM: .asciz "bitpiece_spill" # Function name ; ASM: .short 4414 # Record kind: S_LOCAL ; ASM: .asciz "o" -; ASM: .cv_def_range [[spill_o_x_start]] [[spill_o_x_end]], "E\021O\001A\000$\000\000\000" +; ASM: .cv_def_range [[spill_o_x_start]] .Lfunc_end4, "E\021O\001A\000$\000\000\000" ; OBJ-LABEL: GlobalProcIdSym { ; OBJ: Kind: S_GPROC32_ID (0x1147) Index: test/DebugInfo/X86/dbg-addr.ll =================================================================== --- test/DebugInfo/X86/dbg-addr.ll +++ test/DebugInfo/X86/dbg-addr.ll @@ -9,12 +9,8 @@ ; CHECK-LABEL: use_dbg_addr: ; CHECK: #DEBUG_VALUE: use_dbg_addr:o <- [$rsp+0] -; FIXME: Avoid the use of a single-location location list and use -; DW_AT_start_offset instead. - ; DWARF: DW_TAG_variable -; DWARF-NEXT: DW_AT_location (0x00000000 -; DWARF-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_breg7 RSP+0) +; DWARF-NEXT: DW_AT_location (DW_OP_fbreg +0) ; DWARF-NEXT: DW_AT_name ("o") Index: test/DebugInfo/X86/debug-loc-offset.mir =================================================================== --- test/DebugInfo/X86/debug-loc-offset.mir +++ test/DebugInfo/X86/debug-loc-offset.mir @@ -1,11 +1,5 @@ # RUN: llc -o - %s -start-after=patchable-function -filetype=obj -O0 -mtriple=i386-unknown-linux-gnu -dwarf-version=4 | llvm-dwarfdump -v - | FileCheck %s -# XFAIL: * -# Marked XFail due to the removal of "ChangingRegs" from -# DbgEntityHistoryCalculator, shortening the checked range to not reach the -# end of the function. Fixed by an about-to-land patch using the FrameDestroy -# flag to identify the end of functions. - # From the code: # # debug-loc-offset1.cc Index: test/DebugInfo/X86/pr19307.mir =================================================================== --- test/DebugInfo/X86/pr19307.mir +++ test/DebugInfo/X86/pr19307.mir @@ -1,11 +1,5 @@ # RUN: llc -o - %s -start-after=patchable-function -O0 | FileCheck %s -# XFAIL: * -# Marked XFail due to the removal of "ChangingRegs" from -# DbgEntityHistoryCalculator, shortening the checked range to not reach the -# end of the function. Fixed by an about-to-land patch using the FrameDestroy -# flag to identify the end of functions. - # Generated from the source file pr19307.cc: # #include # void parse_range(unsigned long long &offset, unsigned long long &limit,