if -bitcode is specified, read and write a bitcode file instead of a bytecode file.
authorChris Lattner <sabre@nondot.org>
Sun, 6 May 2007 02:42:03 +0000 (02:42 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 6 May 2007 02:42:03 +0000 (02:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36830 91177308-0d34-0410-b5e6-96231b3b80d8

tools/opt/Makefile
tools/opt/opt.cpp

index 0ea3a7fc06a57638437e90466affe9c369150831..76cb5b127214969c2fb81786e8d24b368c439166 100644 (file)
@@ -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
index e29e9f6ab8c987b97d80cc2cc7a3b13998e2b554..6c770858930468ab888fbc35be7b049fbaa6d74b 100644 (file)
@@ -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());