diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp --- a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -379,8 +379,13 @@ const TargetRegisterClass *RC = MRI.getRegClass(OldReg); Register NewReg = MRI.createVirtualRegister(RC); unsigned Opc = getLocalGetOpcode(RC); + // Use a blank DebugLoc, because InsertPt may be discontinuous from + // the usage of this value, causing non-linear stepping in the + // debugger or function entry points where variables aren't live yet. + // See crbug.com/1251909, crbug.com/1249745 + DebugLoc DL; InsertPt = - BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc), NewReg) + BuildMI(MBB, InsertPt, DL, TII->get(Opc), NewReg) .addImm(LocalId); MO.setReg(NewReg); MFI.stackifyVReg(MRI, NewReg); diff --git a/llvm/test/MC/WebAssembly/debug-localvar.ll b/llvm/test/MC/WebAssembly/debug-localvar.ll --- a/llvm/test/MC/WebAssembly/debug-localvar.ll +++ b/llvm/test/MC/WebAssembly/debug-localvar.ll @@ -101,8 +101,8 @@ ; CHECK-NEXT: DW_AT_type (0x00000073 "int") ; CHECK-LABEL: DW_TAG_lexical_block -; CHECK-NEXT: DW_AT_low_pc (0x0000001c) -; CHECK-NEXT: DW_AT_high_pc (0x0000002d) +; CHECK-NEXT: DW_AT_low_pc (0x0000001e) +; CHECK-NEXT: DW_AT_high_pc (0x0000002f) ; CHECK-LABEL: DW_TAG_variable ; CHECK-NEXT: DW_AT_location (DW_OP_fbreg +4)