Changeset 220416 in webkit for trunk/Source/JavaScriptCore
- Timestamp:
- Aug 8, 2017, 12:44:20 PM (8 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r220404 r220416 1 2017-08-08 Filip Pizlo <[email protected]> 2 3 Baseline JIT should do caging 4 https://bugs.webkit.org/show_bug.cgi?id=175037 5 6 Reviewed by Mark Lam. 7 8 Adds a AssemblyHelpers::cage and cageConditionally. Uses it in the baseline JIT. 9 10 Also modifies FTL caging to be more defensive when caging is disabled. 11 12 Relanded with fixed AssemblyHelpers::cageConditionally(). 13 14 * bytecode/AccessCase.cpp: 15 (JSC::AccessCase::generateImpl): 16 * bytecode/InlineAccess.cpp: 17 (JSC::InlineAccess::dumpCacheSizesAndCrash): 18 (JSC::InlineAccess::generateSelfPropertyAccess): 19 (JSC::InlineAccess::generateSelfPropertyReplace): 20 (JSC::InlineAccess::generateArrayLength): 21 * ftl/FTLLowerDFGToB3.cpp: 22 (JSC::FTL::DFG::LowerDFGToB3::caged): 23 * jit/AssemblyHelpers.h: 24 (JSC::AssemblyHelpers::cage): 25 (JSC::AssemblyHelpers::cageConditionally): 26 * jit/JITPropertyAccess.cpp: 27 (JSC::JIT::emitDoubleLoad): 28 (JSC::JIT::emitContiguousLoad): 29 (JSC::JIT::emitArrayStorageLoad): 30 (JSC::JIT::emitGenericContiguousPutByVal): 31 (JSC::JIT::emitArrayStoragePutByVal): 32 (JSC::JIT::emit_op_get_from_scope): 33 (JSC::JIT::emit_op_put_to_scope): 34 (JSC::JIT::emitIntTypedArrayGetByVal): 35 (JSC::JIT::emitFloatTypedArrayGetByVal): 36 (JSC::JIT::emitIntTypedArrayPutByVal): 37 (JSC::JIT::emitFloatTypedArrayPutByVal): 38 * jsc.cpp: 39 (jscmain): 40 (primitiveGigacageDisabled): Deleted. 41 1 42 2017-08-08 Ryan Haddad <[email protected]> 2 43 -
trunk/Source/JavaScriptCore/bytecode/AccessCase.cpp
r220404 r220416 528 528 CCallHelpers::Address(baseForAccessGPR, JSObject::butterflyOffset()), 529 529 loadedValueGPR); 530 // FIXME: Do caging! 531 // https://bugs.webkit.org/show_bug.cgi?id=175295 530 532 storageGPR = loadedValueGPR; 531 533 } … … 878 880 879 881 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR3); 882 // FIXME: Do caging! 883 // https://bugs.webkit.org/show_bug.cgi?id=175295 880 884 881 885 // We have scratchGPR = new storage, scratchGPR3 = old storage, … … 956 960 offsetInInlineStorage(m_offset) * sizeof(JSValue))); 957 961 } else { 958 if (!allocating) 962 if (!allocating) { 959 963 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR); 964 // FIXME: Do caging! 965 // https://bugs.webkit.org/show_bug.cgi?id=175295 966 } 960 967 jit.storeValue( 961 968 valueRegs, … … 993 1000 case ArrayLength: { 994 1001 jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR); 1002 // FIXME: Do caging! 1003 // https://bugs.webkit.org/show_bug.cgi?id=175295 995 1004 jit.load32(CCallHelpers::Address(scratchGPR, ArrayStorage::lengthOffset()), scratchGPR); 996 1005 state.failAndIgnore.append( -
trunk/Source/JavaScriptCore/bytecode/InlineAccess.cpp
r220404 r220416 58 58 CCallHelpers::NotEqual, value, CCallHelpers::TrustedImm32(IsArray | ContiguousShape)); 59 59 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value); 60 // FIXME: Do caging! 61 // https://bugs.webkit.org/show_bug.cgi?id=175295 60 62 jit.load32(CCallHelpers::Address(value, ArrayStorage::lengthOffset()), value); 61 63 jit.boxInt32(scratchGPR, regs); … … 74 76 CCallHelpers::Address(base, JSObject::butterflyOffset()), 75 77 value); 78 // FIXME: Do caging! 79 // https://bugs.webkit.org/show_bug.cgi?id=175295 76 80 GPRReg storageGPR = value; 77 81 jit.loadValue( … … 117 121 118 122 jit.loadPtr(MacroAssembler::Address(base, JSObject::butterflyOffset()), value); 123 // FIXME: Do caging! 124 // https://bugs.webkit.org/show_bug.cgi?id=175295 119 125 jit.storeValue( 120 126 regs, … … 171 177 else { 172 178 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value.payloadGPR()); 179 // FIXME: Do caging! 180 // https://bugs.webkit.org/show_bug.cgi?id=175295 173 181 storage = value.payloadGPR(); 174 182 } … … 232 240 ASSERT(storage != InvalidGPRReg); 233 241 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), storage); 242 // FIXME: Do caging! 243 // https://bugs.webkit.org/show_bug.cgi?id=175295 234 244 } 235 245 … … 270 280 CCallHelpers::NotEqual, scratch, CCallHelpers::TrustedImm32(array->indexingType())); 271 281 jit.loadPtr(CCallHelpers::Address(base, JSObject::butterflyOffset()), value.payloadGPR()); 282 // FIXME: Do caging! 283 // https://bugs.webkit.org/show_bug.cgi?id=175295 272 284 jit.load32(CCallHelpers::Address(value.payloadGPR(), ArrayStorage::lengthOffset()), value.payloadGPR()); 273 285 jit.boxInt32(value.payloadGPR(), value); -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r220404 r220416 11617 11617 LValue caged(Gigacage::Kind kind, LValue ptr) 11618 11618 { 11619 if (kind == Gigacage::Primitive) { 11619 if (!Gigacage::shouldBeEnabled()) 11620 return ptr; 11621 11622 if (kind == Gigacage::Primitive && Gigacage::canPrimitiveGigacageBeDisabled()) { 11620 11623 if (vm().primitiveGigacageEnabled().isStillValid()) 11621 11624 m_graph.watchpoints().addLazily(vm().primitiveGigacageEnabled()); -
trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h
r220404 r220416 1310 1310 storeFence(); 1311 1311 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 1312 1347 } 1313 1348 -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r220404 r220416 173 173 174 174 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(DoubleShape)); 175 // FIXME: Should do caging.176 // https://bugs.webkit.org/show_bug.cgi?id=175037177 175 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 176 cage(Gigacage::JSValue, regT2); 178 177 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, Butterfly::offsetOfPublicLength()))); 179 178 loadDouble(BaseIndex(regT2, regT1, TimesEight), fpRegT0); … … 188 187 189 188 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(expectedShape)); 190 // FIXME: Should do caging.191 // https://bugs.webkit.org/show_bug.cgi?id=175037192 189 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 190 cage(Gigacage::JSValue, regT2); 193 191 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, Butterfly::offsetOfPublicLength()))); 194 192 load64(BaseIndex(regT2, regT1, TimesEight), regT0); … … 205 203 badType = patchableBranch32(Above, regT3, TrustedImm32(SlowPutArrayStorageShape - ArrayStorageShape)); 206 204 207 // FIXME: Should do caging.208 // https://bugs.webkit.org/show_bug.cgi?id=175037209 205 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 206 cage(Gigacage::JSValue, regT2); 210 207 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, ArrayStorage::vectorLengthOffset()))); 211 208 … … 354 351 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(indexingShape)); 355 352 356 // FIXME: Should do caging.357 // https://bugs.webkit.org/show_bug.cgi?id=175037358 353 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 354 cage(Gigacage::JSValue, regT2); 359 355 Jump outOfBounds = branch32(AboveOrEqual, regT1, Address(regT2, Butterfly::offsetOfPublicLength())); 360 356 … … 411 407 412 408 badType = patchableBranch32(NotEqual, regT2, TrustedImm32(ArrayStorageShape)); 413 // FIXME: Should do caging.414 // https://bugs.webkit.org/show_bug.cgi?id=175037415 409 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT2); 410 cage(Gigacage::JSValue, regT2); 416 411 slowCases.append(branch32(AboveOrEqual, regT1, Address(regT2, ArrayStorage::vectorLengthOffset()))); 417 412 … … 924 919 isOutOfLine.link(this); 925 920 } 926 // FIXME: Should do caging.927 // https://bugs.webkit.org/show_bug.cgi?id=175037928 921 loadPtr(Address(base, JSObject::butterflyOffset()), scratch); 922 cage(Gigacage::JSValue, scratch); 929 923 neg32(offset); 930 924 signExtend32ToPtr(offset, offset); … … 1067 1061 emitGetVirtualRegister(value, regT2); 1068 1062 1069 // FIXME: Should do caging.1070 // https://bugs.webkit.org/show_bug.cgi?id=1750371071 1063 loadPtr(Address(regT0, JSObject::butterflyOffset()), regT0); 1064 cage(Gigacage::JSValue, regT0); 1072 1065 loadPtr(operandSlot, regT1); 1073 1066 negPtr(regT1); … … 1577 1570 RegisterID resultPayload = regT0; 1578 1571 RegisterID scratch = regT3; 1572 RegisterID scratch2 = regT4; 1579 1573 #else 1580 1574 RegisterID base = regT0; … … 1583 1577 RegisterID resultTag = regT1; 1584 1578 RegisterID scratch = regT3; 1579 RegisterID scratch2 = regT4; 1585 1580 #endif 1586 1581 … … 1590 1585 badType = patchableBranch32(NotEqual, scratch, TrustedImm32(typeForTypedArrayType(type))); 1591 1586 slowCases.append(branch32(AboveOrEqual, property, Address(base, JSArrayBufferView::offsetOfLength()))); 1592 // FIXME: Should do caging.1593 // https://bugs.webkit.org/show_bug.cgi?id=1750371594 1587 loadPtr(Address(base, JSArrayBufferView::offsetOfVector()), scratch); 1588 cageConditionally(Gigacage::Primitive, scratch, scratch2); 1595 1589 1596 1590 switch (elementSize(type)) { … … 1650 1644 RegisterID resultPayload = regT0; 1651 1645 RegisterID scratch = regT3; 1646 RegisterID scratch2 = regT4; 1652 1647 #else 1653 1648 RegisterID base = regT0; … … 1656 1651 RegisterID resultTag = regT1; 1657 1652 RegisterID scratch = regT3; 1653 RegisterID scratch2 = regT4; 1658 1654 #endif 1659 1655 … … 1663 1659 badType = patchableBranch32(NotEqual, scratch, TrustedImm32(typeForTypedArrayType(type))); 1664 1660 slowCases.append(branch32(AboveOrEqual, property, Address(base, JSArrayBufferView::offsetOfLength()))); 1665 // FIXME: Should do caging.1666 // https://bugs.webkit.org/show_bug.cgi?id=1750371667 1661 loadPtr(Address(base, JSArrayBufferView::offsetOfVector()), scratch); 1662 cageConditionally(Gigacage::Primitive, scratch, scratch2); 1668 1663 1669 1664 switch (elementSize(type)) { … … 1706 1701 RegisterID earlyScratch = regT3; 1707 1702 RegisterID lateScratch = regT2; 1703 RegisterID lateScratch2 = regT4; 1708 1704 #else 1709 1705 RegisterID base = regT0; … … 1711 1707 RegisterID earlyScratch = regT3; 1712 1708 RegisterID lateScratch = regT1; 1709 RegisterID lateScratch2 = regT4; 1713 1710 #endif 1714 1711 … … 1732 1729 // We would be loading this into base as in get_by_val, except that the slow 1733 1730 // path expects the base to be unclobbered. 1734 // FIXME: Should do caging.1735 // https://bugs.webkit.org/show_bug.cgi?id=1750371736 1731 loadPtr(Address(base, JSArrayBufferView::offsetOfVector()), lateScratch); 1732 cageConditionally(Gigacage::Primitive, lateScratch, lateScratch2); 1737 1733 1738 1734 if (isClamped(type)) { … … 1778 1774 RegisterID earlyScratch = regT3; 1779 1775 RegisterID lateScratch = regT2; 1776 RegisterID lateScratch2 = regT4; 1780 1777 #else 1781 1778 RegisterID base = regT0; … … 1783 1780 RegisterID earlyScratch = regT3; 1784 1781 RegisterID lateScratch = regT1; 1782 RegisterID lateScratch2 = regT4; 1785 1783 #endif 1786 1784 … … 1817 1815 // We would be loading this into base as in get_by_val, except that the slow 1818 1816 // path expects the base to be unclobbered. 1819 // FIXME: Should do caging.1820 // https://bugs.webkit.org/show_bug.cgi?id=1750371821 1817 loadPtr(Address(base, JSArrayBufferView::offsetOfVector()), lateScratch); 1818 cageConditionally(Gigacage::Primitive, lateScratch, lateScratch2); 1822 1819 1823 1820 switch (elementSize(type)) { -
trunk/Source/JavaScriptCore/jsc.cpp
r220404 r220416 3803 3803 } 3804 3804 3805 static void primitiveGigacageDisabled(void*)3806 {3807 dataLog("Primitive gigacage disabled! Aborting.\n");3808 UNREACHABLE_FOR_PLATFORM();3809 }3810 3811 3805 int jscmain(int argc, char** argv) 3812 3806 { … … 3827 3821 JSC::Wasm::enableFastMemory(); 3828 3822 #endif 3829 if (Gigacage::shouldBeEnabled()) 3830 Gigacage::addPrimitiveDisableCallback(primitiveGigacageDisabled, nullptr); 3823 Gigacage::disableDisablingPrimitiveGigacageIfShouldBeEnabled(); 3831 3824 3832 3825 int result;
Note:
See TracChangeset
for help on using the changeset viewer.