1/* 2 * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "Disassembler.h" 28 29#if ENABLE(DISASSEMBLER) 30#if USE(UDIS86) || (USE(LLVM_DISASSEMBLER) && (CPU(X86_64) || CPU(X86))) 31 32#include "MacroAssemblerCodeRef.h" 33#include "Options.h" 34#include "UDis86Disassembler.h" 35#include "LLVMDisassembler.h" 36 37namespace JSC { 38 39// This horrifying monster is needed because neither of our disassemblers supports 40// all of x86, and using them together to disassemble the same instruction stream 41// would result in a fairly jarring print-out since they print in different 42// styles. Maybe we can do better in the future, but for now the caller hints 43// whether he's using the subset of the architecture that our MacroAssembler 44// supports (in which case we go with UDis86) or if he's using the LLVM subset. 45 46bool tryToDisassemble(const MacroAssemblerCodePtr& codePtr, size_t size, const char* prefix, PrintStream& out, InstructionSubsetHint subsetHint) 47{ 48 if (Options::forceUDis86Disassembler()) 49 return tryToDisassembleWithUDis86(codePtr, size, prefix, out, subsetHint); 50 51 if (Options::forceLLVMDisassembler()) 52 return tryToDisassembleWithLLVM(codePtr, size, prefix, out, subsetHint); 53 54 if (subsetHint == MacroAssemblerSubset 55 && tryToDisassembleWithUDis86(codePtr, size, prefix, out, MacroAssemblerSubset)) 56 return true; 57 58 if (subsetHint == LLVMSubset 59 && tryToDisassembleWithLLVM(codePtr, size, prefix, out, LLVMSubset)) 60 return true; 61 62 if (tryToDisassembleWithUDis86(codePtr, size, prefix, out, subsetHint)) 63 return true; 64 if (tryToDisassembleWithLLVM(codePtr, size, prefix, out, subsetHint)) 65 return true; 66 67 RELEASE_ASSERT_NOT_REACHED(); 68 return false; 69} 70 71} // namespace JSC 72 73#endif // USE(UDIS86) || USE(LLVM_DISASSEMBLER) 74#endif // ENABLE(DISASSEMBLER) 75