refactor code so that LLVMTargetMachine creates the asmstreamer and 
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
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp
index a4f3139..f406592 100644
--- a/lib/CodeGen/LLVMTargetMachine.cpp
+++ b/lib/CodeGen/LLVMTargetMachine.cpp
@@ -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 @@
   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;
   }