From 49cd6649e1246c05896fadefe2fcbc4bc1f5d221 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 5 Apr 2010 05:11:15 +0000 Subject: [PATCH] change AsmPrinter to use DwarfDebug/DwarfException directly instead of going through DwarfWriter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100405 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 16 +++++---- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 46 ++++++++++++++++---------- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 7 ++-- lib/CodeGen/AsmPrinter/DwarfDebug.h | 2 +- lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 3 +- 5 files changed, 43 insertions(+), 31 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index e827109a538..03dc67f47d0 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -42,14 +42,15 @@ namespace llvm { class MachineJumpTableInfo; class MachineModuleInfo; class MachineMove; + class MCAsmInfo; class MCInst; class MCContext; class MCSection; class MCStreamer; class MCSymbol; - class DwarfWriter; + class DwarfDebug; + class DwarfException; class Mangler; - class MCAsmInfo; class TargetLoweringObjectFile; class TargetData; class Twine; @@ -59,9 +60,6 @@ namespace llvm { /// asm writers. class AsmPrinter : public MachineFunctionPass { public: - /// DW - If available, this is a pointer to the current dwarf writer. - DwarfWriter *DW; - /// Target machine description. /// TargetMachine &TM; @@ -107,8 +105,14 @@ namespace llvm { /// If VerboseAsm is set, a pointer to the loop info for this /// function. - /// MachineLoopInfo *LI; + + /// DD - If the target supports dwarf debug info, this pointer is non-null. + DwarfDebug *DD; + + /// DE - If the target supports dwarf exception info, this pointer is + /// non-null. + DwarfException *DE; protected: explicit AsmPrinter(TargetMachine &TM, MCStreamer &Streamer); diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 89fa0c54f5f..adc64f97d9d 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -13,8 +13,9 @@ #define DEBUG_TYPE "asm-printer" #include "llvm/CodeGen/AsmPrinter.h" +#include "DwarfDebug.h" +#include "DwarfException.h" #include "llvm/Module.h" -#include "llvm/CodeGen/DwarfWriter.h" #include "llvm/CodeGen/GCMetadataPrinter.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFrameInfo.h" @@ -62,12 +63,14 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, MCStreamer &Streamer) OutContext(Streamer.getContext()), OutStreamer(Streamer), LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) { - DW = 0; MMI = 0; LI = 0; + DD = 0; DE = 0; MMI = 0; LI = 0; GCMetadataPrinters = 0; VerboseAsm = Streamer.isVerboseAsm(); } AsmPrinter::~AsmPrinter() { + assert(DD == 0 && DE == 0 && "Debug/EH info didn't get finalized"); + if (GCMetadataPrinters != 0) { gcp_map_type &GCMap = getGCMap(GCMetadataPrinters); @@ -108,7 +111,6 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { MachineFunctionPass::getAnalysisUsage(AU); AU.addRequired(); AU.addRequired(); - AU.addRequired(); if (isVerbose()) AU.addRequired(); } @@ -148,9 +150,11 @@ bool AsmPrinter::doInitialization(Module &M) { OutStreamer.AddBlankLine(); } - DW = getAnalysisIfAvailable(); - if (DW) - DW->BeginModule(&M, this); + if (MAI->doesSupportDebugInformation()) + DD = new DwarfDebug(this, &M); + + if (MAI->doesSupportExceptionHandling()) + DE = new DwarfException(this); return false; } @@ -344,8 +348,8 @@ void AsmPrinter::EmitFunctionHeader() { } // Emit pre-function debug and/or EH information. - if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) - DW->BeginFunction(MF); + if (DE) DE->BeginFunction(MF); + if (DD) DD->beginFunction(MF); } /// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the @@ -439,8 +443,7 @@ void AsmPrinter::EmitFunctionBody() { // Emit target-specific gunk before the function body. EmitFunctionBodyStart(); - bool ShouldPrintDebugScopes = - DW && MAI->doesSupportDebugInformation() &&DW->ShouldEmitDwarfDebug(); + bool ShouldPrintDebugScopes = DD && MMI->hasDebugInfo(); // Print out code for the function. bool HasAnyRealCode = false; @@ -457,7 +460,7 @@ void AsmPrinter::EmitFunctionBody() { ++EmittedInsts; if (ShouldPrintDebugScopes) - DW->BeginScope(II); + DD->beginScope(II); if (isVerbose()) EmitComments(*II, OutStreamer.GetCommentOS()); @@ -483,7 +486,7 @@ void AsmPrinter::EmitFunctionBody() { } if (ShouldPrintDebugScopes) - DW->EndScope(II); + DD->endScope(II); } } @@ -512,8 +515,9 @@ void AsmPrinter::EmitFunctionBody() { } // Emit post-function debug information. - if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) - DW->EndFunction(MF); + if (DD) DD->endFunction(MF); + if (DE) DE->EndFunction(); + MMI->EndFunction(); // Print out jump tables referenced by the function. EmitJumpTableInfo(); @@ -528,9 +532,15 @@ bool AsmPrinter::doFinalization(Module &M) { I != E; ++I) EmitGlobalVariable(I); - // Emit final debug information. - if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) - DW->EndModule(); + // Finalize debug and EH information. + if (DE) { + DE->EndModule(); + delete DE; DE = 0; + } + if (DD) { + DD->endModule(); + delete DD; DD = 0; + } // If the target wants to know about weak references, print them all. if (MAI->getWeakRefDirective()) { @@ -594,7 +604,7 @@ bool AsmPrinter::doFinalization(Module &M) { EmitEndOfAsmFile(M); delete Mang; Mang = 0; - DW = 0; MMI = 0; + MMI = 0; OutStreamer.Finish(); return false; diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 196b73bdaed..5cee67cf76f 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -299,7 +299,7 @@ DbgScope::~DbgScope() { delete Variables[j]; } -DwarfDebug::DwarfDebug(AsmPrinter *A) +DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) : Asm(A), MMI(Asm->MMI), ModuleCU(0), AbbreviationsSet(InitAbbreviationsSetSize), CurrentFnDbgScope(0), DebugTimer(0) { @@ -310,6 +310,8 @@ DwarfDebug::DwarfDebug(AsmPrinter *A) if (TimePassesIsEnabled) DebugTimer = new Timer("Dwarf Debug Writer"); + + beginModule(M); } DwarfDebug::~DwarfDebug() { for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) @@ -1791,9 +1793,6 @@ void DwarfDebug::constructSubprogramDIE(MDNode *N) { /// content. Create global DIEs and emit initial debug info sections. /// This is inovked by the target AsmPrinter. void DwarfDebug::beginModule(Module *M) { - if (!Asm->MAI->doesSupportDebugInformation()) - return; - MMI = Asm->MMI; TimeRegion Timer(DebugTimer); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 21b406eeabb..ebe3df44553 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -513,7 +513,7 @@ public: //===--------------------------------------------------------------------===// // Main entry points. // - DwarfDebug(AsmPrinter *A); + DwarfDebug(AsmPrinter *A, Module *M); virtual ~DwarfDebug(); /// beginModule - Emit all Dwarf sections that should come prior to the diff --git a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index acc0066937e..15a02dd9d45 100644 --- a/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -38,8 +38,7 @@ DwarfWriter::~DwarfWriter() { /// content. void DwarfWriter::BeginModule(Module *M, AsmPrinter *A) { DE = new DwarfException(A); - DD = new DwarfDebug(A); - DD->beginModule(M); + DD = new DwarfDebug(A, M); } /// EndModule - Emit all Dwarf sections that should come after the content.