hoist MCContext/MCStreamer up to AsmPrinter since we're going to start creating
authorChris Lattner <sabre@nondot.org>
Mon, 27 Jul 2009 21:28:04 +0000 (21:28 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 27 Jul 2009 21:28:04 +0000 (21:28 +0000)
MCSections soon instead of Section for all targets, and we need something to
own them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77252 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h

index b9004a50027a36cb1ca855ccf3d36972541c7fe6..78de33fa72901e178f38756b08f26fc0c350fde4 100644 (file)
@@ -33,6 +33,8 @@ namespace llvm {
   class MachineConstantPoolValue;
   class MachineModuleInfo;
   class MCInst;
+  class MCContext;
+  class MCStreamer;
   class DwarfWriter;
   class Mangler;
   class Section;
@@ -81,6 +83,17 @@ namespace llvm {
     ///
     const TargetRegisterInfo *TRI;
 
+    /// OutContext - This is the context for the output file that we are
+    /// streaming.  This owns all of the global MC-related objects for the
+    /// generated translation unit.
+    MCContext &OutContext;
+    
+    /// OutStreamer - This is the MCStreamer object for the file we are
+    /// generating.  This contains the transient state for the current
+    /// translation unit that we are generating (such as the current section
+    /// etc).
+    MCStreamer &OutStreamer;
+    
     /// The current machine function.
     const MachineFunction *MF;
 
index 792db22b2d9165186e822a4ea8905079aca4eb60..0303f26d8ee8cf7a5bc3d6f80ecb3d4577f2a10f 100644 (file)
@@ -22,6 +22,8 @@
 #include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/CodeGen/DwarfWriter.h"
 #include "llvm/Analysis/DebugInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCInst.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -47,6 +49,10 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
                        const TargetAsmInfo *T, bool VDef)
   : MachineFunctionPass(&ID), FunctionNumber(0), O(o),
     TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
+
+    OutContext(*new MCContext()),
+    OutStreamer(*createAsmStreamer(OutContext, O)),
+
     IsInTextSection(false), LastMI(0), LastFn(0), Counter(~0U),
     PrevDLT(0, ~0U, ~0U) {
   DW = 0; MMI = 0;
@@ -61,6 +67,9 @@ AsmPrinter::~AsmPrinter() {
   for (gcp_iterator I = GCMetadataPrinters.begin(),
                     E = GCMetadataPrinters.end(); I != E; ++I)
     delete I->second;
+  
+  delete &OutStreamer;
+  delete &OutContext;
 }
 
 /// SwitchToTextSection - Switch to the specified text section of the executable
@@ -270,6 +279,8 @@ bool AsmPrinter::doFinalization(Module &M) {
 
   delete Mang; Mang = 0;
   DW = 0; MMI = 0;
+  
+  OutStreamer.Finish();
   return false;
 }
 
index 90cbf8085a721bfebb2aa1fb4eaafb1314860fee..88c6434497340ce0c7824891d99789cd73aa8912 100644 (file)
@@ -751,18 +751,6 @@ void X86ATTAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
   printInstruction(MI);
 }
 
-/// doInitialization
-bool X86ATTAsmPrinter::doInitialization(Module &M) {
-  if (NewAsmPrinter) {
-    Context = new MCContext();
-    // FIXME: Send this to "O" instead of outs().  For now, we force it to
-    // stdout to make it easy to compare.
-    Streamer = createAsmStreamer(*Context, outs());
-  }
-  
-  return AsmPrinter::doInitialization(M);
-}
-
 void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
   const TargetData *TD = TM.getTargetData();
 
@@ -988,18 +976,7 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
   }
   
   // Do common shutdown.
-  bool Changed = AsmPrinter::doFinalization(M);
-  
-  if (NewAsmPrinter) {
-    Streamer->Finish();
-    
-    delete Streamer;
-    delete Context;
-    Streamer = 0;
-    Context = 0;
-  }
-  
-  return Changed;
+  return AsmPrinter::doFinalization(M);
 }
 
 // Include the auto-generated portion of the assembly writer.
index ab81659eb97806977662d9c8921c05751f10b027..65ef5ff6e4bfebefd07a481747b58be6d2322da5 100644 (file)
@@ -33,16 +33,11 @@ class MCStreamer;
 
 class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
   const X86Subtarget *Subtarget;
-  
-  MCContext *Context;
-  MCStreamer *Streamer;
  public:
   explicit X86ATTAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
                             const TargetAsmInfo *T, bool V)
     : AsmPrinter(O, TM, T, V) {
     Subtarget = &TM.getSubtarget<X86Subtarget>();
-    Context = 0;
-    Streamer = 0;
   }
 
   virtual const char *getPassName() const {
@@ -60,7 +55,6 @@ class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
     AsmPrinter::getAnalysisUsage(AU);
   }
 
-  bool doInitialization(Module &M);
   bool doFinalization(Module &M);
 
   /// printInstruction - This method is automatically generated by tablegen