Title: [240637] trunk/Source/_javascript_Core
Revision
240637
Author
[email protected]
Date
2019-01-28 20:33:33 -0800 (Mon, 28 Jan 2019)

Log Message

[JSC] Reduce size of memory used for ShadowChicken
https://bugs.webkit.org/show_bug.cgi?id=193546

Reviewed by Mark Lam.

This patch lazily instantiate ShadowChicken. We do not need this until we start logging ShadowChicken packets.
The removal of ShadowChicken saves 55KB memory.

* debugger/DebuggerCallFrame.cpp:
(JSC::DebuggerCallFrame::create):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::ensureShadowChickenPacket):
* heap/Heap.cpp:
(JSC::Heap::stopThePeriphery):
(JSC::Heap::addCoreConstraints):
* jit/CCallHelpers.cpp:
(JSC::CCallHelpers::ensureShadowChickenPacket):
* jit/JITExceptions.cpp:
(JSC::genericUnwind):
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_log_shadow_chicken_prologue):
(JSC::JIT::emit_op_log_shadow_chicken_tail):
* jit/JITOpcodes32_64.cpp:
(JSC::JIT::emit_op_log_shadow_chicken_prologue):
(JSC::JIT::emit_op_log_shadow_chicken_tail):
* jit/JITOperations.cpp:
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
* runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::setDebugger):
* runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::setDebugger): Deleted.
* runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::ensureShadowChicken):
* runtime/VM.h:
(JSC::VM::shadowChicken):
* tools/JSDollarVM.cpp:
(JSC::functionShadowChickenFunctionsOnStack):
(JSC::changeDebuggerModeWhenIdle):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (240636 => 240637)


--- trunk/Source/_javascript_Core/ChangeLog	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/ChangeLog	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1,3 +1,46 @@
+2019-01-28  Yusuke Suzuki  <[email protected]>
+
+        [JSC] Reduce size of memory used for ShadowChicken
+        https://bugs.webkit.org/show_bug.cgi?id=193546
+
+        Reviewed by Mark Lam.
+
+        This patch lazily instantiate ShadowChicken. We do not need this until we start logging ShadowChicken packets.
+        The removal of ShadowChicken saves 55KB memory.
+
+        * debugger/DebuggerCallFrame.cpp:
+        (JSC::DebuggerCallFrame::create):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::ensureShadowChickenPacket):
+        * heap/Heap.cpp:
+        (JSC::Heap::stopThePeriphery):
+        (JSC::Heap::addCoreConstraints):
+        * jit/CCallHelpers.cpp:
+        (JSC::CCallHelpers::ensureShadowChickenPacket):
+        * jit/JITExceptions.cpp:
+        (JSC::genericUnwind):
+        * jit/JITOpcodes.cpp:
+        (JSC::JIT::emit_op_log_shadow_chicken_prologue):
+        (JSC::JIT::emit_op_log_shadow_chicken_tail):
+        * jit/JITOpcodes32_64.cpp:
+        (JSC::JIT::emit_op_log_shadow_chicken_prologue):
+        (JSC::JIT::emit_op_log_shadow_chicken_tail):
+        * jit/JITOperations.cpp:
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
+        * runtime/JSGlobalObject.cpp:
+        (JSC::JSGlobalObject::setDebugger):
+        * runtime/JSGlobalObject.h:
+        (JSC::JSGlobalObject::setDebugger): Deleted.
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        (JSC::VM::ensureShadowChicken):
+        * runtime/VM.h:
+        (JSC::VM::shadowChicken):
+        * tools/JSDollarVM.cpp:
+        (JSC::functionShadowChickenFunctionsOnStack):
+        (JSC::changeDebuggerModeWhenIdle):
+
 2019-01-28  Andy Estes  <[email protected]>
 
         [watchOS] Enable Parental Controls content filtering

Modified: trunk/Source/_javascript_Core/debugger/DebuggerCallFrame.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/debugger/DebuggerCallFrame.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/debugger/DebuggerCallFrame.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -70,7 +70,8 @@
     }
 
     Vector<ShadowChicken::Frame> frames;
