Title: [280198] trunk
Revision
280198
Author
sbar...@apple.com
Date
2021-07-22 14:37:02 -0700 (Thu, 22 Jul 2021)

Log Message

AirStackSlot's uint16_t byte size is too small
https://bugs.webkit.org/show_bug.cgi?id=228193
<rdar://80888059>

Reviewed by Mark Lam.

JSTests:

* stress/stack-slot-needs-to-use-more-than-uint16.js: Added.

Source/_javascript_Core:

* b3/B3Procedure.cpp:
(JSC::B3::Procedure::addStackSlot):
* b3/B3Procedure.h:
* b3/air/AirCode.cpp:
(JSC::B3::Air::Code::addStackSlot):
* b3/air/AirCode.h:
* b3/air/AirStackSlot.cpp:
(JSC::B3::Air::StackSlot::StackSlot):
* b3/air/AirStackSlot.h:
(JSC::B3::Air::StackSlot::ensureSize):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::lower):
* ftl/FTLOutput.cpp:
(JSC::FTL::Output::lockedStackSlot):
* ftl/FTLOutput.h:

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (280197 => 280198)


--- trunk/JSTests/ChangeLog	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/JSTests/ChangeLog	2021-07-22 21:37:02 UTC (rev 280198)
@@ -1,3 +1,13 @@
+2021-07-22  Saam Barati  <sbar...@apple.com>
+
+        AirStackSlot's uint16_t byte size is too small
+        https://bugs.webkit.org/show_bug.cgi?id=228193
+        <rdar://80888059>
+
+        Reviewed by Mark Lam.
+
+        * stress/stack-slot-needs-to-use-more-than-uint16.js: Added.
+
 2021-07-20  Yusuke Suzuki  <ysuz...@apple.com>
 
         [JSC] invalidParameterInstanceofSourceAppender should care direct call of Symbol.hasInstance

Added: trunk/JSTests/stress/stack-slot-needs-to-use-more-than-uint16.js (0 => 280198)


--- trunk/JSTests/stress/stack-slot-needs-to-use-more-than-uint16.js	                        (rev 0)
+++ trunk/JSTests/stress/stack-slot-needs-to-use-more-than-uint16.js	2021-07-22 21:37:02 UTC (rev 280198)
@@ -0,0 +1,8 @@
+//@ skip if $buildType == "debug"
+
+let script = '_,'.repeat(5000);
+script += '';
+let g = new Function(script, 'if (0) g();');
+for (let i = 0; i < 1000; ++i) {
+  g(0);
+}

Modified: trunk/Source/_javascript_Core/ChangeLog (280197 => 280198)


--- trunk/Source/_javascript_Core/ChangeLog	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-07-22 21:37:02 UTC (rev 280198)
@@ -1,5 +1,29 @@
 2021-07-22  Saam Barati  <sbar...@apple.com>
 
+        AirStackSlot's uint16_t byte size is too small
+        https://bugs.webkit.org/show_bug.cgi?id=228193
+        <rdar://80888059>
+
+        Reviewed by Mark Lam.
+
+        * b3/B3Procedure.cpp:
+        (JSC::B3::Procedure::addStackSlot):
+        * b3/B3Procedure.h:
+        * b3/air/AirCode.cpp:
+        (JSC::B3::Air::Code::addStackSlot):
+        * b3/air/AirCode.h:
+        * b3/air/AirStackSlot.cpp:
+        (JSC::B3::Air::StackSlot::StackSlot):
+        * b3/air/AirStackSlot.h:
+        (JSC::B3::Air::StackSlot::ensureSize):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::lower):
+        * ftl/FTLOutput.cpp:
+        (JSC::FTL::Output::lockedStackSlot):
+        * ftl/FTLOutput.h:
+
+2021-07-22  Saam Barati  <sbar...@apple.com>
+
         Fix uses of Dependency::fence with respect to the compiler outsmarting us
         https://bugs.webkit.org/show_bug.cgi?id=227757
         <rdar://problem/80280931>

Modified: trunk/Source/_javascript_Core/b3/B3Procedure.cpp (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/B3Procedure.cpp	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/B3Procedure.cpp	2021-07-22 21:37:02 UTC (rev 280198)
@@ -73,7 +73,7 @@
     return result;
 }
 
-Air::StackSlot* Procedure::addStackSlot(unsigned byteSize)
+Air::StackSlot* Procedure::addStackSlot(uint64_t byteSize)
 {
     return m_code->addStackSlot(byteSize, Air::StackSlotKind::Locked);
 }

Modified: trunk/Source/_javascript_Core/b3/B3Procedure.h (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/B3Procedure.h	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/B3Procedure.h	2021-07-22 21:37:02 UTC (rev 280198)
@@ -114,7 +114,7 @@
         setBlockOrderImpl(blocks);
     }
 
-    JS_EXPORT_PRIVATE Air::StackSlot* addStackSlot(unsigned byteSize);
+    JS_EXPORT_PRIVATE Air::StackSlot* addStackSlot(uint64_t byteSize);
     JS_EXPORT_PRIVATE Variable* addVariable(Type);
 
     JS_EXPORT_PRIVATE Type addTuple(Vector<Type>&& types);

Modified: trunk/Source/_javascript_Core/b3/air/AirCode.cpp (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/air/AirCode.cpp	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/air/AirCode.cpp	2021-07-22 21:37:02 UTC (rev 280198)
@@ -163,7 +163,7 @@
     return result;
 }
 
