diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp
index 223475e..cd9380d 100644
--- a/tools/llvm-link/llvm-link.cpp
+++ b/tools/llvm-link/llvm-link.cpp
@@ -15,10 +15,12 @@
 #include "llvm/Linker.h"
 #include "llvm/Module.h"
 #include "llvm/Analysis/Verifier.h"
+#include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Bytecode/Writer.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/System/Signals.h"
 #include "llvm/System/Path.h"
@@ -27,6 +29,8 @@
 #include <memory>
 using namespace llvm;
 
+cl::opt<bool> Bitcode("bitcode");
+
 static cl::list<std::string>
 InputFilenames(cl::Positional, cl::OneOrMore,
                cl::desc("<input bytecode files>"));
@@ -59,9 +63,22 @@
   std::string ErrorMessage;
   if (Filename.exists()) {
     if (Verbose) cerr << "Loading '" << Filename.c_str() << "'\n";
-    Module* Result = ParseBytecodeFile(Filename.toString(), 
-                                       Compressor::decompressToNewBuffer,
-                                       &ErrorMessage);
+    Module* Result = 0;
+    
+    if (Bitcode) {
+      const std::string &FNStr = Filename.toString();
+      MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(&FNStr[0],
+                                                          FNStr.size());
+      if (Buffer == 0)
+        ErrorMessage = "Error reading file '" + FNStr + "'";
+      else
+        Result = ParseBitcodeFile(Buffer, &ErrorMessage);
+      delete Buffer;
+    } else {
+      Result = ParseBytecodeFile(Filename.toString(), 
+                                 Compressor::decompressToNewBuffer,
+                                 &ErrorMessage);
+    }
     if (Result) return std::auto_ptr<Module>(Result);   // Load successful!
 
     if (Verbose) {
@@ -78,80 +95,77 @@
 
 int main(int argc, char **argv) {
   llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
-  try {
-    cl::ParseCommandLineOptions(argc, argv, " llvm linker\n");
-    sys::PrintStackTraceOnErrorSignal();
-    assert(InputFilenames.size() > 0 && "OneOrMore is not working");
+  cl::ParseCommandLineOptions(argc, argv, " llvm linker\n");
+  sys::PrintStackTraceOnErrorSignal();
+  assert(InputFilenames.size() > 0 && "OneOrMore is not working");
 
-    unsigned BaseArg = 0;
-    std::string ErrorMessage;
+  unsigned BaseArg = 0;
+  std::string ErrorMessage;
 
-    std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg]));
-    if (Composite.get() == 0) {
-      cerr << argv[0] << ": error loading file '"
-           << InputFilenames[BaseArg] << "'\n";
+  std::auto_ptr<Module> Composite(LoadFile(InputFilenames[BaseArg]));
+  if (Composite.get() == 0) {
+    cerr << argv[0] << ": error loading file '"
+         << InputFilenames[BaseArg] << "'\n";
+    return 1;
+  }
+
+  for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) {
+    std::auto_ptr<Module> M(LoadFile(InputFilenames[i]));
+    if (M.get() == 0) {
+      cerr << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n";
       return 1;
     }
 
-    for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) {
-      std::auto_ptr<Module> M(LoadFile(InputFilenames[i]));
-      if (M.get() == 0) {
-        cerr << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n";
-        return 1;
-      }
+    if (Verbose) cerr << "Linking in '" << InputFilenames[i] << "'\n";
 
-      if (Verbose) cerr << "Linking in '" << InputFilenames[i] << "'\n";
-
-      if (Linker::LinkModules(Composite.get(), M.get(), &ErrorMessage)) {
-        cerr << argv[0] << ": link error in '" << InputFilenames[i]
-             << "': " << ErrorMessage << "\n";
-        return 1;
-      }
+    if (Linker::LinkModules(Composite.get(), M.get(), &ErrorMessage)) {
+      cerr << argv[0] << ": link error in '" << InputFilenames[i]
+           << "': " << ErrorMessage << "\n";
+      return 1;
     }
+  }
 
-    // TODO: Iterate over the -l list and link in any modules containing
-    // global symbols that have not been resolved so far.
+  // TODO: Iterate over the -l list and link in any modules containing
+  // global symbols that have not been resolved so far.
 
-    if (DumpAsm) cerr << "Here's the assembly:\n" << *Composite.get();
+  if (DumpAsm) cerr << "Here's the assembly:\n" << *Composite.get();
 
-    // FIXME: cout is not binary!
-    std::ostream *Out = &std::cout;  // Default to printing to stdout...
-    if (OutputFilename != "-") {
-      if (!Force && std::ifstream(OutputFilename.c_str())) {
-        // If force is not specified, make sure not to overwrite a file!
-        cerr << argv[0] << ": error opening '" << OutputFilename
-             << "': file exists!\n"
-             << "Use -f command line argument to force output\n";
-        return 1;
-      }
-      std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
-                                   std::ios::binary;
-      Out = new std::ofstream(OutputFilename.c_str(), io_mode);
-      if (!Out->good()) {
-        cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n";
-        return 1;
-      }
-
-      // Make sure that the Out file gets unlinked from the disk if we get a
-      // SIGINT
-      sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+  // FIXME: cout is not binary!
+  std::ostream *Out = &std::cout;  // Default to printing to stdout...
+  if (OutputFilename != "-") {
+    if (!Force && std::ifstream(OutputFilename.c_str())) {
+      // If force is not specified, make sure not to overwrite a file!
+      cerr << argv[0] << ": error opening '" << OutputFilename
+           << "': file exists!\n"
+           << "Use -f command line argument to force output\n";
+      return 1;
     }
-
-    if (verifyModule(*Composite.get())) {
-      cerr << argv[0] << ": linked module is broken!\n";
+    std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
+                                 std::ios::binary;
+    Out = new std::ofstream(OutputFilename.c_str(), io_mode);
+    if (!Out->good()) {
+      cerr << argv[0] << ": error opening '" << OutputFilename << "'!\n";
       return 1;
     }
 
-    if (Verbose) cerr << "Writing bytecode...\n";
+    // Make sure that the Out file gets unlinked from the disk if we get a
+    // SIGINT
+    sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+  }
+
+  if (verifyModule(*Composite.get())) {
+    cerr << argv[0] << ": linked module is broken!\n";
+    return 1;
+  }
+
+  if (Verbose) cerr << "Writing bytecode...\n";
+  if (Bitcode) {
+    WriteBitcodeToFile(Composite.get(), *Out);
+  } else {
     OStream L(*Out);
     WriteBytecodeToFile(Composite.get(), L, !NoCompress);
-
-    if (Out != &std::cout) delete Out;
-    return 0;
-  } catch (const std::string& msg) {
-    cerr << argv[0] << ": " << msg << "\n";
-  } catch (...) {
-    cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
-  return 1;
+
+  if (Out != &std::cout) delete Out;
+  return 0;
 }
