Index: lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp +++ lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp @@ -209,6 +209,29 @@ DbgValues, DbgLabels); LLVM_DEBUG(DbgValues.dump()); + auto AnalyzeDbgValue = [&](const MachineInstr &DV) { + bool InsidePrologue = false; + for (auto &MBB : *DV.getParent()->getParent()) + for (auto &MI : MBB) { + if (!MI.isMetaInstruction() && !MI.getFlag(MachineInstr::FrameSetup) && + MI.getDebugLoc()) + goto done; + InsidePrologue |= (&MI == &DV); + } +done: + errs() << "DV: " << DV; + if (!InsidePrologue) { + if (DV.getOperand(0).isReg()) { + if (DV.getOperand(0).getReg()) + errs() << " reg value outside prologue\n"; + else + errs() << " $noreg outside prologue\n"; + } else + errs() << " other type of value outside prologue\n"; + } else + errs() << " already inside prologue\n"; + }; + // Request labels for the full history. for (const auto &I : DbgValues) { const auto &Ranges = I.second; @@ -221,6 +244,7 @@ if (DIVar->isParameter() && getDISubprogram(DIVar->getScope())->describes(&MF->getFunction())) { LabelsBeforeInsn[Ranges.front().first] = Asm->getFunctionBegin(); + AnalyzeDbgValue(*Ranges.front().first); if (Ranges.front().first->getDebugExpression()->isFragment()) { // Mark all non-overlapping initial fragments. for (auto I = Ranges.begin(); I != Ranges.end(); ++I) { @@ -229,8 +253,10 @@ [&](DbgValueHistoryMap::InstrRange Pred) { return !Fragment->fragmentsOverlap( Pred.first->getDebugExpression()); - })) + })) { LabelsBeforeInsn[I->first] = Asm->getFunctionBegin(); + AnalyzeDbgValue(*I->first); + } else break; }