diff options
Diffstat (limited to 'Source/JavaScriptCore/disassembler/X86Disassembler.cpp')
-rw-r--r-- | Source/JavaScriptCore/disassembler/X86Disassembler.cpp | 38 |
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) |