use OwningPtr and factor code better.
authorChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:45:17 +0000 (23:45 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 2 Feb 2010 23:45:17 +0000 (23:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95156 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LLVMTargetMachine.cpp

index f4065924b1d701309383f4468a638a155e6090a9..d255492ef8f886ec962f1bc80a98758411afab6a 100644 (file)
@@ -26,6 +26,7 @@
 #include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetRegistry.h"
 #include "llvm/Transforms/Scalar.h"
+#include "llvm/ADT/OwningPtr.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/FormattedStream.h"
@@ -119,34 +120,35 @@ LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
   if (addCommonCodeGenPasses(PM, OptLevel))
     return CGFT_ErrorOccurred;
 
+  OwningPtr<MCContext> Context(new MCContext());
+  OwningPtr<MCStreamer> AsmStreamer;
+
   switch (FileType) {
   default:
   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, *Context, *AsmStreamer,
-                                   getMCAsmInfo());
-    if (Printer == 0) {
-      delete AsmStreamer;
-      delete Context;
-      return CGFT_ErrorOccurred;
-    }
-    PM.add(Printer);
+    AsmStreamer.reset(createAsmStreamer(*Context, Out, *getMCAsmInfo(),
+                                        getTargetData()->isLittleEndian(),
+                                        getVerboseAsm(), /*instprinter*/0,
+                                        /*codeemitter*/0));
     break;
   }
   }
   
+  // Create the AsmPrinter, which takes ownership of Context and AsmStreamer
+  // if successful.
+  FunctionPass *Printer =
+  getTarget().createAsmPrinter(Out, *this, *Context, *AsmStreamer,
+                               getMCAsmInfo());
+  if (Printer == 0)
+    return CGFT_ErrorOccurred;
+  
+  // If successful, createAsmPrinter took ownership of AsmStreamer and Context.
+  Context.take(); AsmStreamer.take();
+  
+  PM.add(Printer);
+  
   // Make sure the code model is set.
   setCodeModelForStatic();
   PM.add(createGCInfoDeleter());