diff options
author | Chris Lattner <sabre@nondot.org> | 2007-05-06 02:42:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-05-06 02:42:03 +0000 |
commit | b330e38f4ab1096403ade60028456cae9d0c67f3 (patch) | |
tree | 2d4632f44b95ede55bc9afe29315ee19662507f8 /tools/opt/opt.cpp | |
parent | f9f2e831709f05c0cacd643a908ba2862cb09a32 (diff) | |
download | external_llvm-b330e38f4ab1096403ade60028456cae9d0c67f3.zip external_llvm-b330e38f4ab1096403ade60028456cae9d0c67f3.tar.gz external_llvm-b330e38f4ab1096403ade60028456cae9d0c67f3.tar.bz2 |
if -bitcode is specified, read and write a bitcode file instead of a bytecode file.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36830 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt/opt.cpp')
-rw-r--r-- | tools/opt/opt.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index e29e9f6..6c77085 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -16,6 +16,7 @@ #include "llvm/PassManager.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Bytecode/WriteBytecodePass.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Assembly/PrintModulePass.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/LoopPass.h" @@ -24,6 +25,7 @@ #include "llvm/Support/PassNameParser.h" #include "llvm/System/Signals.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/Streams.h" #include "llvm/Support/SystemUtils.h" @@ -35,6 +37,8 @@ #include <algorithm> using namespace llvm; +static cl::opt<bool> Bitcode("bitcode"); + // The OptimizationList is automatically populated with registered Passes by the // PassNameParser. // @@ -262,8 +266,26 @@ int main(int argc, char **argv) { std::string ErrorMessage; // Load the input module... - std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename, - Compressor::decompressToNewBuffer, &ErrorMessage)); + std::auto_ptr<Module> M; + if (Bitcode) { + MemoryBuffer *Buffer; + if (InputFilename == "-") { + Buffer = MemoryBuffer::getSTDIN(); + } else { + Buffer = MemoryBuffer::getFile(&InputFilename[0], InputFilename.size()); + } + + if (Buffer == 0) + ErrorMessage = "Error reading file '" + InputFilename + "'"; + else + M.reset(ParseBitcodeFile(Buffer, &ErrorMessage)); + + delete Buffer; + } else { + M.reset(ParseBytecodeFile(InputFilename, + Compressor::decompressToNewBuffer, + &ErrorMessage)); + } if (M.get() == 0) { cerr << argv[0] << ": "; if (ErrorMessage.size()) @@ -355,8 +377,12 @@ int main(int argc, char **argv) { // Write bytecode out to disk or cout as the last step... OStream L(*Out); - if (!NoOutput && !AnalyzeOnly) - Passes.add(new WriteBytecodePass(&L, false, !NoCompress)); + if (!NoOutput && !AnalyzeOnly) { + if (Bitcode) + Passes.add(CreateBitcodeWriterPass(*Out)); + else + Passes.add(new WriteBytecodePass(&L, false, !NoCompress)); + } // Now that we have all of the passes ready, run them. Passes.run(*M.get()); |