[AArch64 NEON] Expand vector for UDIV/SDIV/UREM/SREM/FREM as neon doesn't support...
[oota-llvm.git] / lib / Support / Disassembler.cpp
index cc1f5e4390eb85a21cead14fb685dc3b62251736..27df3a9e2cb7b0d5c45cba03d62143fcccfd9067 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Anton Korobeynikov and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Config/config.h"
 #include "llvm/Support/Disassembler.h"
-
+#include "llvm/Config/config.h"
 #include <cassert>
 #include <iomanip>
-#include <string>
 #include <sstream>
+#include <string>
 
 #if USE_UDIS86
 #include <udis86.h>
 
 using namespace llvm;
 
-std::string llvm::disassembleBuffer(uint8_t* start, size_t length,
-                              Disassembler::Type type, uint64_t pc) {
-  std::stringstream res;
-  
-  if (type == Disassembler::X86_32 || type == Disassembler::X86_64) {
-#if USE_UDIS86
-    ud_t ud_obj;
-   
-    ud_init(&ud_obj);
-    ud_set_input_buffer(&ud_obj, start, length);
-    ud_set_mode(&ud_obj, (type == Disassembler::X86_32 ? 32 : 64));
-    ud_set_pc(&ud_obj, pc);
-    ud_set_syntax(&ud_obj, UD_SYN_ATT);
-
-    res << std::setbase(16)
-        << std::setw((type == Disassembler::X86_32 ? 8 : 16));
-
-    while (ud_disassemble(&ud_obj)) {
-      res << ud_insn_off(&ud_obj) << ":\t" << ud_insn_asm(&ud_obj) << "\n";
-    }
+bool llvm::sys::hasDisassembler()
+{
+#if defined (__i386__) || defined (__amd64__) || defined (__x86_64__)
+  // We have option to enable udis86 library.
+# if USE_UDIS86
+  return true;
+#else
+  return false;
 #endif
+#else
+  return false;
+#endif
+}
+
+std::string llvm::sys::disassembleBuffer(uint8_t* start, size_t length,
+                                         uint64_t pc) {
+#if (defined (__i386__) || defined (__amd64__) || defined (__x86_64__)) \
+  && USE_UDIS86
+  std::stringstream res;
+
+  unsigned bits;
+# if defined(__i386__)
+  bits = 32;
+# else
+  bits = 64;
+# endif
+
+  ud_t ud_obj;
+
+  ud_init(&ud_obj);
+  ud_set_input_buffer(&ud_obj, start, length);
+  ud_set_mode(&ud_obj, bits);
+  ud_set_pc(&ud_obj, pc);
+  ud_set_syntax(&ud_obj, UD_SYN_ATT);
+
+  res << std::setbase(16)
+      << std::setw(bits/4);
+
+  while (ud_disassemble(&ud_obj)) {
+    res << ud_insn_off(&ud_obj) << ":\t" << ud_insn_asm(&ud_obj) << "\n";
   }
 
   return res.str();
+#else
+  return "No disassembler available. See configure help for options.\n";
+#endif
 }