diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index ffeb44da7bc..2cd477e8065 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -47,6 +47,7 @@ namespace llvm { class MCSection; class MCStreamer; class MCSymbol; + class MDNode; class DwarfWriter; class Mangler; class MCAsmInfo; @@ -137,6 +138,9 @@ namespace llvm { mutable unsigned Counter; mutable unsigned SetCounter; + // Private state for processDebugLoc() + mutable const MDNode *PrevDLT; + protected: explicit AsmPrinter(formatted_raw_ostream &o, TargetMachine &TM, MCStreamer &Streamer); diff --git a/include/llvm/CodeGen/DwarfWriter.h b/include/llvm/CodeGen/DwarfWriter.h index 494400ee2c9..3c7f8024d9c 100644 --- a/include/llvm/CodeGen/DwarfWriter.h +++ b/include/llvm/CodeGen/DwarfWriter.h @@ -83,11 +83,19 @@ public: /// void EndFunction(const MachineFunction *MF); + /// RecordSourceLine - Register a source line with debug info. Returns the + /// unique label that was emitted and which provides correspondence to + /// the source line list. + MCSymbol *RecordSourceLine(unsigned Line, unsigned Col, MDNode *Scope); + + /// getRecordSourceLineCount - Count source lines. + unsigned getRecordSourceLineCount(); + /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should /// be emitted. bool ShouldEmitDwarfDebug() const; - void BeginScope(const MachineInstr *MI); + void BeginScope(const MachineInstr *MI, MCSymbol *Label); void EndScope(const MachineInstr *MI); }; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 7601199488e..1d4f7f7ae68 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -62,7 +62,7 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, TM(tm), MAI(tm.getMCAsmInfo()), TRI(tm.getRegisterInfo()), OutContext(Streamer.getContext()), OutStreamer(Streamer), - LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) { + LastMI(0), LastFn(0), Counter(~0U), SetCounter(0), PrevDLT(NULL) { DW = 0; MMI = 0; VerboseAsm = Streamer.isVerboseAsm(); } @@ -1337,12 +1337,25 @@ void AsmPrinter::processDebugLoc(const MachineInstr *MI, if (!MAI || !DW || !MAI->doesSupportDebugInformation() || !DW->ShouldEmitDwarfDebug()) return; + if (MI->getOpcode() == TargetOpcode::DBG_VALUE) + return; + DebugLoc DL = MI->getDebugLoc(); + if (DL.isUnknown()) + return; + DILocation CurDLT = MF->getDILocation(DL); + if (!CurDLT.getScope().Verify()) + return; - if (!BeforePrintingInsn) + if (!BeforePrintingInsn) { // After printing instruction DW->EndScope(MI); - else - DW->BeginScope(MI); + } else if (CurDLT.getNode() != PrevDLT) { + MCSymbol *L = DW->RecordSourceLine(CurDLT.getLineNumber(), + CurDLT.getColumnNumber(), + CurDLT.getScope().getNode()); + DW->BeginScope(MI, L); + PrevDLT = CurDLT.getNode(); + } } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 8861699f4bb..e2421eb0702 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -296,7 +296,7 @@ DwarfDebug::DwarfDebug(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T) : DwarfPrinter(OS, A, T), ModuleCU(0), AbbreviationsSet(InitAbbreviationsSetSize), Abbreviations(), DIEValues(), SectionSourceLines(), didInitial(false), shouldEmit(false), - CurrentFnDbgScope(0), PrevDILoc(0), DebugTimer(0) { + CurrentFnDbgScope(0), DebugTimer(0) { NextStringPoolNumber = 0; if (TimePassesIsEnabled) DebugTimer = new Timer("Dwarf Debug Writer"); @@ -2036,49 +2036,19 @@ void DwarfDebug::collectVariableInfo() { } } -/// beginScope - Process beginning of a scope. -void DwarfDebug::beginScope(const MachineInstr *MI) { - if (MI->getOpcode() == TargetOpcode::DBG_VALUE) - return; - - DebugLoc DL = MI->getDebugLoc(); - if (DL.isUnknown()) - return; - DILocation DILoc = MF->getDILocation(DL); - if (!DILoc.getScope().Verify()) - return; - - if(DILoc.getNode() == PrevDILoc) - return; - +/// beginScope - Process beginning of a scope starting at Label. +void DwarfDebug::beginScope(const MachineInstr *MI, MCSymbol *Label) { InsnToDbgScopeMapTy::iterator I = DbgScopeBeginMap.find(MI); if (I == DbgScopeBeginMap.end()) return; - - MCSymbol *Label = recordSourceLine(DILoc.getLineNumber(), - DILoc.getColumnNumber(), - DILoc.getScope().getNode()); - ScopeVector &SD = I->second; for (ScopeVector::iterator SDI = SD.begin(), SDE = SD.end(); SDI != SDE; ++SDI) (*SDI)->setStartLabel(Label); - - PrevDILoc = DILoc.getNode(); } /// endScope - Process end of a scope. void DwarfDebug::endScope(const MachineInstr *MI) { - if (MI->getOpcode() == TargetOpcode::DBG_VALUE) - return; - - DebugLoc DL = MI->getDebugLoc(); - if (DL.isUnknown()) - return; - DILocation DILoc = MF->getDILocation(DL); - if (!DILoc.getScope().Verify()) - return; - InsnToDbgScopeMapTy::iterator I = DbgScopeEndMap.find(MI); if (I == DbgScopeEndMap.end()) return; diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 4a29091128a..d173f322b68 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -184,10 +184,6 @@ class DwarfDebug : public DwarfPrinter { /// function. DenseMap CompileUnitOffsets; - /// Previous instruction's location information. This is used to determine - /// label location to indicate scope boundries in dwarf debug info. - mutable const MDNode *PrevDILoc; - /// DebugTimer - Timer for the Dwarf debug writer. Timer *DebugTimer; @@ -546,8 +542,8 @@ public: /// collectVariableInfo - Populate DbgScope entries with variables' info. void collectVariableInfo(); - /// beginScope - Process beginning of a scope. - void beginScope(const MachineInstr *MI); + /// beginScope - Process beginning of a scope starting at Label. + void beginScope(const MachineInstr *MI, MCSymbol *Label); /// endScope - Prcess end of a scope. void endScope(const MachineInstr *MI); diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index a2d7ab1224e..9fd4c447854 100644 --- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -73,14 +73,27 @@ void DwarfWriter::EndFunction(const MachineFunction *MF) { MMI->EndFunction(); } +/// RecordSourceLine - Register a source line with debug info. Returns the +/// unique label that was emitted and which provides correspondence to +/// the source line list. +MCSymbol *DwarfWriter::RecordSourceLine(unsigned Line, unsigned Col, + MDNode *Scope) { + return DD->recordSourceLine(Line, Col, Scope); +} + +/// getRecordSourceLineCount - Count source lines. +unsigned DwarfWriter::getRecordSourceLineCount() { + return DD->getSourceLineCount(); +} + /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should /// be emitted. bool DwarfWriter::ShouldEmitDwarfDebug() const { return DD && DD->ShouldEmitDwarfDebug(); } -void DwarfWriter::BeginScope(const MachineInstr *MI) { - DD->beginScope(MI); +void DwarfWriter::BeginScope(const MachineInstr *MI, MCSymbol *L) { + DD->beginScope(MI, L); } void DwarfWriter::EndScope(const MachineInstr *MI) { DD->endScope(MI);