diff --git a/tools/Makefile b/tools/Makefile
index 8205568..e124422 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -36,7 +36,7 @@
 ifeq ($(ENABLE_PIC),1)
   # No support for dynamic libraries on windows targets.
   ifneq ($(TARGET_OS), $(filter $(TARGET_OS), Cygwin MingW))
-    DIRS += edis
+    PARALLEL_DIRS += edis
 
     # gold only builds if binutils is around.  It requires "lto" to build before
     # it so it is added to DIRS.
diff --git a/tools/llvm-mc/Disassembler.cpp b/tools/llvm-mc/Disassembler.cpp
index 4a63e99..9fe0790 100644
--- a/tools/llvm-mc/Disassembler.cpp
+++ b/tools/llvm-mc/Disassembler.cpp
@@ -15,7 +15,6 @@
 #include "Disassembler.h"
 
 #include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/Triple.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCDisassembler.h"
 #include "llvm/MC/MCInst.h"
@@ -25,9 +24,6 @@
 #include "llvm/Support/MemoryObject.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/SourceMgr.h"
-
-#include "llvm-c/EnhancedDisassembly.h"
-
 using namespace llvm;
 
 typedef std::vector<std::pair<unsigned char, const char*> > ByteArrayTy;
@@ -68,7 +64,8 @@
                                /*REMOVE*/ nulls())) {
       Printer.printInst(&Inst, outs());
       outs() << "\n";
-    } else {
+    }
+    else {
       SM.PrintMessage(SMLoc::getFromPointer(Bytes[Index].second),
                       "invalid instruction encoding", "warning");
       if (Size == 0)
@@ -79,53 +76,6 @@
   return false;
 }
 
-static bool ByteArrayFromString(ByteArrayTy &ByteArray, 
-                                StringRef &Str, 
-                                SourceMgr &SM) {
-  while (!Str.empty()) {
-    // Strip horizontal whitespace.
-    if (size_t Pos = Str.find_first_not_of(" \t\r")) {
-      Str = Str.substr(Pos);
-      continue;
-    }
-    
-    // If this is the end of a line or start of a comment, remove the rest of
-    // the line.
-    if (Str[0] == '\n' || Str[0] == '#') {
-      // Strip to the end of line if we already processed any bytes on this
-      // line.  This strips the comment and/or the \n.
-      if (Str[0] == '\n') {
-        Str = Str.substr(1);
-      } else {
-        Str = Str.substr(Str.find_first_of('\n'));
-        if (!Str.empty())
-          Str = Str.substr(1);
-      }
-      continue;
-    }
-    
-    // Get the current token.
-    size_t Next = Str.find_first_of(" \t\n\r#");
-    StringRef Value = Str.substr(0, Next);
-    
-    // Convert to a byte and add to the byte vector.
-    unsigned ByteVal;
-    if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) {
-      // If we have an error, print it and skip to the end of line.
-      SM.PrintMessage(SMLoc::getFromPointer(Value.data()),
-                      "invalid input token", "error");
-      Str = Str.substr(Str.find('\n'));
-      ByteArray.clear();
-      continue;
-    }
-    
-    ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data()));
-    Str = Str.substr(Next);
-  }
-  
-  return false;
-}
-
 int Disassembler::disassemble(const Target &T, const std::string &Triple,
                               MemoryBuffer &Buffer) {
   // Set up disassembler.
@@ -155,197 +105,52 @@
   
   // Convert the input to a vector for disassembly.
   ByteArrayTy ByteArray;
-  StringRef Str = Buffer.getBuffer();
   
-  ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM);
+  StringRef Str = Buffer.getBuffer();
+  while (!Str.empty()) {
+    // Strip horizontal whitespace.
+    if (size_t Pos = Str.find_first_not_of(" \t\r")) {
+      Str = Str.substr(Pos);
+      continue;
+    }
+    
+    // If this is the end of a line or start of a comment, remove the rest of
+    // the line.
+    if (Str[0] == '\n' || Str[0] == '#') {
+      // Strip to the end of line if we already processed any bytes on this
+      // line.  This strips the comment and/or the \n.
+      if (Str[0] == '\n')
+        Str = Str.substr(1);
+      else {
+        Str = Str.substr(Str.find_first_of('\n'));
+        if (!Str.empty())
+          Str = Str.substr(1);
+      }
+      continue;
+    }
+    
+    // Get the current token.
+    size_t Next = Str.find_first_of(" \t\n\r#");
+    StringRef Value = Str.substr(0, Next);
+    
+    // Convert to a byte and add to the byte vector.
+    unsigned ByteVal;
+    if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) {
+      // If we have an error, print it and skip to the end of line.
+      SM.PrintMessage(SMLoc::getFromPointer(Value.data()),
+                                 "invalid input token", "error");
+      ErrorOccurred = true;
+      Str = Str.substr(Str.find('\n'));
+      ByteArray.clear();
+      continue;
+    }
+    
+    ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data()));
+    Str = Str.substr(Next);
+  }
   
   if (!ByteArray.empty())
     ErrorOccurred |= PrintInsts(*DisAsm, *IP, ByteArray, SM);
     
   return ErrorOccurred;
 }
