summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/disassembler/X86Disassembler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/disassembler/X86Disassembler.cpp')
-rw-r--r--Source/JavaScriptCore/disassembler/X86Disassembler.cpp38
1 files changed, 33 insertions, 5 deletions
diff --git a/Source/JavaScriptCore/disassembler/X86Disassembler.cpp b/Source/JavaScriptCore/disassembler/X86Disassembler.cpp
index 1f811beca..5cce4a93f 100644
--- a/Source/JavaScriptCore/disassembler/X86Disassembler.cpp
+++ b/Source/JavaScriptCore/disassembler/X86Disassembler.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,20 +27,48 @@
#include "Disassembler.h"
#if ENABLE(DISASSEMBLER)
-#if USE(UDIS86)
+#if USE(UDIS86) || USE(LLVM_DISASSEMBLER)
#include "MacroAssemblerCodeRef.h"
#include "Options.h"
#include "UDis86Disassembler.h"
+#include "LLVMDisassembler.h"
namespace JSC {
-bool tryToDisassemble(const MacroAssemblerCodePtr& codePtr, size_t size, const char* prefix, PrintStream& out)
+// This horrifying monster is needed because neither of our disassemblers supports
+// all of x86, and using them together to disassemble the same instruction stream
+// would result in a fairly jarring print-out since they print in different
+// styles. Maybe we can do better in the future, but for now the caller hints
+// whether he's using the subset of the architecture that our MacroAssembler
+// supports (in which case we go with UDis86) or if he's using the LLVM subset.
+
+bool tryToDisassemble(const MacroAssemblerCodePtr& codePtr, size_t size, const char* prefix, PrintStream& out, InstructionSubsetHint subsetHint)
{
- return tryToDisassembleWithUDis86(codePtr, size, prefix, out);
+ if (Options::forceUDis86Disassembler())
+ return tryToDisassembleWithUDis86(codePtr, size, prefix, out, subsetHint);
+
+ if (Options::forceLLVMDisassembler())
+ return tryToDisassembleWithLLVM(codePtr, size, prefix, out, subsetHint);
+
+ if (subsetHint == MacroAssemblerSubset
+ && tryToDisassembleWithUDis86(codePtr, size, prefix, out, MacroAssemblerSubset))
+ return true;
+
+ if (subsetHint == LLVMSubset
+ && tryToDisassembleWithLLVM(codePtr, size, prefix, out, LLVMSubset))
+ return true;
+
+ if (tryToDisassembleWithUDis86(codePtr, size, prefix, out, subsetHint))
+ return true;
+ if (tryToDisassembleWithLLVM(codePtr, size, prefix, out, subsetHint))
+ return true;
+
+ RELEASE_ASSERT_NOT_REACHED();
+ return false;
}
} // namespace JSC
-#endif // USE(UDIS86)
+#endif // USE(UDIS86) || USE(LLVM_DISASSEMBLER)
#endif // ENABLE(DISASSEMBLER)