Ignore:
Timestamp:
Aug 8, 2017, 12:44:20 PM (8 years ago)
Author:
[email protected]
Message:

Baseline JIT should do caging
https://bugs.webkit.org/show_bug.cgi?id=175037

Reviewed by Mark Lam.
Source/bmalloc:


This centralizes the notion of permanently enabling the primitive gigacage, which we only do in jsc
and WebProcess.

This saves the baseline JIT from emitting some code. Otherwise it would always have to emit enabled
checks on each typed array access.

  • bmalloc/Gigacage.cpp:

(Gigacage::primitiveGigacageDisabled):
(Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
(Gigacage::isDisablingPrimitiveGigacageDisabled):

  • bmalloc/Gigacage.h:

(Gigacage::isPrimitiveGigacagePermanentlyEnabled):
(Gigacage::canPrimitiveGigacageBeDisabled):

Source/JavaScriptCore:


Adds a AssemblyHelpers::cage and cageConditionally. Uses it in the baseline JIT.

Also modifies FTL caging to be more defensive when caging is disabled.

Relanded with fixed AssemblyHelpers::cageConditionally().

  • bytecode/AccessCase.cpp:

(JSC::AccessCase::generateImpl):

  • bytecode/InlineAccess.cpp:

(JSC::InlineAccess::dumpCacheSizesAndCrash):
(JSC::InlineAccess::generateSelfPropertyAccess):
(JSC::InlineAccess::generateSelfPropertyReplace):
(JSC::InlineAccess::generateArrayLength):

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::caged):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::cage):
(JSC::AssemblyHelpers::cageConditionally):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emitDoubleLoad):
(JSC::JIT::emitContiguousLoad):
(JSC::JIT::emitArrayStorageLoad):
(JSC::JIT::emitGenericContiguousPutByVal):
(JSC::JIT::emitArrayStoragePutByVal):
(JSC::JIT::emit_op_get_from_scope):
(JSC::JIT::emit_op_put_to_scope):
(JSC::JIT::emitIntTypedArrayGetByVal):
(JSC::JIT::emitFloatTypedArrayGetByVal):
(JSC::JIT::emitIntTypedArrayPutByVal):
(JSC::JIT::emitFloatTypedArrayPutByVal):

  • jsc.cpp:

(jscmain):
(primitiveGigacageDisabled): Deleted.

Source/WebKit:


Use a better API to disable disabling the primitive gigacage.

  • WebProcess/WebProcess.cpp:

(WebKit::m_webSQLiteDatabaseTracker):
(WebKit::primitiveGigacageDisabled): Deleted.

Source/WTF:

  • wtf/Gigacage.h:

(Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled):
(Gigacage::isDisablingPrimitiveGigacageDisabled):
(Gigacage::isPrimitiveGigacagePermanentlyEnabled):
(Gigacage::canPrimitiveGigacageBeDisabled):
(Gigacage::basePtr):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r220404 r220416  
    13101310        storeFence();
    13111311        ok.link(this);
     1312    }
     1313   
     1314    void cage(Gigacage::Kind kind, GPRReg storage)
     1315    {
     1316#if GIGACAGE_ENABLED
     1317        if (!Gigacage::shouldBeEnabled())
     1318            return;
     1319       
     1320        andPtr(TrustedImmPtr(static_cast<size_t>(GIGACAGE_MASK)), storage);
     1321        addPtr(TrustedImmPtr(Gigacage::basePtr(kind)), storage);
     1322#else
     1323        UNUSED_PARAM(kind);
     1324        UNUSED_PARAM(storage);
     1325#endif
     1326    }
     1327   
     1328    void cageConditionally(Gigacage::Kind kind, GPRReg storage, GPRReg scratch)
     1329    {
     1330#if GIGACAGE_ENABLED
     1331        if (!Gigacage::shouldBeEnabled())
     1332            return;
     1333       
     1334        if (kind != Gigacage::Primitive || Gigacage::isDisablingPrimitiveGigacageDisabled())
     1335            return cage(kind, storage);
     1336       
     1337        loadPtr(&Gigacage::basePtr(kind), scratch);
     1338        Jump done = branchTestPtr(Zero, scratch);
     1339        andPtr(TrustedImmPtr(static_cast<size_t>(GIGACAGE_MASK)), storage);
     1340        addPtr(scratch, storage);
     1341        done.link(this);
     1342#else
     1343        UNUSED_PARAM(kind);
     1344        UNUSED_PARAM(storage);
     1345        UNUSED_PARAM(scratch);
     1346#endif
    13121347    }
    13131348   
Note: See TracChangeset for help on using the changeset viewer.