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
This commit is contained in:
Manman Ren
2013-02-13 01:14:49 +00:00
parent b195398192
commit 4be3853fd0
4 changed files with 189 additions and 14 deletions

View File

@ -64,7 +64,8 @@ void LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const {
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 @@ bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {
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 LDVImpl::emitDebugValues(VirtRegMap *VRM) {
}
void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {
if (pImpl)
if (pImpl) {
static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);
EmitDone = true;
}
}