refactor code so that LLVMTargetMachine creates the asmstreamer and
authorChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:37:42 +0000 (23:37 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:37:42 +0000 (23:37 +0000)
mccontext instead of having AsmPrinter do it.  This allows other
types of MCStreamer's to be passed in.

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

19 files changed:
include/llvm/CodeGen/AsmPrinter.h
include/llvm/MC/MCStreamer.h
include/llvm/Target/TargetRegistry.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/CodeGen/LLVMTargetMachine.cpp
lib/MC/MCAsmStreamer.cpp
lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/Alpha/AsmPrinter/AlphaAsmPrinter.cpp
lib/Target/Blackfin/AsmPrinter/BlackfinAsmPrinter.cpp
lib/Target/CellSPU/AsmPrinter/SPUAsmPrinter.cpp
lib/Target/MSP430/AsmPrinter/MSP430AsmPrinter.cpp
lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp
lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.cpp
lib/Target/PIC16/AsmPrinter/PIC16AsmPrinter.h
lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
lib/Target/Sparc/AsmPrinter/SparcAsmPrinter.cpp
lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86AsmPrinter.h
lib/Target/XCore/AsmPrinter/XCoreAsmPrinter.cpp

index ba7d1385ff966db0a403d7a03f2d8eb6d00b556c..24021cdb0f30679d9f48d66b2782f2bb42c574ad 100644 (file)
@@ -149,7 +149,8 @@ namespace llvm {
 
   protected:
     explicit AsmPrinter(formatted_raw_ostream &o, TargetMachine &TM,
-                        const MCAsmInfo *T, bool V);
+                        MCContext &Ctx, MCStreamer &Streamer,
+                        const MCAsmInfo *T);
     
   public:
     virtual ~AsmPrinter();
index 2a2529b382d2f7dcab221f5f0f0ee9ffe08ba6ae..be10947969ab6d30f14cd7e27c18944cba116f4b 100644 (file)
@@ -60,6 +60,10 @@ namespace llvm {
 
     /// @name Assembly File Formatting.
     /// @{
+    
+    /// isVerboseAsm - Return true if this streamer supports verbose assembly at
+    /// all.
+    virtual bool isVerboseAsm() const { return false; }
 
     /// AddComment - Add a comment that can be emitted to the generated .s
     /// file if applicable as a QoI issue to make the output of the compiler
index d3aa867a2917007f578cbe7b56ce8d2274a94826..173899794bb96a20f321eb85e81b8f83165ddfc5 100644 (file)
 
 namespace llvm {
   class AsmPrinter;
-  class MCAsmParser;
-  class MCCodeEmitter;
   class Module;
   class MCAsmInfo;
+  class MCAsmParser;
+  class MCCodeEmitter;
+  class MCContext;
   class MCDisassembler;
   class MCInstPrinter;
+  class MCStreamer;
   class TargetAsmLexer;
   class TargetAsmParser;
   class TargetMachine;
@@ -58,8 +60,9 @@ namespace llvm {
                                                   const std::string &Features);
     typedef AsmPrinter *(*AsmPrinterCtorTy)(formatted_raw_ostream &OS,
                                             TargetMachine &TM,
-                                            const MCAsmInfo *MAI,
-                                            bool VerboseAsm);
+                                            MCContext &Ctx,
+                                            MCStreamer &Streamer,
+                                            const MCAsmInfo *MAI);
     typedef TargetAsmLexer *(*AsmLexerCtorTy)(const Target &T,
                                               const MCAsmInfo &MAI);
     typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,MCAsmParser &P);
@@ -189,12 +192,14 @@ namespace llvm {
       return TargetMachineCtorFn(*this, Triple, Features);
     }
 
-    /// createAsmPrinter - Create a target specific assembly printer pass.
+    /// createAsmPrinter - Create a target specific assembly printer pass.  This
+    /// takes ownership of the MCContext and MCStreamer objects but not the MAI.
     AsmPrinter *createAsmPrinter(formatted_raw_ostream &OS, TargetMachine &TM,
-                                 const MCAsmInfo *MAI, bool Verbose) const {
+                                 MCContext &Ctx, MCStreamer &Streamer,
+                                 const MCAsmInfo *MAI) const {
       if (!AsmPrinterCtorFn)
         return 0;
-      return AsmPrinterCtorFn(OS, TM, MAI, Verbose);
+      return AsmPrinterCtorFn(OS, TM, Ctx, Streamer, MAI);
     }
 
     /// createAsmLexer - Create a target specific assembly lexer.
@@ -547,8 +552,9 @@ namespace llvm {
 
   private:
     static AsmPrinter *Allocator(formatted_raw_ostream &OS, TargetMachine &TM,
-                                 const MCAsmInfo *MAI, bool Verbose) {
-      return new AsmPrinterImpl(OS, TM, MAI, Verbose);
+                                 MCContext &Ctx, MCStreamer &Streamer,
+                                 const MCAsmInfo *MAI) {
+      return new AsmPrinterImpl(OS, TM, Ctx, Streamer, MAI);
     }
   };
 
index 49db51ea0b6100ff68c77742bacbe6234549c831..fea06badcaee1ec8173b13dd0efa634c1c613dce 100644 (file)
@@ -55,19 +55,14 @@ STATISTIC(EmittedInsts, "Number of machine instrs printed");
 
 char AsmPrinter::ID = 0;
 AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
-                       const MCAsmInfo *T, bool VerboseAsm)
+                       MCContext &Ctx, MCStreamer &Streamer,
+                       const MCAsmInfo *T)
   : MachineFunctionPass(&ID), O(o),
     TM(tm), MAI(T), TRI(tm.getRegisterInfo()),
