From 014f98c7e5cbf41104ab9a86e32b8ce869982934 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Wed, 14 Jun 2006 11:35:03 +0000 Subject: [PATCH] Place dwarf headers at earliest possible point. Well behaved when skipping functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28781 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/DwarfWriter.h | 22 +++++-- lib/CodeGen/DwarfWriter.cpp | 98 +++++++++++++++------------- lib/CodeGen/MachineDebugInfo.cpp | 8 +-- lib/Target/PowerPC/PPCAsmPrinter.cpp | 6 +- lib/Target/X86/X86ATTAsmPrinter.cpp | 5 +- 5 files changed, 81 insertions(+), 58 deletions(-) diff --git a/include/llvm/CodeGen/DwarfWriter.h b/include/llvm/CodeGen/DwarfWriter.h index 1575fbe785f..cfa90f2ed14 100644 --- a/include/llvm/CodeGen/DwarfWriter.h +++ b/include/llvm/CodeGen/DwarfWriter.h @@ -106,6 +106,15 @@ protected: /// bool didInitial; + /// shouldEmit - Flag to indicate if debug information should be emitted. + /// + bool shouldEmit; + + /// IsNormalText - Flag to indicate if routine is not special case text + /// (coalesced.) + // FIXME - should be able to debug coalesced functions. + bool IsNormalText; + /// SubprogramCount - The running count of functions being compiled. /// unsigned SubprogramCount; @@ -372,7 +381,7 @@ private: /// EmitInitial - Emit initial Dwarf declarations. /// - void EmitInitial() const; + void EmitInitial(); /// EmitDIE - Recusively Emits a debug information entry. /// @@ -448,9 +457,8 @@ private: void ConstructSubprogramDIEs(); /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. - /// When called it also checks to see if debug info is newly available. if - /// so the initial Dwarf headers are emitted. - bool ShouldEmitDwarf(); + /// + bool ShouldEmitDwarf() const { return shouldEmit; } public: @@ -475,11 +483,15 @@ public: /// BeginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. - void BeginFunction(MachineFunction *MF); + void BeginFunction(MachineFunction *MF, bool IsNormalText); /// EndFunction - Gather and emit post-function debug information. /// void EndFunction(); + + /// NonFunction - Function does not have a true body. + /// + void NonFunction(); }; } // end llvm namespace diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 9aff4382ea5..3aadd97f2a1 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -1646,7 +1646,11 @@ void DwarfWriter::ConstructRootScope(DebugScope *RootScope) { /// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc /// tools to recognize the object file contains Dwarf information. /// -void DwarfWriter::EmitInitial() const { +void DwarfWriter::EmitInitial() { + // Check to see if we already emitted intial headers. + if (didInitial) return; + didInitial = true; + // Dwarf sections base addresses. Asm->SwitchToDataSection(DwarfFrameSection, 0); EmitLabel("section_frame", 0); @@ -1676,6 +1680,9 @@ void DwarfWriter::EmitInitial() const { EmitLabel("text_begin", 0); Asm->SwitchToDataSection(DataSection, 0); EmitLabel("data_begin", 0); + + // Emit common frame information. + EmitInitialDebugFrame(); } /// EmitDIE - Recusively Emits a debug information entry. @@ -2286,35 +2293,6 @@ void DwarfWriter::ConstructSubprogramDIEs() { } } -/// ShouldEmitDwarf - Determine if Dwarf declarations should be made. -/// -bool DwarfWriter::ShouldEmitDwarf() { - // Check if debug info is present. - if (!DebugInfo || !DebugInfo->hasInfo()) return false; - - // Make sure initial declarations are made. - if (!didInitial) { - EmitInitial(); - - // Emit common frame information. - EmitInitialDebugFrame(); - - // Create all the compile unit DIEs. - ConstructCompileUnitDIEs(); - - // Create DIEs for each of the externally visible global variables. - ConstructGlobalDIEs(); - - // Create DIEs for each of the externally visible subprograms. - ConstructSubprogramDIEs(); - - didInitial = true; - } - - // Okay to emit. - return true; -} - //===----------------------------------------------------------------------===// // Main entry points. // @@ -2328,6 +2306,8 @@ DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A) , MF(NULL) , DebugInfo(NULL) , didInitial(false) +, shouldEmit(false) +, IsNormalText(false) , SubprogramCount(0) , CompileUnits() , Abbreviations() @@ -2363,7 +2343,23 @@ DwarfWriter::~DwarfWriter() { /// SetDebugInfo - Set DebugInfo when it's known that pass manager has /// created it. Set by the target AsmPrinter. void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) { - DebugInfo = DI; + // Make sure initial declarations are made. + if (!DebugInfo && DI->hasInfo()) { + DebugInfo = DI; + shouldEmit = true; + + // Emit initial sections + EmitInitial(); + + // Create all the compile unit DIEs. + ConstructCompileUnitDIEs(); + + // Create DIEs for each of the externally visible global variables. + ConstructGlobalDIEs(); + + // Create DIEs for each of the externally visible subprograms. + ConstructSubprogramDIEs(); + } } /// BeginModule - Emit all Dwarf sections that should come prior to the content. @@ -2420,17 +2416,24 @@ void DwarfWriter::EndModule() { /// BeginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. -void DwarfWriter::BeginFunction(MachineFunction *MF) { +void DwarfWriter::BeginFunction(MachineFunction *MF, bool IsNormalText) { this->MF = MF; + // FIXME - should be able to debug coalesced functions. + this->IsNormalText = IsNormalText; - // Begin accumulating function debug information. - DebugInfo->BeginFunction(MF); - - if (!ShouldEmitDwarf()) return; - EOL("Dwarf Begin Function"); + // FIXME - should be able to debug coalesced functions. + if (IsNormalText) { + // Begin accumulating function debug information. + DebugInfo->BeginFunction(MF); + + if (!ShouldEmitDwarf()) return; + EOL("Dwarf Begin Function"); - // Assumes in correct section after the entry point. - EmitLabel("func_begin", ++SubprogramCount); + // Assumes in correct section after the entry point. + EmitLabel("func_begin", ++SubprogramCount); + } else { + ShouldEmitDwarf(); + } } /// EndFunction - Gather and emit post-function debug information. @@ -2439,14 +2442,17 @@ void DwarfWriter::EndFunction() { if (!ShouldEmitDwarf()) return; EOL("Dwarf End Function"); - // Define end label for subprogram. - EmitLabel("func_end", SubprogramCount); - - // Construct scopes for subprogram. - ConstructRootScope(DebugInfo->getRootScope()); + // FIXME - should be able to debug coalesced functions. + if (IsNormalText) { + // Define end label for subprogram. + EmitLabel("func_end", SubprogramCount); - // Emit function frame information. - EmitFunctionDebugFrame(); + // Construct scopes for subprogram. + ConstructRootScope(DebugInfo->getRootScope()); + + // Emit function frame information. + EmitFunctionDebugFrame(); + } // Clear function debug information. DebugInfo->EndFunction(); diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 2e3c034898d..09d0d2b0808 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -262,10 +262,10 @@ public: Elements.push_back(ConstantUInt::get(Type::UIntTy, Field)); } virtual void Apply(int64_t &Field) { - Elements.push_back(ConstantSInt::get(Type::IntTy, Field)); + Elements.push_back(ConstantSInt::get(Type::LongTy, Field)); } virtual void Apply(uint64_t &Field) { - Elements.push_back(ConstantUInt::get(Type::UIntTy, Field)); + Elements.push_back(ConstantUInt::get(Type::ULongTy, Field)); } virtual void Apply(bool &Field) { Elements.push_back(ConstantBool::get(Field)); @@ -345,10 +345,10 @@ public: Fields.push_back(Type::UIntTy); } virtual void Apply(int64_t &Field) { - Fields.push_back(Type::IntTy); + Fields.push_back(Type::LongTy); } virtual void Apply(uint64_t &Field) { - Fields.push_back(Type::UIntTy); + Fields.push_back(Type::ULongTy); } virtual void Apply(bool &Field) { Fields.push_back(Type::BoolTy); diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 8d520e7a956..44ab7f83c2d 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -488,8 +488,9 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) { /// method to print assembly for each instruction. /// bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - // FIXME - is this the earliest this can be set? DW.SetDebugInfo(&getAnalysis()); + // FIXME - should be able to debug coalesced functions. + bool IsNormalText = true; SetupMachineFunction(MF); O << "\n\n"; @@ -517,13 +518,14 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F); O << "\t.globl\t" << CurrentFnName << "\n"; O << "\t.weak_definition\t" << CurrentFnName << "\n"; + IsNormalText = false; break; } EmitAlignment(4, F); O << CurrentFnName << ":\n"; // Emit pre-function debug information. - DW.BeginFunction(&MF); + DW.BeginFunction(&MF, IsNormalText); // Print out code for the function. for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 3e690aa398d..f103bccd318 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -29,6 +29,8 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { // Let PassManager know we need debug information and relay // the MachineDebugInfo address on to DwarfWriter. DW.SetDebugInfo(&getAnalysis()); + // FIXME - should be able to debug coalesced functions. + bool IsNormalText = true; SetupMachineFunction(MF); O << "\n\n"; @@ -72,13 +74,14 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { SwitchToTextSection("", F); O << "\t.weak " << CurrentFnName << "\n"; } + IsNormalText = false; break; } O << CurrentFnName << ":\n"; if (Subtarget->TargetType == X86Subtarget::isDarwin) { // Emit pre-function debug information. - DW.BeginFunction(&MF); + DW.BeginFunction(&MF, IsNormalText); } // Print out code for the function. -- 2.34.1