Diff
Modified: trunk/Source/_javascript_Core/CMakeLists.txt (262477 => 262478)
--- trunk/Source/_javascript_Core/CMakeLists.txt 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/CMakeLists.txt 2020-06-03 06:25:50 UTC (rev 262478)
@@ -564,7 +564,6 @@
dfg/DFGCommon.h
dfg/DFGCompilationMode.h
- dfg/DFGDoesGCCheck.h
dfg/DFGMinifiedID.h
domjit/DOMJITAbstractHeap.h
Modified: trunk/Source/_javascript_Core/ChangeLog (262477 => 262478)
--- trunk/Source/_javascript_Core/ChangeLog 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/ChangeLog 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,76 @@
2020-06-02 Mark Lam <[email protected]>
+ Rolling out r262475 to unbreak Windows bot.
+ https://bugs.webkit.org/show_bug.cgi?id=212680
+
+ Not reviewed.
+
+ * CMakeLists.txt:
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * Sources.txt:
+ * assembler/MacroAssemblerARM64.h:
+ * assembler/MacroAssemblerX86_64.h:
+ * assembler/testmasm.cpp:
+ (JSC::testCountTrailingZeros64WithoutNullCheck):
+ (JSC::run):
+ (JSC::testStore64Imm64AddressPointer): Deleted.
+ * dfg/DFGDoesGCCheck.cpp: Removed.
+ * dfg/DFGDoesGCCheck.h: Removed.
+ * dfg/DFGGraph.cpp:
+ * dfg/DFGOSRExit.cpp:
+ (JSC::DFG::operationCompileOSRExit):
+ (JSC::DFG::OSRExit::compileExit):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::compile):
+ * ftl/FTLLowerDFGToB3.cpp:
+ (JSC::FTL::DFG::LowerDFGToB3::compileNode):
+ * ftl/FTLOSRExitCompiler.cpp:
+ (JSC::FTL::compileStub):
+ (JSC::FTL::operationCompileFTLOSRExit):
+ * heap/CompleteSubspace.cpp:
+ (JSC::CompleteSubspace::tryAllocateSlow):
+ (JSC::CompleteSubspace::reallocatePreciseAllocationNonVirtual):
+ * heap/CompleteSubspaceInlines.h:
+ (JSC::CompleteSubspace::allocateNonVirtual):
+ * heap/DeferGC.h:
+ (JSC::DeferGC::~DeferGC):
+ * heap/GCDeferralContextInlines.h:
+ (JSC::GCDeferralContext::~GCDeferralContext):
+ * heap/Heap.cpp:
+ (JSC::Heap::collectNow):
+ (JSC::Heap::collectAsync):
+ (JSC::Heap::collectSync):
+ (JSC::Heap::stopIfNecessarySlow):
+ (JSC::Heap::collectIfNecessaryOrDefer):
+ * heap/Heap.h:
+ (JSC::Heap::expectDoesGC const):
+ (JSC::Heap::setExpectDoesGC):
+ (JSC::Heap::addressOfExpectDoesGC):
+ (JSC::Heap::addressOfDoesGC): Deleted.
+ (JSC::Heap::setDoesGCExpectation): Deleted.
+ (JSC::Heap::verifyCanGC): Deleted.
+ * heap/HeapInlines.h:
+ (JSC::Heap::acquireAccess):
+ (JSC::Heap::stopIfNecessary):
+ * heap/LocalAllocatorInlines.h:
+ (JSC::LocalAllocator::allocate):
+ * heap/PreciseAllocation.cpp:
+ (JSC::PreciseAllocation::tryCreate):
+ (JSC::PreciseAllocation::createForLowerTier):
+ * runtime/JSString.h:
+ (JSC::jsSingleCharacterString):
+ (JSC::JSString::toAtomString const):
+ (JSC::JSString::toExistingAtomString const):
+ (JSC::JSString::value const):
+ (JSC::JSString::tryGetValue const):
+ (JSC::JSRopeString::unsafeView const):
+ (JSC::JSRopeString::viewWithUnderlyingString const):
+ (JSC::JSString::unsafeView const):
+ * runtime/RegExpMatchesArray.h:
+ (JSC::createRegExpMatchesArray):
+
+2020-06-02 Mark Lam <[email protected]>
+
Enhance DoesGC verification to print more useful info when verification fails.
https://bugs.webkit.org/show_bug.cgi?id=212680
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (262477 => 262478)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1936,7 +1936,6 @@
FEB51F6C1A97B688001F921C /* Regress141809.mm in Sources */ = {isa = PBXBuildFile; fileRef = FEB51F6B1A97B688001F921C /* Regress141809.mm */; };
FEB58C15187B8B160098EF0B /* ErrorHandlingScope.h in Headers */ = {isa = PBXBuildFile; fileRef = FEB58C13187B8B160098EF0B /* ErrorHandlingScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
FEC160322339E9F900A04CB8 /* CellSize.h in Headers */ = {isa = PBXBuildFile; fileRef = FEC160312339E9F900A04CB8 /* CellSize.h */; };
- FEC3A3A1248735CA00395B54 /* DFGDoesGCCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = FEC3A3A0248735BC00395B54 /* DFGDoesGCCheck.h */; settings = {ATTRIBUTES = (Private, ); }; };
FEC5797323105B5100BCA83F /* VMInspectorInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = FEC5797223105B4800BCA83F /* VMInspectorInlines.h */; };
FEC5797623105F4E00BCA83F /* Integrity.h in Headers */ = {isa = PBXBuildFile; fileRef = FEC5797523105F4300BCA83F /* Integrity.h */; settings = {ATTRIBUTES = (Private, ); }; };
FEC579782310954C00BCA83F /* IntegrityInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = FEC579772310954B00BCA83F /* IntegrityInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -5233,8 +5232,6 @@
FEB58C12187B8B160098EF0B /* ErrorHandlingScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorHandlingScope.cpp; sourceTree = "<group>"; };
FEB58C13187B8B160098EF0B /* ErrorHandlingScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorHandlingScope.h; sourceTree = "<group>"; };
FEC160312339E9F900A04CB8 /* CellSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellSize.h; sourceTree = "<group>"; };
- FEC3A39F248735BC00395B54 /* DFGDoesGCCheck.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DFGDoesGCCheck.cpp; path = dfg/DFGDoesGCCheck.cpp; sourceTree = "<group>"; };
- FEC3A3A0248735BC00395B54 /* DFGDoesGCCheck.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DFGDoesGCCheck.h; path = dfg/DFGDoesGCCheck.h; sourceTree = "<group>"; };
FEC5797223105B4800BCA83F /* VMInspectorInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VMInspectorInlines.h; sourceTree = "<group>"; };
FEC5797423105F4200BCA83F /* Integrity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Integrity.cpp; sourceTree = "<group>"; };
FEC5797523105F4300BCA83F /* Integrity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Integrity.h; sourceTree = "<group>"; };
@@ -7899,8 +7896,6 @@
0FF427621591A1C9004CB9FF /* DFGDisassembler.h */,
0F5A1271192D9FDF008764A3 /* DFGDoesGC.cpp */,
0F5A1272192D9FDF008764A3 /* DFGDoesGC.h */,
- FEC3A39F248735BC00395B54 /* DFGDoesGCCheck.cpp */,
- FEC3A3A0248735BC00395B54 /* DFGDoesGCCheck.h */,
0FD81AD0154FB4EB00983E72 /* DFGDominators.h */,
0F1E3A441534CBAD000F9456 /* DFGDoubleFormatState.h */,
0FD3C82014115CF800FD81CB /* DFGDriver.cpp */,
@@ -10201,7 +10196,6 @@
79D5CD5B1C1106A900CECA07 /* SamplingProfiler.h in Headers */,
0FE050281AA9095600D33B33 /* ScopedArguments.h in Headers */,
0FE050291AA9095600D33B33 /* ScopedArgumentsTable.h in Headers */,
- FEC3A3A1248735CA00395B54 /* DFGDoesGCCheck.h in Headers */,
0FE0502B1AA9095600D33B33 /* ScopeOffset.h in Headers */,
0F24E55217EE274900ABB217 /* ScratchRegisterAllocator.h in Headers */,
33111B8B2397256500AA34CE /* Scribble.h in Headers */,
Modified: trunk/Source/_javascript_Core/Sources.txt (262477 => 262478)
--- trunk/Source/_javascript_Core/Sources.txt 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/Sources.txt 2020-06-03 06:25:50 UTC (rev 262478)
@@ -347,7 +347,6 @@
dfg/DFGDesiredWeakReferences.cpp
dfg/DFGDisassembler.cpp
dfg/DFGDoesGC.cpp
-dfg/DFGDoesGCCheck.cpp
dfg/DFGDriver.cpp
dfg/DFGEdge.cpp
dfg/DFGEpoch.cpp
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (262477 => 262478)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1459,17 +1459,6 @@
store<64>(src, address);
}
- void store64(TrustedImm64 imm, const void* address)
- {
- if (!imm.m_value) {
- store64(ARM64Registers::zr, address);
- return;
- }
-
- moveToCachedReg(imm, dataMemoryTempRegister());
- store64(dataTempRegister, address);
- }
-
void store64(TrustedImm32 imm, ImplicitAddress address)
{
store64(TrustedImm64(imm.m_value), address);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (262477 => 262478)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -977,22 +977,6 @@
m_assembler.movq_i32m(imm.m_value, address.offset, address.base, address.index, address.scale);
}
- void store64(TrustedImm64 imm, void* address)
- {
- if (CAN_SIGN_EXTEND_32_64(imm.m_value)) {
- auto addressReg = scratchRegister();
- move(TrustedImmPtr(address), addressReg);
- store64(TrustedImm32(static_cast<int32_t>(imm.m_value)), addressReg);
- return;
- }
-
- auto src = ""
- move(imm, src);
- swap(src, X86Registers::eax);
- m_assembler.movq_EAXm(address);
- swap(src, X86Registers::eax);
- }
-
void store64(TrustedImm64 imm, ImplicitAddress address)
{
if (CAN_SIGN_EXTEND_32_64(imm.m_value)) {
Modified: trunk/Source/_javascript_Core/assembler/testmasm.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/assembler/testmasm.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/assembler/testmasm.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -658,31 +658,6 @@
bool wordCanBeZero = false;
testCountTrailingZeros64Impl(wordCanBeZero);
}
-
-void testStore64Imm64AddressPointer()
-{
- auto doTest = [] (int64_t value) {
- int64_t dest;
- void* destAddress = &dest;
-
- auto test = compile([=] (CCallHelpers& jit) {
- emitFunctionPrologue(jit);
- jit.store64(CCallHelpers::TrustedImm64(value), destAddress);
- emitFunctionEpilogue(jit);
- jit.ret();
- });
-
- invoke<size_t>(test);
- CHECK_EQ(dest, value);
- };
-
- for (auto value : int64Operands())
- doTest(value);
-
- doTest(0x98765555AAAA4321);
- doTest(0xAAAA432198765555);
-}
-
#endif // CPU(X86_64) || CPU(ARM64)
void testCompareDouble(MacroAssembler::DoubleCondition condition)
@@ -2524,7 +2499,6 @@
RUN(testClearBits64WithMaskTernary());
RUN(testCountTrailingZeros64());
RUN(testCountTrailingZeros64WithoutNullCheck());
- RUN(testStore64Imm64AddressPointer());
#endif
#if CPU(ARM64)
Deleted: trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2020 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.
- */
-
-#include "config.h"
-#include "DFGDoesGCCheck.h"
-
-#include "CallFrame.h"
-#include "CodeBlock.h"
-#include "Heap.h"
-#include "VMInspector.h"
-#include <wtf/DataLog.h>
-
-namespace JSC {
-namespace DFG {
-
-#if ENABLE(DFG_DOES_GC_VALIDATION)
-
-extern const char* dfgOpNames[];
-
-JS_EXPORT_PRIVATE void DoesGCCheck::verifyCanGC(VM& vm)
-{
- if (!expectDoesGC()) {
- dataLog("Error: DoesGC failed");
- if (isSpecial()) {
- switch (special()) {
- case Special::Uninitialized:
- break;
- case Special::DFGOSRExit:
- dataLog(" @ DFG osr exit");
- break;
- case Special::FTLOSRExit:
- dataLog(" @ FTL osr exit");
- break;
- case Special::ReservedUnused:
- case Special::NumberOfSpecials:
- RELEASE_ASSERT_NOT_REACHED();
- }
- } else
- dataLog(" @ D@", nodeIndex(), " ", DFG::dfgOpNames[nodeOp()]);
-
- CallFrame* callFrame = vm.topCallFrame;
- if (callFrame) {
- CodeBlock* codeBlock = callFrame->codeBlock();
- dataLogLn(" in ", codeBlock);
- VMInspector::dumpStack(&vm, callFrame);
- }
- dataLogLn();
- }
- RELEASE_ASSERT(expectDoesGC());
-}
-#endif // ENABLE(DFG_DOES_GC_VALIDATION)
-
-} // namespace DFG
-} // namespace JSC
-
Deleted: trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.h (262477 => 262478)
--- trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/dfg/DFGDoesGCCheck.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2020 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.
- */
-
-#pragma once
-
-#include <cstdint>
-#include <wtf/Assertions.h>
-
-namespace JSC {
-
-class VM;
-
-namespace DFG {
-
-struct DoesGCCheck {
- enum class Special {
- ReservedUnused, // so that specials start with 1. isSpecial() relies on this.
- Uninitialized,
- DFGOSRExit,
- FTLOSRExit,
- NumberOfSpecials
- };
-
- DoesGCCheck()
- : m_value(encode(true, Special::Uninitialized))
- { }
-
- static uint64_t encode(bool expectDoesGC, unsigned nodeIndex, unsigned nodeOp)
- {
- uint64_t result = bits(nodeIndex) << nodeIndexShift;
- result |= bits(nodeOp) << nodeOpShift;
- result |= bits(expectDoesGC) << expectDoesGCShift;
- return result;
- }
-
- static uint64_t encode(bool expectDoesGC, Special special)
- {
- ASSERT(bits(special) < numberOfSpecials);
- uint64_t result = bits(special) << specialShift;
- result |= bits(expectDoesGC) << expectDoesGCShift;
- return result;
- }
-
- void set(bool expectDoesGC, unsigned nodeIndex, unsigned nodeOp)
- {
- m_value = encode(expectDoesGC, nodeIndex, nodeOp);
- }
-
- void set(bool expectDoesGC, Special special)
- {
- m_value = encode(expectDoesGC, special);
- }
-
- bool expectDoesGC() { return m_value & expectDoesGCMask; }
- Special special() { return static_cast<Special>(specialIndex()); }
- unsigned nodeIndex() { return m_value >> nodeIndexShift; }
- unsigned nodeOp() { return (m_value >> nodeOpShift) & nodeOpMask; }
-
- bool isSpecial() { return specialIndex(); }
-
- void verifyCanGC(VM&);
-
-private:
- unsigned specialIndex() { return (m_value >> specialShift) & specialMask; }
-
- template<typename T> static uint64_t bits(T value) { return static_cast<uint64_t>(value); }
-
- static constexpr uint64_t numberOfSpecials = static_cast<uint64_t>(Special::NumberOfSpecials);
-
- static constexpr unsigned expectDoesGCShift = 0;
- static constexpr unsigned specialShift = 1;
- static constexpr unsigned nodeOpShift = 16;
- static constexpr unsigned nodeIndexShift = 32;
-
- static constexpr unsigned expectDoesGCMask = 0x1;
- static constexpr unsigned specialMask = 0x7fff;
- static constexpr unsigned nodeOpMask = 0xffff;
-
- uint64_t m_value { 0 };
-};
-
-} // namespace DFG
-
-using DFG::DoesGCCheck;
-
-} // namespace JSC
Modified: trunk/Source/_javascript_Core/dfg/DFGGraph.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/dfg/DFGGraph.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/dfg/DFGGraph.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -62,7 +62,7 @@
static constexpr bool dumpOSRAvailabilityData = false;
// Creates an array of stringized names.
-const char* dfgOpNames[] = {
+static const char* dfgOpNames[] = {
#define STRINGIZE_DFG_OP_ENUM(opcode, flags) #opcode ,
FOR_EACH_DFG_OP(STRINGIZE_DFG_OP_ENUM)
#undef STRINGIZE_DFG_OP_ENUM
Modified: trunk/Source/_javascript_Core/dfg/DFGOSRExit.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/dfg/DFGOSRExit.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/dfg/DFGOSRExit.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -146,7 +146,7 @@
if (validateDFGDoesGC) {
// We're about to exit optimized code. So, there's no longer any optimized
// code running that expects no GC.
- vm.heap.setDoesGCExpectation(true, DoesGCCheck::Special::DFGOSRExit);
+ vm.heap.setExpectDoesGC(true);
}
if (vm.callFrameForCatch)
@@ -555,11 +555,11 @@
// code running that expects no GC. We need to set this before arguments
// materialization below (see emitRestoreArguments()).
- // Even though we set Heap::m_doesGC in compileOSRExit(), we also need
+ // Even though we set Heap::m_expectDoesGC in compileOSRExit(), we also need
// to set it here because compileOSRExit() is only called on the first time
// we exit from this site, but all subsequent exits will take this compiled
// ramp without calling compileOSRExit() first.
- jit.store64(CCallHelpers::TrustedImm64(DoesGCCheck::encode(true, DoesGCCheck::Special::DFGOSRExit)), vm.heap.addressOfDoesGC());
+ jit.store8(CCallHelpers::TrustedImm32(true), vm.heap.addressOfExpectDoesGC());
}
// Need to ensure that the stack pointer accounts for the worst-case stack usage at exit. This
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT64.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -2138,7 +2138,7 @@
if (validateDFGDoesGC) {
bool expectDoesGC = doesGC(m_jit.graph(), node);
- m_jit.store64(TrustedImm64(DoesGCCheck::encode(expectDoesGC, node->index(), node->op())), vm().heap.addressOfDoesGC());
+ m_jit.store8(TrustedImm32(expectDoesGC), vm().heap.addressOfExpectDoesGC());
}
#if ENABLE(DFG_REGISTER_ALLOCATION_VALIDATION)
Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -704,7 +704,7 @@
if (validateDFGDoesGC) {
bool expectDoesGC = doesGC(m_graph, m_node);
- m_out.store(m_out.constInt64(DoesGCCheck::encode(expectDoesGC, m_node->index(), m_node->op())), m_out.absolute(vm().heap.addressOfDoesGC()));
+ m_out.store(m_out.constBool(expectDoesGC), m_out.absolute(vm().heap.addressOfExpectDoesGC()));
}
switch (m_node->op()) {
Modified: trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/ftl/FTLOSRExitCompiler.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -211,11 +211,11 @@
// code running that expects no GC. We need to set this before object
// materialization below.
- // Even though we set Heap::m_doesGC in compileFTLOSRExit(), we also need
+ // Even though we set Heap::m_expectDoesGC in compileFTLOSRExit(), we also need
// to set it here because compileFTLOSRExit() is only called on the first time
// we exit from this site, but all subsequent exits will take this compiled
// ramp without calling compileFTLOSRExit() first.
- jit.store64(CCallHelpers::TrustedImm64(DoesGCCheck::encode(true, DoesGCCheck::Special::FTLOSRExit)), vm.heap.addressOfDoesGC());
+ jit.store8(CCallHelpers::TrustedImm32(true), vm.heap.addressOfExpectDoesGC());
}
// Bring the stack back into a sane form and assert that it's sane.
@@ -548,7 +548,7 @@
if (validateDFGDoesGC) {
// We're about to exit optimized code. So, there's no longer any optimized
// code running that expects no GC.
- vm.heap.setDoesGCExpectation(true, DoesGCCheck::Special::FTLOSRExit);
+ vm.heap.setExpectDoesGC(true);
}
if (vm.callFrameForCatch)
Modified: trunk/Source/_javascript_Core/heap/CompleteSubspace.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/CompleteSubspace.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/CompleteSubspace.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2017-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -120,7 +120,7 @@
void* CompleteSubspace::tryAllocateSlow(VM& vm, size_t size, GCDeferralContext* deferralContext)
{
if (validateDFGDoesGC)
- vm.heap.verifyCanGC();
+ RELEASE_ASSERT(vm.heap.expectDoesGC());
sanitizeStackForVM(vm);
@@ -156,7 +156,7 @@
void* CompleteSubspace::reallocatePreciseAllocationNonVirtual(VM& vm, HeapCell* oldCell, size_t size, GCDeferralContext* deferralContext, AllocationFailureMode failureMode)
{
if (validateDFGDoesGC)
- vm.heap.verifyCanGC();
+ RELEASE_ASSERT(vm.heap.expectDoesGC());
// The following conditions are met in Butterfly for example.
ASSERT(oldCell->isPreciseAllocation());
Modified: trunk/Source/_javascript_Core/heap/CompleteSubspaceInlines.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/CompleteSubspaceInlines.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/CompleteSubspaceInlines.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -33,7 +33,7 @@
ALWAYS_INLINE void* CompleteSubspace::allocateNonVirtual(VM& vm, size_t size, GCDeferralContext* deferralContext, AllocationFailureMode failureMode)
{
if (validateDFGDoesGC)
- vm.heap.verifyCanGC();
+ RELEASE_ASSERT(vm.heap.expectDoesGC());
if (Allocator allocator = allocatorForNonVirtual(size, AllocatorForMode::AllocatorIfExists))
return allocator.allocate(vm.heap, deferralContext, failureMode);
Modified: trunk/Source/_javascript_Core/heap/DeferGC.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/DeferGC.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/DeferGC.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -45,7 +45,7 @@
~DeferGC()
{
if (validateDFGDoesGC)
- m_heap.verifyCanGC();
+ RELEASE_ASSERT(m_heap.expectDoesGC());
m_heap.decrementDeferralDepthAndGCIfNeeded();
}
Modified: trunk/Source/_javascript_Core/heap/GCDeferralContextInlines.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/GCDeferralContextInlines.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/GCDeferralContextInlines.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -38,7 +38,7 @@
ALWAYS_INLINE GCDeferralContext::~GCDeferralContext()
{
if (validateDFGDoesGC)
- m_heap.verifyCanGC();
+ RELEASE_ASSERT(m_heap.expectDoesGC());
if (UNLIKELY(m_shouldGC))
m_heap.collectIfNecessaryOrDefer();
Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/Heap.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2003-2019 Apple Inc. All rights reserved.
* Copyright (C) 2007 Eric Seidel <[email protected]>
*
* This library is free software; you can redistribute it and/or
@@ -1064,7 +1064,7 @@
void Heap::collectNow(Synchronousness synchronousness, GCRequest request)
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
switch (synchronousness) {
case Async: {
@@ -1097,7 +1097,7 @@
void Heap::collectAsync(GCRequest request)
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
if (!m_isSafeToCollect)
return;
@@ -1121,7 +1121,7 @@
void Heap::collectSync(GCRequest request)
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
if (!m_isSafeToCollect)
return;
@@ -1784,7 +1784,7 @@
void Heap::stopIfNecessarySlow()
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
while (stopIfNecessarySlow(m_worldState.load())) { }
@@ -1799,7 +1799,7 @@
bool Heap::stopIfNecessarySlow(unsigned oldState)
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
RELEASE_ASSERT(oldState & hasAccessBit);
RELEASE_ASSERT(!(oldState & stoppedBit));
@@ -2601,7 +2601,7 @@
{
ASSERT(deferralContext || isDeferred() || !DisallowGC::isInEffectOnCurrentThread());
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
if (!m_isSafeToCollect)
return;
Modified: trunk/Source/_javascript_Core/heap/Heap.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/Heap.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/Heap.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -1,7 +1,7 @@
/*
* Copyright (C) 1999-2000 Harri Porten ([email protected])
* Copyright (C) 2001 Peter Kelly ([email protected])
- * Copyright (C) 2003-2020 Apple Inc. All rights reserved.
+ * Copyright (C) 2003-2019 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,6 @@
#include "CellState.h"
#include "CollectionScope.h"
#include "CollectorPhase.h"
-#include "DFGDoesGCCheck.h"
#include "DeleteAllCodeEffort.h"
#include "GCConductor.h"
#include "GCIncomingRefCountedSet.h"
@@ -304,15 +303,13 @@
const unsigned* addressOfBarrierThreshold() const { return &m_barrierThreshold; }
#if ENABLE(DFG_DOES_GC_VALIDATION)
- DoesGCCheck* addressOfDoesGC() { return &m_doesGC; }
- void setDoesGCExpectation(bool expectDoesGC, unsigned nodeIndex, unsigned nodeOp) { m_doesGC.set(expectDoesGC, nodeIndex, nodeOp); }
- void setDoesGCExpectation(bool expectDoesGC, DoesGCCheck::Special special) { m_doesGC.set(expectDoesGC, special); }
- void verifyCanGC() { m_doesGC.verifyCanGC(vm()); }
+ bool expectDoesGC() const { return m_expectDoesGC; }
+ void setExpectDoesGC(bool value) { m_expectDoesGC = value; }
+ bool* addressOfExpectDoesGC() { return &m_expectDoesGC; }
#else
- DoesGCCheck* addressOfDoesGC() { UNREACHABLE_FOR_PLATFORM(); return nullptr; }
- void setDoesGCExpectation(bool, unsigned, unsigned) { }
- void setDoesGCExpectation(bool, DoesGCCheck::Special) { }
- void verifyCanGC() { }
+ bool expectDoesGC() const { UNREACHABLE_FOR_PLATFORM(); return true; }
+ void setExpectDoesGC(bool) { UNREACHABLE_FOR_PLATFORM(); }
+ bool* addressOfExpectDoesGC() { UNREACHABLE_FOR_PLATFORM(); return nullptr; }
#endif
// If true, the GC believes that the mutator is currently messing with the heap. We call this
@@ -609,7 +606,7 @@
Markable<CollectionScope, EnumMarkableTraits<CollectionScope>> m_lastCollectionScope;
Lock m_raceMarkStackLock;
#if ENABLE(DFG_DOES_GC_VALIDATION)
- DoesGCCheck m_doesGC;
+ bool m_expectDoesGC { true };
#endif
StructureIDTable m_structureIDTable;
Modified: trunk/Source/_javascript_Core/heap/HeapInlines.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/HeapInlines.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/HeapInlines.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -236,7 +236,7 @@
inline void Heap::acquireAccess()
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
if (m_worldState.compareExchangeWeak(0, hasAccessBit))
return;
@@ -263,7 +263,7 @@
inline void Heap::stopIfNecessary()
{
if (validateDFGDoesGC)
- verifyCanGC();
+ RELEASE_ASSERT(expectDoesGC());
if (mayNeedToStop())
stopIfNecessarySlow();
Modified: trunk/Source/_javascript_Core/heap/LocalAllocatorInlines.h (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/LocalAllocatorInlines.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/LocalAllocatorInlines.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -33,7 +33,7 @@
ALWAYS_INLINE void* LocalAllocator::allocate(Heap& heap, GCDeferralContext* deferralContext, AllocationFailureMode failureMode)
{
if (validateDFGDoesGC)
- heap.verifyCanGC();
+ RELEASE_ASSERT(heap.expectDoesGC());
return m_freeList.allocate(
[&] () -> HeapCell* {
sanitizeStackForVM(heap.vm());
Modified: trunk/Source/_javascript_Core/heap/PreciseAllocation.cpp (262477 => 262478)
--- trunk/Source/_javascript_Core/heap/PreciseAllocation.cpp 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/heap/PreciseAllocation.cpp 2020-06-03 06:25:50 UTC (rev 262478)
@@ -43,7 +43,7 @@
PreciseAllocation* PreciseAllocation::tryCreate(Heap& heap, size_t size, Subspace* subspace, unsigned indexInSpace)
{
if (validateDFGDoesGC)
- heap.verifyCanGC();
+ RELEASE_ASSERT(heap.expectDoesGC());
size_t adjustedAlignmentAllocationSize = headerSize() + size + halfAlignment;
static_assert(halfAlignment == 8, "We assume that memory returned by malloc has alignment >= 8.");
@@ -123,7 +123,7 @@
PreciseAllocation* PreciseAllocation::createForLowerTier(Heap& heap, size_t size, Subspace* subspace, uint8_t lowerTierIndex)
{
if (validateDFGDoesGC)
- heap.verifyCanGC();
+ RELEASE_ASSERT(heap.expectDoesGC());
size_t adjustedAlignmentAllocationSize = headerSize() + size + halfAlignment;
static_assert(halfAlignment == 8, "We assume that memory returned by malloc has alignment >= 8.");
Modified: trunk/Source/_javascript_Core/runtime/JSString.h (262477 => 262478)
--- trunk/Source/_javascript_Core/runtime/JSString.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/runtime/JSString.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -733,7 +733,7 @@
ALWAYS_INLINE JSString* jsSingleCharacterString(VM& vm, UChar c)
{
if (validateDFGDoesGC)
- vm.heap.verifyCanGC();
+ RELEASE_ASSERT(vm.heap.expectDoesGC());
if (c <= maxSingleCharacterString)
return vm.smallStrings.singleCharacterString(c);
return JSString::create(vm, StringImpl::create(&c, 1));
@@ -763,7 +763,7 @@
ALWAYS_INLINE AtomString JSString::toAtomString(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isRope())
return static_cast<const JSRopeString*>(this)->resolveRopeToAtomString(globalObject);
return AtomString(valueInternal());
@@ -772,7 +772,7 @@
ALWAYS_INLINE RefPtr<AtomStringImpl> JSString::toExistingAtomString(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isRope())
return static_cast<const JSRopeString*>(this)->resolveRopeToExistingAtomString(globalObject);
if (valueInternal().impl()->isAtom())
@@ -783,7 +783,7 @@
inline const String& JSString::value(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isRope())
return static_cast<const JSRopeString*>(this)->resolveRope(globalObject);
return valueInternal();
@@ -793,7 +793,7 @@
{
if (allocationAllowed) {
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isRope()) {
// Pass nullptr for the JSGlobalObject so that resolveRope does not throw in the event of an OOM error.
return static_cast<const JSRopeString*>(this)->resolveRope(nullptr);
@@ -983,7 +983,7 @@
ALWAYS_INLINE StringView JSRopeString::unsafeView(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isSubstring()) {
auto& base = substringBase()->valueInternal();
if (base.is8Bit())
@@ -996,7 +996,7 @@
ALWAYS_INLINE StringViewWithUnderlyingString JSRopeString::viewWithUnderlyingString(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isSubstring()) {
auto& base = substringBase()->valueInternal();
if (base.is8Bit())
@@ -1010,7 +1010,7 @@
ALWAYS_INLINE StringView JSString::unsafeView(JSGlobalObject* globalObject) const
{
if (validateDFGDoesGC)
- vm().heap.verifyCanGC();
+ RELEASE_ASSERT(vm().heap.expectDoesGC());
if (isRope())
return static_cast<const JSRopeString*>(this)->unsafeView(globalObject);
return valueInternal();
Modified: trunk/Source/_javascript_Core/runtime/RegExpMatchesArray.h (262477 => 262478)
--- trunk/Source/_javascript_Core/runtime/RegExpMatchesArray.h 2020-06-03 05:29:14 UTC (rev 262477)
+++ trunk/Source/_javascript_Core/runtime/RegExpMatchesArray.h 2020-06-03 06:25:50 UTC (rev 262478)
@@ -64,7 +64,7 @@
RegExp* regExp, unsigned startOffset, MatchResult& result)
{
if (validateDFGDoesGC)
- vm.heap.verifyCanGC();
+ RELEASE_ASSERT(vm.heap.expectDoesGC());
Vector<int, 32> subpatternResults;
int position = regExp->matchInline(globalObject, vm, inputValue, startOffset, subpatternResults);