From 546d0fbd9718ea5ad422faaeffea939fe7312408 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Thu, 8 Feb 2007 01:41:07 +0000 Subject: [PATCH] The new version of how to add passes to emit files. We explicitly call a function to add the file writers between calls to add the passes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34035 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llc/llc.cpp | 26 +++++++++++++++++++++++++- tools/lto/lto.cpp | 28 ++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index d8b596db8d7..376ad768b0f 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Bytecode/Reader.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" @@ -248,7 +249,30 @@ int main(int argc, char **argv) { #endif // Ask the target to add backend passes as necessary. - if (Target.addPassesToEmitFile(Passes, *Out, FileType, Fast)) { + MachineCodeEmitter *MCE = 0; + + switch (Target.addPassesToEmitFile(Passes, *Out, FileType, Fast)) { + default: + assert(0 && "Invalid file model!"); + return 1; + case FileModel::Error: + std::cerr << argv[0] << ": target does not support generation of this" + << " file type!\n"; + if (Out != &std::cout) delete Out; + // And the Out file is empty and useless, so remove it now. + sys::Path(OutputFilename).eraseFromDisk(); + return 1; + case FileModel::AsmFile: + break; + case FileModel::MachOFile: + MCE = AddMachOWriter(Passes, *Out, Target); + break; + case FileModel::ElfFile: + MCE = AddELFWriter(Passes, *Out, Target); + break; + } + + if (Target.addPassesToEmitFileFinish(Passes, MCE, Fast)) { std::cerr << argv[0] << ": target does not support generation of this" << " file type!\n"; if (Out != &std::cout) delete Out; diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp index d7dec3f7fa1..816b1d8ebbc 100644 --- a/tools/lto/lto.cpp +++ b/tools/lto/lto.cpp @@ -27,6 +27,7 @@ #include "llvm/System/Signals.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/Verifier.h" +#include "llvm/CodeGen/FileWriters.h" #include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -308,8 +309,31 @@ LTO::optimize(Module *M, std::ostream &Out, new FunctionPassManager(new ExistingModuleProvider(M)); CodeGenPasses->add(new TargetData(*Target->getTargetData())); - Target->addPassesToEmitFile(*CodeGenPasses, Out, TargetMachine::AssemblyFile, - true); + + MachineCodeEmitter *MCE = 0; + + switch (Target->addPassesToEmitFile(*CodeGenPasses, Out, + TargetMachine::AssemblyFile, true)) { + default: + assert(0 && "Invalid file model!"); + return LTO_UNKNOWN; + case FileModel::Error: + // FIXME: Error... + return LTO_UNKNOWN; + case FileModel::AsmFile: + break; + case FileModel::MachOFile: + MCE = AddMachOWriter(*CodeGenPasses, Out, *Target); + break; + case FileModel::ElfFile: + MCE = AddELFWriter(*CodeGenPasses, Out, *Target); + break; + } + + if (Target->addPassesToEmitFileFinish(*CodeGenPasses, MCE, true)) { + // FIXME: Error... + return LTO_UNKNOWN; + } // Run our queue of passes all at once now, efficiently. Passes.run(*M); -- 2.34.1