diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/disassembler/X86Disassembler.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-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.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) |