diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-02 23:45:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-02 23:45:17 +0000 |
commit | 6cafdcc9afb294b62962f94f03cc48d6b18712d0 (patch) | |
tree | a3a1dbeacbffaff7f7795760ad06dd6f613c976f /lib/CodeGen/LLVMTargetMachine.cpp | |
parent | 56591ab218639d8a6e4c756ca37adaf20215c3b6 (diff) |
use OwningPtr and factor code better.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95156 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LLVMTargetMachine.cpp')
-rw-r--r-- | lib/CodeGen/LLVMTargetMachine.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index f4065924b1..d255492ef8 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<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()); |