[WebAssembly] Fix debug locations for ExplicitLocals pass

This is a reworked version of the reverted patch: https://reviews.llvm.org/D112487
Note that
a) it doesn't need the test changes anymore, and
b) I checked at least locally it passes other.test_pthread_lsan_leak

Differential Revision: https://reviews.llvm.org/D113208
This commit is contained in:
Wouter van Oortmerssen 2021-10-25 14:00:42 -07:00
parent 5de4864f74
commit a320f877ce
1 changed files with 8 additions and 3 deletions

View File

@ -379,9 +379,14 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) {
const TargetRegisterClass *RC = MRI.getRegClass(OldReg);
Register NewReg = MRI.createVirtualRegister(RC);
unsigned Opc = getLocalGetOpcode(RC);
InsertPt =
BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc), NewReg)
.addImm(LocalId);
// Use a InsertPt as our DebugLoc, since MI may be discontinuous from
// the where this local is being inserted, causing non-linear stepping
// in the debugger or function entry points where variables aren't live
// yet. Alternative is previous instruction, but that is strictly worse
// since it can point at the previous statement.
// See crbug.com/1251909, crbug.com/1249745
InsertPt = BuildMI(MBB, InsertPt, InsertPt->getDebugLoc(),
TII->get(Opc), NewReg).addImm(LocalId);
MO.setReg(NewReg);
MFI.stackifyVReg(MRI, NewReg);
Changed = true;