-StackSlot* Code::addStackSlot(unsigned byteSize, StackSlotKind kind)
+StackSlot* Code::addStackSlot(uint64_t byteSize, StackSlotKind kind)
 {
     StackSlot* result = m_stackSlots.addNew(byteSize, kind);
     if (m_stackIsAllocated) {

Modified: trunk/Source/_javascript_Core/b3/air/AirCode.h (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/air/AirCode.h	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/air/AirCode.h	2021-07-22 21:37:02 UTC (rev 280198)
@@ -112,7 +112,7 @@
     // Note that you can rely on stack slots always getting indices that are larger than the index
     // of any prior stack slot. In fact, all stack slots you create in the future will have an index
     // that is >= stackSlots().size().
-    JS_EXPORT_PRIVATE StackSlot* addStackSlot(unsigned byteSize, StackSlotKind);
+    JS_EXPORT_PRIVATE StackSlot* addStackSlot(uint64_t byteSize, StackSlotKind);
 
     JS_EXPORT_PRIVATE Special* addSpecial(std::unique_ptr<Special>);
 

Modified: trunk/Source/_javascript_Core/b3/air/AirStackSlot.cpp (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/air/AirStackSlot.cpp	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/air/AirStackSlot.cpp	2021-07-22 21:37:02 UTC (rev 280198)
@@ -54,13 +54,13 @@
     out.print("byteSize = ", m_byteSize, ", offsetFromFP = ", m_offsetFromFP, ", kind = ", m_kind);
 }
 
-StackSlot::StackSlot(unsigned byteSize, StackSlotKind kind, intptr_t offsetFromFP)
-    : m_byteSize(static_cast<uint16_t>(byteSize))
+StackSlot::StackSlot(uint64_t byteSize, StackSlotKind kind, intptr_t offsetFromFP)
+    : m_byteSize(static_cast<uint32_t>(byteSize))
     , m_kind(kind)
     , m_offsetFromFP(offsetFromFP)
 {
     ASSERT(byteSize);
-    RELEASE_ASSERT(byteSize <= std::numeric_limits<uint16_t>::max());
+    RELEASE_ASSERT(byteSize <= std::numeric_limits<uint32_t>::max());
 }
 
 } } } // namespace JSC::B3::Air

Modified: trunk/Source/_javascript_Core/b3/air/AirStackSlot.h (280197 => 280198)


--- trunk/Source/_javascript_Core/b3/air/AirStackSlot.h	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/b3/air/AirStackSlot.h	2021-07-22 21:37:02 UTC (rev 280198)
@@ -50,11 +50,11 @@
     bool isSpill() const { return m_kind == StackSlotKind::Spill; }
     unsigned index() const { return m_index; }
 
-    void ensureSize(unsigned requestedSize)
+    void ensureSize(uint64_t requestedSize)
     {
         ASSERT(!m_offsetFromFP);
-        RELEASE_ASSERT(requestedSize <= std::numeric_limits<uint16_t>::max());
-        m_byteSize = std::max(m_byteSize, static_cast<uint16_t>(requestedSize));
+        RELEASE_ASSERT(requestedSize <= std::numeric_limits<uint32_t>::max());
+        m_byteSize = std::max(m_byteSize, static_cast<uint32_t>(requestedSize));
     }
 
     unsigned alignment() const
@@ -85,9 +85,9 @@
     friend class Code;
     friend class SparseCollection<StackSlot>;
 
-    StackSlot(unsigned byteSize, StackSlotKind, intptr_t offsetFromFP = 0);
+    StackSlot(uint64_t byteSize, StackSlotKind, intptr_t offsetFromFP = 0);
     
-    uint16_t m_byteSize { 0 };
+    uint32_t m_byteSize { 0 };
     StackSlotKind m_kind { StackSlotKind::Locked };
     unsigned m_index { UINT_MAX };
     intptr_t m_offsetFromFP { 0 };

Modified: trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp (280197 => 280198)


--- trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/ftl/FTLLowerDFGToB3.cpp	2021-07-22 21:37:02 UTC (rev 280198)
@@ -249,7 +249,7 @@
         m_out.initializeConstants(m_proc, prologue);
         createPhiVariables();
 
-        size_t sizeOfCaptured = sizeof(JSValue) * m_graph.m_nextMachineLocal;
+        uint64_t sizeOfCaptured = sizeof(JSValue) * m_graph.m_nextMachineLocal;
         B3::SlotBaseValue* capturedBase = m_out.lockedStackSlot(sizeOfCaptured);
         m_captured = m_out.add(capturedBase, m_out.constIntPtr(sizeOfCaptured));
         state->capturedValue = capturedBase->slot();

Modified: trunk/Source/_javascript_Core/ftl/FTLOutput.cpp (280197 => 280198)


--- trunk/Source/_javascript_Core/ftl/FTLOutput.cpp	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/ftl/FTLOutput.cpp	2021-07-22 21:37:02 UTC (rev 280198)
@@ -91,7 +91,7 @@
     return m_block->appendNew<B3::Value>(m_proc, B3::FramePointer, origin());
 }
 
-SlotBaseValue* Output::lockedStackSlot(size_t bytes)
+SlotBaseValue* Output::lockedStackSlot(uint64_t bytes)
 {
     return m_block->appendNew<SlotBaseValue>(m_proc, origin(), m_proc.addStackSlot(bytes));
 }

Modified: trunk/Source/_javascript_Core/ftl/FTLOutput.h (280197 => 280198)


--- trunk/Source/_javascript_Core/ftl/FTLOutput.h	2021-07-22 21:30:12 UTC (rev 280197)
+++ trunk/Source/_javascript_Core/ftl/FTLOutput.h	2021-07-22 21:37:02 UTC (rev 280198)
@@ -100,7 +100,7 @@
 
     LValue framePointer();
 
-    B3::SlotBaseValue* lockedStackSlot(size_t bytes);
+    B3::SlotBaseValue* lockedStackSlot(uint64_t bytes);
 
     LValue constBool(bool value);
     LValue constInt32(int32_t value);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to