summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/disassembler/X86Disassembler.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/disassembler/X86Disassembler.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
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)