void disassemble(const MacroAssemblerCodePtr& codePtr, size_t size, const char* prefix, PrintStream& out) { if (tryToDisassemble(codePtr, size, prefix, out)) return; out.printf("%sdisassembly not available for range %p...%p\n", prefix, codePtr.executableAddress(), static_cast<char*>(codePtr.executableAddress()) + size); }
void disassemble(const MacroAssemblerCodePtr<DisassemblyPtrTag>& codePtr, size_t size, const char* prefix, PrintStream& out) { if (tryToDisassemble(codePtr, size, prefix, out)) return; out.printf("%sdisassembly not available for range %p...%p\n", prefix, codePtr.untaggedExecutableAddress(), codePtr.untaggedExecutableAddress<char*>() + size); }
CString MacroAssemblerCodeRef::disassembly() const { StringPrintStream out; if (!tryToDisassemble(out, "")) return CString(); return out.toCString(); }
LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithDisassembly(const char* format, ...) { ASSERT(Options::showDisassembly); CodeRef result = finalizeCodeWithoutDisassembly(); dataLog("Generated JIT code for "); va_list argList; va_start(argList, format); WTF::dataLogV(format, argList); va_end(argList); dataLog(":\n"); dataLog(" Code at [%p, %p):\n", result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); if (!tryToDisassemble(result.code(), m_size, " ", WTF::dataFile())) dataLog(" <no disassembly available>"); return result; }
void Disassembler::dumpDisassembly(const char* prefix, LinkBuffer& linkBuffer, MacroAssembler::Label& previousLabel, MacroAssembler::Label currentLabel, NodeIndex context) { size_t prefixLength = strlen(prefix); int amountOfNodeWhiteSpace; if (context == NoNode) amountOfNodeWhiteSpace = 0; else amountOfNodeWhiteSpace = Graph::amountOfNodeWhiteSpace(m_graph[context]); OwnArrayPtr<char> prefixBuffer = adoptArrayPtr(new char[prefixLength + amountOfNodeWhiteSpace + 1]); strcpy(prefixBuffer.get(), prefix); for (int i = 0; i < amountOfNodeWhiteSpace; ++i) prefixBuffer[i + prefixLength] = ' '; prefixBuffer[prefixLength + amountOfNodeWhiteSpace] = 0; CodeLocationLabel start = linkBuffer.locationOf(previousLabel); CodeLocationLabel end = linkBuffer.locationOf(currentLabel); previousLabel = currentLabel; ASSERT(bitwise_cast<uintptr_t>(end.executableAddress()) >= bitwise_cast<uintptr_t>(start.executableAddress())); if (tryToDisassemble(start, bitwise_cast<uintptr_t>(end.executableAddress()) - bitwise_cast<uintptr_t>(start.executableAddress()), prefixBuffer.get(), WTF::dataFile())) return; dataLog("%s disassembly not available for range %p...%p\n", prefixBuffer.get(), start.executableAddress(), end.executableAddress()); }
bool MacroAssemblerCodeRef::tryToDisassemble(const char* prefix) const { return tryToDisassemble(WTF::dataFile(), prefix); }