-
-static int byteArrayReader(uint8_t *B, uint64_t A, void *Arg) {
-  ByteArrayTy &ByteArray = *((ByteArrayTy*)Arg);
-  
-  if (A >= ByteArray.size())
-    return -1;
-  
-  *B = ByteArray[A].first;
-  
-  return 0;
-}
-
-static int verboseEvaluator(uint64_t *V, unsigned R, void *Arg) {
-  EDDisassemblerRef &disassembler = *((EDDisassemblerRef*)Arg);
-  
-  const char *regName;
-  
-  if (!EDGetRegisterName(&regName,
-                        disassembler,
-                        R))
-    outs() << "[" << regName << "/" << R << "]";
-  if (EDRegisterIsStackPointer(disassembler, R))
-    outs() << "(sp)";
-  if (EDRegisterIsProgramCounter(disassembler, R))
-    outs() << "(pc)";
-  
-  *V = 0;
-  
-  return 0;
-}
-
-int Disassembler::disassembleEnhanced(const std::string &TS, 
-                                      MemoryBuffer &Buffer) {
-  ByteArrayTy ByteArray;
-  StringRef Str = Buffer.getBuffer();
-  SourceMgr SM;
-  
-  SM.AddNewSourceBuffer(&Buffer, SMLoc());
-  
-  if (ByteArrayFromString(ByteArray, Str, SM)) {
-    return -1;
-  }
-  
-  EDDisassemblerRef disassembler;
-  
-  Triple T(TS);
-  EDAssemblySyntax_t AS;
-  
-  switch (T.getArch()) {
-  default:
-    errs() << "error: no default assembly syntax for " << TS.c_str() << "\n";
-    return -1;
-  case Triple::arm:
-  case Triple::thumb:
-    AS = kEDAssemblySyntaxARMUAL;
-    break;
-  case Triple::x86:
-  case Triple::x86_64:
-    AS = kEDAssemblySyntaxX86ATT;
-    break;
-  }
-  
-  if (EDGetDisassembler(&disassembler, 
-                        TS.c_str(),
-                        AS)) {
-    errs() << "error: couldn't get disassembler for " << TS.c_str() << "\n";
-    return -1;
-  }
-  
-  EDInstRef inst;
-  
-  if (EDCreateInsts(&inst, 1, disassembler, byteArrayReader, 0,&ByteArray) 
-      != 1) {
-    errs() << "error: Didn't get an instruction\n";
-    return -1;
-  }
-  
-  int numTokens = EDNumTokens(inst);
-  
-  if (numTokens < 0) {
-    errs() << "error: Couldn't count the instruction's tokens\n";
-    return -1;
-  }
-  
-  int tokenIndex;
-  
-  for (tokenIndex = 0; tokenIndex < numTokens; ++tokenIndex) {
-    EDTokenRef token;
-    
-    if (EDGetToken(&token, inst, tokenIndex)) {
-      errs() << "error: Couldn't get token\n";
-      return -1;
-    }
-    
-    const char *buf;
-    
-    if (EDGetTokenString(&buf, token)) {
-      errs() << "error: Couldn't get string for token\n";
-      return -1;
-    }
-    
-    outs() << "[";
-    
-    int operandIndex = EDOperandIndexForToken(token);
-    
-    if (operandIndex >= 0)
-      outs() << operandIndex << "-";
-    
-    if (EDTokenIsWhitespace(token)) {
-      outs() << "w";
-    } else if (EDTokenIsPunctuation(token)) {
-      outs() << "p";
-    } else if (EDTokenIsOpcode(token)) {
-      outs() << "o";
-    } else if (EDTokenIsLiteral(token)) {
-      outs() << "l";
-    } else if (EDTokenIsRegister(token)) {
-      outs() << "r";
-    } else {
-      outs() << "?";
-    }
-    
-    outs() << ":" << buf;
-  
-    if (EDTokenIsLiteral(token)) {
-      outs() << "=";
-      if (EDTokenIsNegativeLiteral(token))
-        outs() << "-";
-      uint64_t absoluteValue;
-      if (EDLiteralTokenAbsoluteValue(&absoluteValue, token)) {
-        errs() << "error: Couldn't get the value of a literal token\n";
-        return -1;
-      }
-      outs() << absoluteValue;
-    } else if (EDTokenIsRegister(token)) {
-      outs() << "=";
-      unsigned regID;
-      if (EDRegisterTokenValue(&regID, token)) {
-        errs() << "error: Couldn't get the ID of a register token\n";
-        return -1;
-      }
-      outs() << "r" << regID;
-    }
-    
-    outs() << "]";
-  }
-  
-  outs() << " ";
-  
-  int numOperands = EDNumOperands(inst);
-  
-  if (numOperands < 0) {
-    errs() << "error: Couldn't count operands\n";
-    return -1;
-  }
-  
-  int operandIndex;
-  
-  for (operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
-    outs() << operandIndex << ":";
-    
-    EDOperandRef operand;
-    
-    if (EDGetOperand(&operand,
-                     inst,
-                     operandIndex)) {
-      errs() << "error: Couldn't get operand\n";
-      return -1;
-    }
-    
-    uint64_t evaluatedResult;
-    
-    EDEvaluateOperand(&evaluatedResult, 
-                      operand, 
-                      verboseEvaluator, 
-                      &disassembler);
-    
-    outs() << " ";
-  }
-  
-  outs() << "\n";
-  
-  return 0;
-}
-
diff --git a/tools/llvm-mc/Disassembler.h b/tools/llvm-mc/Disassembler.h
index 3da2396..78c2f85 100644
--- a/tools/llvm-mc/Disassembler.h
+++ b/tools/llvm-mc/Disassembler.h
@@ -27,9 +27,6 @@
   static int disassemble(const Target &target, 
                          const std::string &tripleString,
                          MemoryBuffer &buffer);
