Debug Info: LiveDebugVarible can remove DBG_VALUEs, make sure we emit them back.
RegisterCoalescer used to depend on LiveDebugVariable. LDV removes DBG_VALUEs
without emitting them at the end.
We fix this by removing LDV from RegisterCoalescer. Also add an assertion to
make sure we call emitDebugValues if DBG_VALUEs are removed at
runOnMachineFunction.
rdar://problem/13183203
Reviewed by Andy & Jakob
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175023 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp
index 786f353..3e31051 100644
--- a/lib/CodeGen/LiveDebugVariables.cpp
+++ b/lib/CodeGen/LiveDebugVariables.cpp
@@ -64,7 +64,8 @@
MachineFunctionPass::getAnalysisUsage(AU);
}
-LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0) {
+LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0),
+ EmitDone(false), ModifiedMF(false) {
initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry());
}
@@ -701,12 +702,17 @@
return false;
if (!pImpl)
pImpl = new LDVImpl(this);
- return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf);
+ ModifiedMF = static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf);
+ return ModifiedMF;
}
void LiveDebugVariables::releaseMemory() {
- if (pImpl)
+ if (pImpl) {
static_cast<LDVImpl*>(pImpl)->clear();
+ // Make sure we call emitDebugValues if the machine function was modified.
+ assert((!ModifiedMF || EmitDone) &&
+ "Dbg values are not emitted in LDV");
+ }
}
LiveDebugVariables::~LiveDebugVariables() {
@@ -1014,8 +1020,10 @@
}
void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {
- if (pImpl)
+ if (pImpl) {
static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);
+ EmitDone = true;
+ }
}