diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index f4065924b1d..d255492ef8f 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -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 Context(new MCContext()); + OwningPtr 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());