diff --git a/tools/llvm-extract/Makefile b/tools/llvm-extract/Makefile
index 8efe423..51416c6 100644
--- a/tools/llvm-extract/Makefile
+++ b/tools/llvm-extract/Makefile
@@ -6,10 +6,10 @@
 # the University of Illinois Open Source License. See LICENSE.TXT for details.
 # 
 ##===----------------------------------------------------------------------===##
+
 LEVEL = ../..
 
 TOOLNAME = llvm-extract
-LINK_COMPONENTS := bcreader bcwriter ipo
-REQUIRES_EH := 1
+LINK_COMPONENTS := bcreader bcwriter ipo bitreader bitwriter
 
 include $(LEVEL)/Makefile.common
diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp
index 60a0134..60171c1 100644
--- a/tools/llvm-extract/llvm-extract.cpp
+++ b/tools/llvm-extract/llvm-extract.cpp
@@ -14,6 +14,7 @@
 
 #include "llvm/Module.h"
 #include "llvm/PassManager.h"
+#include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Bytecode/WriteBytecodePass.h"
 #include "llvm/Transforms/IPO.h"
@@ -21,6 +22,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Compressor.h"
 #include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/System/Signals.h"
 #include <iostream>
@@ -28,6 +30,8 @@
 #include <fstream>
 using namespace llvm;
 
+cl::opt<bool> Bitcode("bitcode");
+
 // InputFilename - The filename to read from.
 static cl::opt<std::string>
 InputFilename(cl::Positional, cl::desc("<input bytecode file>"),
@@ -54,65 +58,76 @@
 
 int main(int argc, char **argv) {
   llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
-  try {
-    cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n");
-    sys::PrintStackTraceOnErrorSignal();
+  cl::ParseCommandLineOptions(argc, argv, " llvm extractor\n");
+  sys::PrintStackTraceOnErrorSignal();
 
-    std::auto_ptr<Module> M(ParseBytecodeFile(InputFilename,
-                                            Compressor::decompressToNewBuffer));
-    if (M.get() == 0) {
-      cerr << argv[0] << ": bytecode didn't read correctly.\n";
+  std::auto_ptr<Module> M;
+  
+  if (Bitcode) {
+    MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(&InputFilename[0],
+                                                        InputFilename.size());
+    if (Buffer == 0) {
+      cerr << "Error reading file '" + InputFilename + "'";
       return 1;
+    } else {
+      M.reset(ParseBitcodeFile(Buffer));
     }
-
-    // Figure out which function we should extract
-    Function *F = M.get()->getFunction(ExtractFunc);
-    if (F == 0) {
-      cerr << argv[0] << ": program doesn't contain function named '"
-           << ExtractFunc << "'!\n";
-      return 1;
-    }
-
-    // In addition to deleting all other functions, we also want to spiff it
-    // up a little bit.  Do this now.
-    PassManager Passes;
-    Passes.add(new TargetData(M.get())); // Use correct TargetData
-    // Either isolate the function or delete it from the Module
-    Passes.add(createFunctionExtractionPass(F, DeleteFn, Relink));
-    if (!DeleteFn)
-      Passes.add(createGlobalDCEPass());           // Delete unreachable globals
-    Passes.add(createDeadTypeEliminationPass());   // Remove dead types...
-    Passes.add(createStripDeadPrototypesPass());   // Remove dead func decls
-
-    std::ostream *Out = 0;
-
-    if (OutputFilename != "-") {  // Not stdout?
-      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);
-    } else {                      // Specified stdout
-      // FIXME: cout is not binary!
-      Out = &std::cout;
-    }
-
-    OStream L(*Out);
-    Passes.add(new WriteBytecodePass(&L));  // Write bytecode to file...
-    Passes.run(*M.get());
-
-    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";
+    delete Buffer;
+  } else {
+    M.reset(ParseBytecodeFile(InputFilename,
+                              Compressor::decompressToNewBuffer));
   }
-  return 1;
+  
+  if (M.get() == 0) {
+    cerr << argv[0] << ": bytecode didn't read correctly.\n";
+    return 1;
+  }
+
+  // Figure out which function we should extract
+  Function *F = M.get()->getFunction(ExtractFunc);
+  if (F == 0) {
+    cerr << argv[0] << ": program doesn't contain function named '"
+         << ExtractFunc << "'!\n";
+    return 1;
+  }
+
+  // In addition to deleting all other functions, we also want to spiff it
+  // up a little bit.  Do this now.
+  PassManager Passes;
+  Passes.add(new TargetData(M.get())); // Use correct TargetData
+  // Either isolate the function or delete it from the Module
+  Passes.add(createFunctionExtractionPass(F, DeleteFn, Relink));
+  if (!DeleteFn)
+    Passes.add(createGlobalDCEPass());           // Delete unreachable globals
+  Passes.add(createDeadTypeEliminationPass());   // Remove dead types...
+  Passes.add(createStripDeadPrototypesPass());   // Remove dead func decls
+
+  std::ostream *Out = 0;
+
+  if (OutputFilename != "-") {  // Not stdout?
+    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);
+  } else {                      // Specified stdout
+    // FIXME: cout is not binary!
+    Out = &std::cout;
+  }
+
+  OStream L(*Out);
+  if (Bitcode)
+    Passes.add(CreateBitcodeWriterPass(*Out));
+  else 
+    Passes.add(new WriteBytecodePass(&L));  // Write bytecode to file...
+  Passes.run(*M.get());
+
+  if (Out != &std::cout)
+    delete Out;
+  return 0;
 }
diff --git a/tools/llvm-link/Makefile b/tools/llvm-link/Makefile
index f976135..4371c69 100644
--- a/tools/llvm-link/Makefile
+++ b/tools/llvm-link/Makefile
@@ -9,7 +9,6 @@
 LEVEL = ../..
 
 TOOLNAME = llvm-link
-LINK_COMPONENTS = linker bcreader bcwriter
-REQUIRES_EH := 1
+LINK_COMPONENTS = linker bcreader bcwriter bitreader bitwriter
 
 include $(LEVEL)/Makefile.common
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;
 }
