From b330e38f4ab1096403ade60028456cae9d0c67f3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 6 May 2007 02:42:03 +0000 Subject: [PATCH] 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 --- tools/opt/Makefile | 2 +- tools/opt/opt.cpp | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/tools/opt/Makefile b/tools/opt/Makefile index 0ea3a7fc06a..76cb5b12721 100644 --- a/tools/opt/Makefile +++ b/tools/opt/Makefile @@ -10,6 +10,6 @@ LEVEL = ../.. TOOLNAME = opt REQUIRES_EH := 1 -LINK_COMPONENTS := bcreader bcwriter instrumentation scalaropts ipo +LINK_COMPONENTS := bcreader bcwriter bitreader bitwriter instrumentation scalaropts ipo include $(LEVEL)/Makefile.common diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index e29e9f6ab8c..6c770858930 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 using namespace llvm; +static cl::opt 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 M(ParseBytecodeFile(InputFilename, - Compressor::decompressToNewBuffer, &ErrorMessage)); + std::auto_ptr 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());