From c311cf639cc1d6570d67b0a80a8ba04dc992a658 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 22 Aug 2012 13:36:28 +0200 Subject: Imported WebKit commit 35255d8c2fd37ba4359e75fe0ebe6aec87687f9c (http://svn.webkit.org/repository/webkit/trunk@126284) New snapshot that includes MSVC 64-bit build fix --- Source/JavaScriptCore/CMakeLists.txt | 1 + Source/JavaScriptCore/ChangeLog | 57 ++++++++++ Source/JavaScriptCore/GNUmakefile.list.am | 2 + .../JavaScriptCore/JavaScriptCore.vcproj | 8 ++ .../JavaScriptCore.xcodeproj/project.pbxproj | 8 ++ .../assembler/AbstractMacroAssembler.h | 6 ++ .../JavaScriptCore/assembler/MacroAssemblerARMv7.h | 5 + .../JavaScriptCore/assembler/MacroAssemblerX86.h | 4 + .../assembler/MacroAssemblerX86Common.h | 4 + .../assembler/MacroAssemblerX86_64.h | 4 + Source/JavaScriptCore/interpreter/CallFrame.h | 2 + Source/JavaScriptCore/interpreter/VMInspector.cpp | 116 +++++++++++++++++++++ Source/JavaScriptCore/interpreter/VMInspector.h | 50 +++++++++ .../jit/JumpReplacementWatchpoint.cpp | 8 +- 14 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 Source/JavaScriptCore/interpreter/VMInspector.cpp create mode 100644 Source/JavaScriptCore/interpreter/VMInspector.h (limited to 'Source/JavaScriptCore') diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt index 317814aa9..9c18f5b03 100644 --- a/Source/JavaScriptCore/CMakeLists.txt +++ b/Source/JavaScriptCore/CMakeLists.txt @@ -130,6 +130,7 @@ SET(JavaScriptCore_SOURCES interpreter/CallFrame.cpp interpreter/Interpreter.cpp interpreter/RegisterFile.cpp + interpreter/VMInspector.cpp jit/ExecutableAllocator.cpp jit/HostCallReturnValue.cpp diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 4297df1e5..ac3aae5ff 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,60 @@ +2012-08-21 Mark Lam + + Introducing the VMInspector for VM debugging use. + https://bugs.webkit.org/show_bug.cgi?id=94613. + + Reviewed by Filip Pizlo. + + Adding some utility functions for debugging the VM. This code is + presently #ifdef'd out by default. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/CallFrame.h: + (ExecState): + * interpreter/VMInspector.cpp: Added. + (JSC): + (JSC::VMInspector::getTypeName): + (JSC::VMInspector::dumpFrame0): + (JSC::VMInspector::dumpFrame): + (JSC::VMInspector::countFrames): + * interpreter/VMInspector.h: Added. + (JSC): + (VMInspector): + +2012-08-21 Filip Pizlo + + A patchable GetById right after a watchpoint should have the appropriate nop padding + https://bugs.webkit.org/show_bug.cgi?id=94635 + + Reviewed by Mark Hahnenberg. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::padBeforePatch): + (AbstractMacroAssembler): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch): + (JSC::MacroAssemblerARMv7::moveWithPatch): + (JSC::MacroAssemblerARMv7::patchableJump): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::moveWithPatch): + (JSC::MacroAssemblerX86::branchPtrWithPatch): + (JSC::MacroAssemblerX86::storePtrWithPatch): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::load32WithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::load32WithCompactAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::loadCompactWithAddressOffsetPatch): + (JSC::MacroAssemblerX86Common::store32WithAddressOffsetPatch): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::loadPtrWithCompactAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::storePtrWithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::moveWithPatch): + * jit/JumpReplacementWatchpoint.cpp: + (JSC::JumpReplacementWatchpoint::fireInternal): + 2012-08-20 Mark Lam Fix broken non-JIT build. diff --git a/Source/JavaScriptCore/GNUmakefile.list.am b/Source/JavaScriptCore/GNUmakefile.list.am index c504962cc..ed79e6873 100644 --- a/Source/JavaScriptCore/GNUmakefile.list.am +++ b/Source/JavaScriptCore/GNUmakefile.list.am @@ -362,6 +362,8 @@ javascriptcore_sources += \ Source/JavaScriptCore/interpreter/RegisterFile.cpp \ Source/JavaScriptCore/interpreter/RegisterFile.h \ Source/JavaScriptCore/interpreter/Register.h \ + Source/JavaScriptCore/interpreter/VMInspector.cpp \ + Source/JavaScriptCore/interpreter/VMInspector.h \ Source/JavaScriptCore/JavaScriptCorePrefix.h \ Source/JavaScriptCore/jit/CompactJITCodeMap.h \ Source/JavaScriptCore/jit/ExecutableAllocator.cpp \ diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj index e91baa473..8695a7557 100644 --- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj +++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj @@ -2045,6 +2045,14 @@ RelativePath="..\..\interpreter\RegisterFile.h" > + + + + "; + if (value.isBoolean()) + return ""; + if (value.isNull()) + return ""; + if (value.isUndefined()) + return ""; + if (value.isCell()) + return ""; + if (value.isEmpty()) + return ""; + return ""; +} + +void VMInspector::dumpFrame0(CallFrame* frame) +{ + dumpFrame(frame, 0, 0, 0, 0); +} + +void VMInspector::dumpFrame(CallFrame* frame, const char* prefix, + const char* funcName, const char* file, int line) +{ + int frameCount = VMInspector::countFrames(frame); + if (frameCount < 0) + return; + + Instruction* vPC = 0; + if (frame->codeBlock()) + vPC = frame->currentVPC(); + + #define CAST reinterpret_cast + + if (prefix) + printf("%s ", prefix); + + printf("frame [%d] %p { cb %p:%s, retPC %p:%s, scope %p:%s, callee %p:%s, callerFrame %p:%s, argc %d, vPC %p }", + frameCount, frame, + + CAST(frame[RegisterFile::CodeBlock].payload()), + getTypeName(frame[RegisterFile::CodeBlock].jsValue()), + + CAST(frame[RegisterFile::ReturnPC].payload()), + getTypeName(frame[RegisterFile::ReturnPC].jsValue()), + + CAST(frame[RegisterFile::ScopeChain].payload()), + getTypeName(frame[RegisterFile::ScopeChain].jsValue()), + + CAST(frame[RegisterFile::Callee].payload()), + getTypeName(frame[RegisterFile::Callee].jsValue()), + + CAST(frame[RegisterFile::CallerFrame].payload()), + getTypeName(frame[RegisterFile::CallerFrame].jsValue()), + + frame[RegisterFile::ArgumentCount].payload(), + vPC); + + if (funcName || file || (line >= 0)) { + printf(" @"); + if (funcName) + printf(" %s", funcName); + if (file) + printf(" %s", file); + if (line >= 0) + printf(":%d", line); + } + printf("\n"); +} + +int VMInspector::countFrames(CallFrame* frame) +{ + int count = -1; + while (frame && !frame->hasHostCallFrameFlag()) { + count++; + frame = frame->callerFrame(); + } + return count; +} + +} // namespace JSC + +#endif // ENABLE(VMINSPECTOR) diff --git a/Source/JavaScriptCore/interpreter/VMInspector.h b/Source/JavaScriptCore/interpreter/VMInspector.h new file mode 100644 index 000000000..6806cafa1 --- /dev/null +++ b/Source/JavaScriptCore/interpreter/VMInspector.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef VMInspector_h +#define VMInspector_h + +#define ENABLE_VMINSPECTOR 0 + +#if ENABLE(VMINSPECTOR) + +#include "CallFrame.h" +#include "JSValue.h" + +namespace JSC { + +class VMInspector { +public: + static JS_EXPORT_PRIVATE const char* getTypeName(JSValue); + static JS_EXPORT_PRIVATE void dumpFrame0(CallFrame*); + static JS_EXPORT_PRIVATE void dumpFrame(CallFrame*, const char* prefix = 0, const char* funcName = 0, const char* file = 0, int line = -1); + static JS_EXPORT_PRIVATE int countFrames(CallFrame*); +}; + +} // namespace JSC + +#endif // ENABLE(VMINSPECTOR) + +#endif // VMInspector.h diff --git a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp index 725108dd5..00311dab4 100644 --- a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp +++ b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp @@ -43,9 +43,11 @@ void JumpReplacementWatchpoint::correctLabels(LinkBuffer& linkBuffer) void JumpReplacementWatchpoint::fireInternal() { - MacroAssembler::replaceWithJump( - CodeLocationLabel(bitwise_cast(m_source)), - CodeLocationLabel(bitwise_cast(m_destination))); + void* source = bitwise_cast(m_source); + void* destination = bitwise_cast(m_destination); + if (Options::showDisassembly()) + dataLog("Firing jump replacement watchpoint from %p, to %p.\n", source, destination); + MacroAssembler::replaceWithJump(CodeLocationLabel(source), CodeLocationLabel(destination)); if (isOnList()) remove(); } -- cgit v1.2.1