-
-    OutContext(*new MCContext()),
-    // FIXME: Pass instprinter to streamer.
-    OutStreamer(*createAsmStreamer(OutContext, O, *T,
-                                   TM.getTargetData()->isLittleEndian(),
-                                   VerboseAsm, 0)),
-
+    OutContext(Ctx), OutStreamer(Streamer),
     LastMI(0), LastFn(0), Counter(~0U), PrevDLT(NULL) {
   DW = 0; MMI = 0;
-  this->VerboseAsm = VerboseAsm;
+  VerboseAsm = Streamer.isVerboseAsm();
 }
 
 AsmPrinter::~AsmPrinter() {
index a4f313938d527751d74b71e233c3667f4ff8f7af..f4065924b1d701309383f4468a638a155e6090a9 100644 (file)
@@ -21,6 +21,9 @@
 #include "llvm/CodeGen/MachineFunctionAnalysis.h"
 #include "llvm/Target/TargetOptions.h"
 #include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Support/CommandLine.h"
@@ -121,10 +124,24 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
   case CGFT_ObjectFile:
     return CGFT_ErrorOccurred;
   case CGFT_AssemblyFile: {
+    MCContext *Context = new MCContext();
+    MCStreamer *AsmStreamer =
+      createAsmStreamer(*Context, Out, *getMCAsmInfo(),
+                        getTargetData()->isLittleEndian(),
+                        getVerboseAsm(),
+                        /*instprinter*/0,
+                        /*codeemitter*/0);
+    
+    // Create the AsmPrinter, which takes ownership of Context and AsmStreamer
+    // if successful.
     FunctionPass *Printer =
-      getTarget().createAsmPrinter(Out, *this, getMCAsmInfo(),
-                                   getVerboseAsm());
-    if (Printer == 0) return CGFT_ErrorOccurred;
+      getTarget().createAsmPrinter(Out, *this, *Context, *AsmStreamer,
+                                   getMCAsmInfo());
+    if (Printer == 0) {
+      delete AsmStreamer;
+      delete Context;
+      return CGFT_ErrorOccurred;
+    }
     PM.add(Printer);
     break;
   }
index b544d04f14f4931a26536d97f3da560fbdc3ded4..f3a2223dc7dda1b0863a0a7a3dfe0ad83e01f11b 100644 (file)
@@ -47,7 +47,6 @@ public:
 
   bool isLittleEndian() const { return IsLittleEndian; }
   
-  
   inline void EmitEOL() {
     // If we don't have any comments, just emit a \n.
     if (!IsVerboseAsm) {
@@ -57,6 +56,10 @@ public:
     EmitCommentsAndEOL();
   }
   void EmitCommentsAndEOL();
+
+  /// isVerboseAsm - Return true if this streamer supports verbose assembly at
+  /// all.
+  virtual bool isVerboseAsm() const { return IsVerboseAsm; }
   
   /// AddComment - Add a comment that can be emitted to the generated .s
   /// file if applicable as a QoI issue to make the output of the compiler
index f71e8ed4f864cabe71d17a837658806bcb60312f..8c53f819e4aaba0060ed1c8aad74728d84dd3bef 100644 (file)
@@ -73,8 +73,9 @@ namespace {
 
   public:
     explicit ARMAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                           const MCAsmInfo *T, bool V)
-      : AsmPrinter(O, TM, T, V), AFI(NULL), MCP(NULL) {
+                           MCContext &Ctx, MCStreamer &Streamer,
+                           const MCAsmInfo *T)
+      : AsmPrinter(O, TM, Ctx, Streamer, T), AFI(NULL), MCP(NULL) {
       Subtarget = &TM.getSubtarget<ARMSubtarget>();
     }
 
index a4198446ace41c818611f3e53272ab1953c590a2..f5122565ab9cfc509ea63ca928ec3f7f8cceb8b3 100644 (file)
@@ -37,8 +37,9 @@ namespace {
     ///
 
     explicit AlphaAsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
-                             const MCAsmInfo *T, bool V)
-      : AsmPrinter(o, tm, T, V) {}
+                             MCContext &Ctx, MCStreamer &Streamer,
+                             const MCAsmInfo *T)
+      : AsmPrinter(o, tm, Ctx, Streamer, T) {}
 
     virtual const char *getPassName() const {
       return "Alpha Assembly Printer";
index ea1bf38f6acda367e15453ead9ff7224394f1799..56a1462934528a8c162f7272b5c447375bff8fb4 100644 (file)
@@ -39,8 +39,9 @@ namespace {
   class BlackfinAsmPrinter : public AsmPrinter {
   public:
     BlackfinAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                       const MCAsmInfo *MAI, bool V)
-      : AsmPrinter(O, TM, MAI, V) {}
+                       MCContext &Ctx, MCStreamer &Streamer,
+                       const MCAsmInfo *MAI)
+      : AsmPrinter(O, TM, Ctx, Streamer, MAI) {}
 
     virtual const char *getPassName() const {
       return "Blackfin Assembly Printer";
index f190877484a78315edbeca33d161192d0bc1dda5..92736c2268c4b55b9e29d04d7b5452f2dcdf96ff 100644 (file)
@@ -38,8 +38,9 @@ namespace {
   class SPUAsmPrinter : public AsmPrinter {
   public:
     explicit SPUAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                           const MCAsmInfo *T, bool V) :
-      AsmPrinter(O, TM, T, V) {}
+                           MCContext &Ctx, MCStreamer &Streamer,
+                           const MCAsmInfo *T) :
+      AsmPrinter(O, TM, Ctx, Streamer, T) {}
 
     virtual const char *getPassName() const {
       return "STI CBEA SPU Assembly Printer";
index 2b617430823422b634ab21f260d9ee490dfb8750..40d9efea26a38e1d9941a87db433efb0a6e3863a 100644 (file)
@@ -42,8 +42,9 @@ namespace {
   class MSP430AsmPrinter : public AsmPrinter {
   public:
     MSP430AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                     const MCAsmInfo *MAI, bool V)
-      : AsmPrinter(O, TM, MAI, V) {}
+                     MCContext &Ctx, MCStreamer &Streamer,
+                     const MCAsmInfo *MAI)
+      : AsmPrinter(O, TM, Ctx, Streamer, MAI) {}
 
     virtual const char *getPassName() const {
       return "MSP430 Assembly Printer";
index 0371b825ec8ceb3ed28346b7d85b4a78bb40409a..4118e7b8a3604f7822e76451e00efa4bc81b7fb1 100644 (file)
@@ -50,8 +50,9 @@ namespace {
     const MipsSubtarget *Subtarget;
   public:
     explicit MipsAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM, 
-                            const MCAsmInfo *T, bool V)
-      : AsmPrinter(O, TM, T, V) {
+                            MCContext &Ctx, MCStreamer &Streamer,
+                            const MCAsmInfo *T)
+      : AsmPrinter(O, TM, Ctx, Streamer, T) {
       Subtarget = &TM.getSubtarget<MipsSubtarget>();
     }
 
index a7c22951a91cef338206b6d848f893bbfa434bc6..3670efcc22c6c73e8f92a2c34d0d4da20ae0ca92 100644 (file)
@@ -35,8 +35,9 @@ using namespace llvm;
 #include "PIC16GenAsmWriter.inc"
 
 PIC16AsmPrinter::PIC16AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                                 const MCAsmInfo *T, bool V)
-: AsmPrinter(O, TM, T, V), DbgInfo(O, T) {
+                                 MCContext &Ctx, MCStreamer &Streamer,
+                                 const MCAsmInfo *T)
+: AsmPrinter(O, TM, Ctx, Streamer, T), DbgInfo(O, T) {
   PTLI = static_cast<PIC16TargetLowering*>(TM.getTargetLowering());
   PMAI = static_cast<const PIC16MCAsmInfo*>(T);
   PTOF = (PIC16TargetObjectFile *)&PTLI->getObjFileLowering();
index 74ab72ccc7f65d4b54b34807ad38de8ade7f96f0..88d20f45f3a530473f430f03a61c4ebfb04d1083 100644 (file)
@@ -31,7 +31,8 @@ namespace llvm {
   class VISIBILITY_HIDDEN PIC16AsmPrinter : public AsmPrinter {
   public:
     explicit PIC16AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                             const MCAsmInfo *T, bool V);
+                             MCContext &Ctx, MCStreamer &Streamer,
+                             const MCAsmInfo *T);
   private:
     virtual const char *getPassName() const {
       return "PIC16 Assembly Printer";
index ea3549ff4afee191ccca3dba580145fb4be1b492..241bb900cfb4a0e2c23b03fbf661e8b4cd207bc2 100644 (file)
@@ -60,8 +60,9 @@ namespace {
     uint64_t LabelID;
   public:
     explicit PPCAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                           const MCAsmInfo *T, bool V)
-      : AsmPrinter(O, TM, T, V),
+                           MCContext &Ctx, MCStreamer &Streamer,
+                           const MCAsmInfo *T)
+      : AsmPrinter(O, TM, Ctx, Streamer, T),
         Subtarget(TM.getSubtarget<PPCSubtarget>()), LabelID(0) {}
 
     virtual const char *getPassName() const {
@@ -322,8 +323,9 @@ namespace {
   class PPCLinuxAsmPrinter : public PPCAsmPrinter {
   public:
     explicit PPCLinuxAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                                const MCAsmInfo *T, bool V)
-      : PPCAsmPrinter(O, TM, T, V){}
+                                MCContext &Ctx, MCStreamer &Streamer,
+                                const MCAsmInfo *T)
+      : PPCAsmPrinter(O, TM, Ctx, Streamer, T) {}
 
     virtual const char *getPassName() const {
       return "Linux PPC Assembly Printer";
@@ -347,8 +349,9 @@ namespace {
     formatted_raw_ostream &OS;
   public:
     explicit PPCDarwinAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                                 const MCAsmInfo *T, bool V)
-      : PPCAsmPrinter(O, TM, T, V), OS(O) {}
+                                 MCContext &Ctx, MCStreamer &Streamer,
+                                 const MCAsmInfo *T)
+      : PPCAsmPrinter(O, TM, Ctx, Streamer, T), OS(O) {}
 
     virtual const char *getPassName() const {
       return "Darwin PPC Assembly Printer";
@@ -826,13 +829,13 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
 ///
 static AsmPrinter *createPPCAsmPrinterPass(formatted_raw_ostream &o,
                                            TargetMachine &tm,
-                                           const MCAsmInfo *tai,
-                                           bool verbose) {
+                                           MCContext &Ctx, MCStreamer &Streamer,
+                                           const MCAsmInfo *tai) {
   const PPCSubtarget *Subtarget = &tm.getSubtarget<PPCSubtarget>();
 
   if (Subtarget->isDarwin())
-    return new PPCDarwinAsmPrinter(o, tm, tai, verbose);
-  return new PPCLinuxAsmPrinter(o, tm, tai, verbose);
+    return new PPCDarwinAsmPrinter(o, tm, Ctx, Streamer, tai);
+  return new PPCLinuxAsmPrinter(o, tm, Ctx, Streamer, tai);
 }
 
 // Force static initialization.
index 22f437ccf7f86e23dcbaba08edec1243085d032b..950daa921676ce42762c8e5475d436cce861535e 100644 (file)
@@ -29,8 +29,9 @@ namespace {
   class SparcAsmPrinter : public AsmPrinter {
   public:
     explicit SparcAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                             const MCAsmInfo *T, bool V)
-      : AsmPrinter(O, TM, T, V) {}
+                             MCContext &Ctx, MCStreamer &Streamer,
+                             const MCAsmInfo *T)
+      : AsmPrinter(O, TM, Ctx, Streamer, T) {}
 
     virtual const char *getPassName() const {
       return "Sparc Assembly Printer";
index bf312f17425f83186a11f58227da7d8c526081b0..1611ae89b983ce4c7f7500d98242264038a2dda5 100644 (file)
@@ -40,8 +40,9 @@ namespace {
   class SystemZAsmPrinter : public AsmPrinter {
   public:
     SystemZAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                      const MCAsmInfo *MAI, bool V)
-      : AsmPrinter(O, TM, MAI, V) {}
+                      MCContext &Ctx, MCStreamer &Streamer,
+                      const MCAsmInfo *MAI)
+      : AsmPrinter(O, TM, Ctx, Streamer, MAI) {}
 
     virtual const char *getPassName() const {
       return "SystemZ Assembly Printer";
index ce47b5448302e82b217bc291013a2b24beaca9a2..754a13787d3044c5c47583b19f9e7402f997e9df 100644 (file)
@@ -36,8 +36,9 @@ class VISIBILITY_HIDDEN X86AsmPrinter : public AsmPrinter {
   const X86Subtarget *Subtarget;
  public:
   explicit X86AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                            const MCAsmInfo *T, bool V)
-    : AsmPrinter(O, TM, T, V) {
+                         MCContext &Ctx, MCStreamer &Streamer,
+                         const MCAsmInfo *T)
+    : AsmPrinter(O, TM, Ctx, Streamer, T) {
     Subtarget = &TM.getSubtarget<X86Subtarget>();
   }
 
index 80d6832c241ac7fba6ad385c20abfe3eb98c4a73..f85217cdf5ebbb1cb1ccdf7470221fd69a2fb11d 100644 (file)
@@ -52,8 +52,9 @@ namespace {
     const XCoreSubtarget &Subtarget;
   public:
     explicit XCoreAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
-                             const MCAsmInfo *T, bool V)
-      : AsmPrinter(O, TM, T, V),
+                             MCContext &Ctx, MCStreamer &Streamer,
+                             const MCAsmInfo *T)
+      : AsmPrinter(O, TM, Ctx, Streamer, T),
       Subtarget(TM.getSubtarget<XCoreSubtarget>()) {}
 
     virtual const char *getPassName() const {