-  
-  static int disassembleEnhanced(const std::string &tripleString,
-                                 MemoryBuffer &buffer);
 };
   
 } // namespace llvm
diff --git a/tools/llvm-mc/Makefile b/tools/llvm-mc/Makefile
index d09ea06..5b0fe3f 100644
--- a/tools/llvm-mc/Makefile
+++ b/tools/llvm-mc/Makefile
@@ -20,6 +20,5 @@
 include $(LEVEL)/Makefile.config
 
 LINK_COMPONENTS := $(TARGETS_TO_BUILD) MCParser MC support
-USEDLIBS := EnhancedDisassembly.a
 
 include $(LLVM_SRC_ROOT)/Makefile.rules
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp
index 47f67c5..c6657f5 100644
--- a/tools/llvm-mc/llvm-mc.cpp
+++ b/tools/llvm-mc/llvm-mc.cpp
@@ -97,8 +97,7 @@
 enum ActionType {
   AC_AsLex,
   AC_Assemble,
-  AC_Disassemble,
-  AC_EDisassemble
+  AC_Disassemble
 };
 
 static cl::opt<ActionType>
@@ -110,8 +109,6 @@
                              "Assemble a .s file (default)"),
                   clEnumValN(AC_Disassemble, "disassemble",
                              "Disassemble strings of hex bytes"),
-                  clEnumValN(AC_EDisassemble, "edis",
-                             "Enhanced disassembly of strings of hex bytes"),
                   clEnumValEnd));
 
 static const Target *GetTarget(const char *ProgName) {
@@ -328,7 +325,7 @@
   return Res;
 }
 
-static int DisassembleInput(const char *ProgName, bool Enhanced) {
+static int DisassembleInput(const char *ProgName) {
   const Target *TheTarget = GetTarget(ProgName);
   if (!TheTarget)
     return 0;
@@ -347,10 +344,7 @@
     return 1;
   }
   
-  if (Enhanced)
-    return Disassembler::disassembleEnhanced(TripleName, *Buffer);
-  else
-    return Disassembler::disassemble(*TheTarget, TripleName, *Buffer);
+  return Disassembler::disassemble(*TheTarget, TripleName, *Buffer);
 }
 
 
@@ -377,9 +371,7 @@
   case AC_Assemble:
     return AssembleInput(argv[0]);
   case AC_Disassemble:
-    return DisassembleInput(argv[0], false);
-  case AC_EDisassemble:
-    return DisassembleInput(argv[0], true);
+    return DisassembleInput(argv[0]);
   }
   
   return 0;