-    vm.shadowChicken().iterate(vm, callFrame, [&] (const ShadowChicken::Frame& frame) -> bool {
+    vm.ensureShadowChicken();
+    vm.shadowChicken()->iterate(vm, callFrame, [&] (const ShadowChicken::Frame& frame) -> bool {
         frames.append(frame);
         return true;
     });

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -13469,16 +13469,18 @@
     
     LValue ensureShadowChickenPacket()
     {
+        ShadowChicken* shadowChicken = vm().shadowChicken();
+        RELEASE_ASSERT(shadowChicken);
         LBasicBlock slowCase = m_out.newBlock();
         LBasicBlock continuation = m_out.newBlock();
         
-        TypedPointer addressOfLogCursor = m_out.absolute(vm().shadowChicken().addressOfLogCursor());
+        TypedPointer addressOfLogCursor = m_out.absolute(shadowChicken->addressOfLogCursor());
         LValue logCursor = m_out.loadPtr(addressOfLogCursor);
         
         ValueFromBlock fastResult = m_out.anchor(logCursor);
         
         m_out.branch(
-            m_out.below(logCursor, m_out.constIntPtr(vm().shadowChicken().logEnd())),
+            m_out.below(logCursor, m_out.constIntPtr(shadowChicken->logEnd())),
             usually(continuation), rarely(slowCase));
         
         LBasicBlock lastNext = m_out.appendTo(slowCase, continuation);

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1588,7 +1588,8 @@
 #endif // ENABLE(JIT)
     UNUSED_PARAM(conn);
     
-    vm()->shadowChicken().update(*vm(), vm()->topCallFrame);
+    if (auto* shadowChicken = vm()->shadowChicken())
+        shadowChicken->update(*vm(), vm()->topCallFrame);
     
     m_structureIDTable.flushOldTables();
     m_objectSpace.stopAllocating();
@@ -2699,7 +2700,8 @@
             if (m_vm->typeProfiler())
                 m_vm->typeProfilerLog()->visit(slotVisitor);
             
-            m_vm->shadowChicken().visitChildren(slotVisitor);
+            if (auto* shadowChicken = m_vm->shadowChicken())
+                shadowChicken->visitChildren(slotVisitor);
         },
         ConstraintVolatility::GreyedByExecution);
     

Modified: trunk/Source/_javascript_Core/jit/CCallHelpers.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/jit/CCallHelpers.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/jit/CCallHelpers.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -54,14 +54,16 @@
 
 void CCallHelpers::ensureShadowChickenPacket(VM& vm, GPRReg shadowPacket, GPRReg scratch1NonArgGPR, GPRReg scratch2)
 {
+    ShadowChicken* shadowChicken = vm.shadowChicken();
+    RELEASE_ASSERT(shadowChicken);
     ASSERT(!RegisterSet::argumentGPRS().get(scratch1NonArgGPR));
-    move(TrustedImmPtr(vm.shadowChicken().addressOfLogCursor()), scratch1NonArgGPR);
+    move(TrustedImmPtr(shadowChicken->addressOfLogCursor()), scratch1NonArgGPR);
     loadPtr(Address(scratch1NonArgGPR), shadowPacket);
-    Jump ok = branchPtr(Below, shadowPacket, TrustedImmPtr(vm.shadowChicken().logEnd()));
+    Jump ok = branchPtr(Below, shadowPacket, TrustedImmPtr(shadowChicken->logEnd()));
     setupArguments<decltype(operationProcessShadowChickenLog)>();
     move(TrustedImmPtr(tagCFunctionPtr<OperationPtrTag>(operationProcessShadowChickenLog)), scratch1NonArgGPR);
     call(scratch1NonArgGPR, OperationPtrTag);
-    move(TrustedImmPtr(vm.shadowChicken().addressOfLogCursor()), scratch1NonArgGPR);
+    move(TrustedImmPtr(shadowChicken->addressOfLogCursor()), scratch1NonArgGPR);
     loadPtr(Address(scratch1NonArgGPR), shadowPacket);
     ok.link(this);
     addPtr(TrustedImm32(sizeof(ShadowChicken::Packet)), shadowPacket, scratch2);

Modified: trunk/Source/_javascript_Core/jit/JITExceptions.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/jit/JITExceptions.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/jit/JITExceptions.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -53,7 +53,8 @@
         CRASH();
     }
     
-    vm->shadowChicken().log(*vm, topJSCallFrame, ShadowChicken::Packet::throwPacket());
+    if (auto* shadowChicken = vm->shadowChicken())
+        shadowChicken->log(*vm, topJSCallFrame, ShadowChicken::Packet::throwPacket());
 
     Exception* exception = scope.exception();
     RELEASE_ASSERT(exception);

Modified: trunk/Source/_javascript_Core/jit/JITOpcodes.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/jit/JITOpcodes.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1460,6 +1460,7 @@
 
 void JIT::emit_op_log_shadow_chicken_prologue(const Instruction* currentInstruction)
 {
+    RELEASE_ASSERT(vm()->shadowChicken());
     updateTopCallFrame();
     static_assert(nonArgGPR0 != regT0 && nonArgGPR0 != regT2, "we will have problems if this is true.");
     auto bytecode = currentInstruction->as<OpLogShadowChickenPrologue>();
@@ -1473,6 +1474,7 @@
 
 void JIT::emit_op_log_shadow_chicken_tail(const Instruction* currentInstruction)
 {
+    RELEASE_ASSERT(vm()->shadowChicken());
     updateTopCallFrame();
     static_assert(nonArgGPR0 != regT0 && nonArgGPR0 != regT2, "we will have problems if this is true.");
     auto bytecode = currentInstruction->as<OpLogShadowChickenTail>();

Modified: trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1335,6 +1335,7 @@
 
 void JIT::emit_op_log_shadow_chicken_prologue(const Instruction* currentInstruction)
 {
+    RELEASE_ASSERT(vm()->shadowChicken());
     updateTopCallFrame();
     static_assert(nonArgGPR0 != regT0 && nonArgGPR0 != regT2, "we will have problems if this is true.");
     auto bytecode = currentInstruction->as<OpLogShadowChickenPrologue>();
@@ -1350,6 +1351,7 @@
 
 void JIT::emit_op_log_shadow_chicken_tail(const Instruction* currentInstruction)
 {
+    RELEASE_ASSERT(vm()->shadowChicken());
     updateTopCallFrame();
     static_assert(nonArgGPR0 != regT0 && nonArgGPR0 != regT2, "we will have problems if this is true.");
     auto bytecode = currentInstruction->as<OpLogShadowChickenTail>();

Modified: trunk/Source/_javascript_Core/jit/JITOperations.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/jit/JITOperations.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/jit/JITOperations.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -2882,7 +2882,8 @@
 {
     VM& vm = exec->vm();
     NativeCallFrameTracer tracer(&vm, exec);
-    vm.shadowChicken().update(vm, exec);
+    RELEASE_ASSERT(vm.shadowChicken());
+    vm.shadowChicken()->update(vm, exec);
 }
 
 int32_t JIT_OPERATION operationCheckIfExceptionIsUncatchableAndNotifyProfiler(ExecState* exec)

Modified: trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1891,7 +1891,9 @@
     
     auto bytecode = pc->as<OpLogShadowChickenPrologue>();
     JSScope* scope = exec->uncheckedR(bytecode.m_scope).Register::scope();
-    vm.shadowChicken().log(vm, exec, ShadowChicken::Packet::prologue(exec->jsCallee(), exec, exec->callerFrame(), scope));
+    ShadowChicken* shadowChicken = vm.shadowChicken();
+    RELEASE_ASSERT(shadowChicken);
+    shadowChicken->log(vm, exec, ShadowChicken::Packet::prologue(exec->jsCallee(), exec, exec->callerFrame(), scope));
     
     LLINT_END();
 }
@@ -1909,7 +1911,9 @@
 #else
     CallSiteIndex callSiteIndex(pc);
 #endif
-    vm.shadowChicken().log(vm, exec, ShadowChicken::Packet::tail(exec, thisValue, scope, exec->codeBlock(), callSiteIndex));
+    ShadowChicken* shadowChicken = vm.shadowChicken();
+    RELEASE_ASSERT(shadowChicken);
+    shadowChicken->log(vm, exec, ShadowChicken::Packet::tail(exec, thisValue, scope, exec->codeBlock(), callSiteIndex));
     
     LLINT_END();
 }

Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1897,6 +1897,13 @@
     vm().queueMicrotask(*this, WTFMove(task));
 }
 
+void JSGlobalObject::setDebugger(Debugger* debugger)
+{
+    m_debugger = debugger;
+    if (debugger)
+        vm().ensureShadowChicken();
+}
+
 bool JSGlobalObject::hasDebugger() const
 { 
     return m_debugger;

Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.h (240636 => 240637)


--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.h	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.h	2019-01-29 04:33:33 UTC (rev 240637)
@@ -914,7 +914,7 @@
     }
 
     Debugger* debugger() const { return m_debugger; }
-    void setDebugger(Debugger* debugger) { m_debugger = debugger; }
+    void setDebugger(Debugger*);
 
     const GlobalObjectMethodTable* globalObjectMethodTable() const { return m_globalObjectMethodTable; }
 

Modified: trunk/Source/_javascript_Core/runtime/VM.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/runtime/VM.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/runtime/VM.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -360,7 +360,6 @@
     , m_typeProfilerEnabledCount(0)
     , m_primitiveGigacageEnabled(IsWatched)
     , m_controlFlowProfilerEnabledCount(0)
-    , m_shadowChicken(std::make_unique<ShadowChicken>())
 {
     interpreter = new Interpreter(*this);
     StackBounds stack = Thread::current().stack();
@@ -509,6 +508,9 @@
     if (!canUseJIT())
         noJITValueProfileSingleton = std::make_unique<ValueProfile>(0);
 
+    if (Options::forceDebuggerBytecodeGeneration() || Options::alwaysUseShadowChicken())
+        ensureShadowChicken();
+
     VMInspector::instance().add(this);
 }
 
@@ -1239,6 +1241,13 @@
         scratchBuffer->setActiveLength(0);
 }
 
+void VM::ensureShadowChicken()
+{
+    if (m_shadowChicken)
+        return;
+    m_shadowChicken = std::make_unique<ShadowChicken>();
+}
+
 JSGlobalObject* VM::vmEntryGlobalObject(const CallFrame* callFrame) const
 {
     if (callFrame && callFrame->isGlobalExec()) {

Modified: trunk/Source/_javascript_Core/runtime/VM.h (240636 => 240637)


--- trunk/Source/_javascript_Core/runtime/VM.h	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/runtime/VM.h	2019-01-29 04:33:33 UTC (rev 240637)
@@ -857,7 +857,8 @@
 
     BytecodeIntrinsicRegistry& bytecodeIntrinsicRegistry() { return *m_bytecodeIntrinsicRegistry; }
     
-    ShadowChicken& shadowChicken() { return *m_shadowChicken; }
+    ShadowChicken* shadowChicken() { return m_shadowChicken.get(); }
+    void ensureShadowChicken();
     
     template<typename Func>
     void logEvent(CodeBlock*, const char* summary, const Func& func);

Modified: trunk/Source/_javascript_Core/tools/JSDollarVM.cpp (240636 => 240637)


--- trunk/Source/_javascript_Core/tools/JSDollarVM.cpp	2019-01-29 04:00:08 UTC (rev 240636)
+++ trunk/Source/_javascript_Core/tools/JSDollarVM.cpp	2019-01-29 04:33:33 UTC (rev 240637)
@@ -1932,7 +1932,22 @@
 static EncodedJSValue JSC_HOST_CALL functionShadowChickenFunctionsOnStack(ExecState* exec)
 {
     VM& vm = exec->vm();
-    return JSValue::encode(vm.shadowChicken().functionsOnStack(exec));
+    auto scope = DECLARE_THROW_SCOPE(vm);
+    if (auto* shadowChicken = vm.shadowChicken())
+        return JSValue::encode(shadowChicken->functionsOnStack(exec));
+
+    JSArray* result = constructEmptyArray(exec, 0);
+    RETURN_IF_EXCEPTION(scope, { });
+    StackVisitor::visit(exec, &vm, [&] (StackVisitor& visitor) -> StackVisitor::Status {
+        if (visitor->isInlinedFrame())
+            return StackVisitor::Continue;
+        if (visitor->isWasmFrame())
+            return StackVisitor::Continue;
+        result->push(exec, jsCast<JSObject*>(visitor->callee().asCell()));
+        scope.releaseAssertNoException(); // This function is only called from tests.
+        return StackVisitor::Continue;
+    });
+    return JSValue::encode(result);
 }
 
 static EncodedJSValue JSC_HOST_CALL functionSetGlobalConstRedeclarationShouldNotThrow(ExecState* exec)
@@ -2047,6 +2062,8 @@
     vm->whenIdle([=] () {
         Options::forceDebuggerBytecodeGeneration() = newDebuggerMode;
         vm->deleteAllCode(PreventCollectionAndDeleteAllCode);
+        if (mode == DebuggerMode::DebuggerOn)
+            vm->ensureShadowChicken();
     });
     return JSValue::encode(jsUndefined());
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to