change AsmPrinter to use DwarfDebug/DwarfException directly
authorChris Lattner <sabre@nondot.org>
Mon, 5 Apr 2010 05:11:15 +0000 (05:11 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 5 Apr 2010 05:11:15 +0000 (05:11 +0000)
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
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h
lib/CodeGen/AsmPrinter/DwarfWriter.cpp

index e827109a538cc2a420e934e54c3ad8c62b027874..03dc67f47d075d786039064927ab1e1550fd83f8 100644 (file)
@@ -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);
index 89fa0c54f5f00052411c9c62d12814c85a5da53d..adc64f97d9d30ef2e1c671cd9785b26d2057e7b2 100644 (file)
@@ -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<MachineModuleInfo>();
   AU.addRequired<GCModuleInfo>();
-  AU.addRequired<DwarfWriter>();
   if (isVerbose())
     AU.addRequired<MachineLoopInfo>();
 }
@@ -148,9 +150,11 @@ bool AsmPrinter::doInitialization(Module &M) {
     OutStreamer.AddBlankLine();
   }
 
-  DW = getAnalysisIfAvailable<DwarfWriter>();
-  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;
index 196b73bdaed65246c434e1e72c13046f1cd1855d..5cee67cf76f3af0c0f417383cb2a40a1df760d8a 100644 (file)
@@ -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);
index 21b406eeabb7f53f397fba702f50c1a573399b85..ebe3df445534fbc1070005db06a1e2925b2f69ec 100644 (file)
@@ -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
index acc0066937ea6e4a3794fb4803b48d48984e6ebb..15a02dd9d452d32499f0086032db961b2f90ba41 100644 (file)
@@ -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.