[JSC] Store bits for JSRopeString in 3 stores
[WebKit-https.git] / Source / JavaScriptCore / ftl / FTLAbstractHeapRepository.cpp
index a8d215d..9c3c1c7 100644 (file)
 #if ENABLE(FTL_JIT)
 
 #include "B3CCallValue.h"
+#include "B3FenceValue.h"
 #include "B3MemoryValue.h"
 #include "B3PatchpointValue.h"
 #include "B3ValueInlines.h"
 #include "DirectArguments.h"
 #include "FTLState.h"
 #include "GetterSetter.h"
-#include "JSEnvironmentRecord.h"
 #include "JSPropertyNameEnumerator.h"
 #include "JSScope.h"
 #include "JSCInlines.h"
+#include "RegExpObject.h"
 #include "ScopedArguments.h"
 #include "ScopedArgumentsTable.h"
+#include "ShadowChicken.h"
 
 namespace JSC { namespace FTL {
 
-using namespace B3;
-
 AbstractHeapRepository::AbstractHeapRepository()
     : root(nullptr, "jscRoot")
 
@@ -57,7 +57,9 @@ AbstractHeapRepository::AbstractHeapRepository()
     FOR_EACH_ABSTRACT_FIELD(ABSTRACT_FIELD_INITIALIZATION)
 #undef ABSTRACT_FIELD_INITIALIZATION
     
-    , JSCell_freeListNext(JSCell_structureID)
+    , JSCell_freeListNext(JSCell_header)
+    , ArrayStorage_publicLength(Butterfly_publicLength)
+    , ArrayStorage_vectorLength(Butterfly_vectorLength)
     
 #define INDEXED_ABSTRACT_HEAP_INITIALIZATION(name, offset, size) , name(&root, #name, offset, size)
     FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_INITIALIZATION)
@@ -67,18 +69,24 @@ AbstractHeapRepository::AbstractHeapRepository()
     FOR_EACH_NUMBERED_ABSTRACT_HEAP(NUMBERED_ABSTRACT_HEAP_INITIALIZATION)
 #undef NUMBERED_ABSTRACT_HEAP_INITIALIZATION
 
+    , JSString_value(JSRopeString_fiber0)
+
     , absolute(&root, "absolute")
 {
     // Make sure that our explicit assumptions about the StructureIDBlob match reality.
-    RELEASE_ASSERT(!(JSCell_indexingType.offset() & (sizeof(int32_t) - 1)));
-    RELEASE_ASSERT(JSCell_indexingType.offset() + 1 == JSCell_typeInfoType.offset());
-    RELEASE_ASSERT(JSCell_indexingType.offset() + 2 == JSCell_typeInfoFlags.offset());
-    RELEASE_ASSERT(JSCell_indexingType.offset() + 3 == JSCell_cellState.offset());
-
-    JSCell_indexingType.changeParent(&JSCell_usefulBytes);
+    RELEASE_ASSERT(!(JSCell_indexingTypeAndMisc.offset() & (sizeof(int32_t) - 1)));
+    RELEASE_ASSERT(JSCell_indexingTypeAndMisc.offset() + 1 == JSCell_typeInfoType.offset());
+    RELEASE_ASSERT(JSCell_indexingTypeAndMisc.offset() + 2 == JSCell_typeInfoFlags.offset());
+    RELEASE_ASSERT(JSCell_indexingTypeAndMisc.offset() + 3 == JSCell_cellState.offset());
+
+    JSCell_structureID.changeParent(&JSCell_header);
+    JSCell_usefulBytes.changeParent(&JSCell_header);
+    JSCell_indexingTypeAndMisc.changeParent(&JSCell_usefulBytes);
     JSCell_typeInfoType.changeParent(&JSCell_usefulBytes);
     JSCell_typeInfoFlags.changeParent(&JSCell_usefulBytes);
     JSCell_cellState.changeParent(&JSCell_usefulBytes);
+    JSRopeString_flags.changeParent(&JSRopeString_fiber0);
+    JSRopeString_length.changeParent(&JSRopeString_fiber1);
 
     RELEASE_ASSERT(!JSCell_freeListNext.offset());
 }
@@ -87,50 +95,78 @@ AbstractHeapRepository::~AbstractHeapRepository()
 {
 }
 
-void AbstractHeapRepository::decorateMemory(const AbstractHeap* heap, Value* value)
+void AbstractHeapRepository::decorateMemory(const AbstractHeap* heap, B3::Value* value)
 {
     m_heapForMemory.append(HeapForValue(heap, value));
 }
 
-void AbstractHeapRepository::decorateCCallRead(const AbstractHeap* heap, Value* value)
+void AbstractHeapRepository::decorateCCallRead(const AbstractHeap* heap, B3::Value* value)
 {
     m_heapForCCallRead.append(HeapForValue(heap, value));
 }
 
-void AbstractHeapRepository::decorateCCallWrite(const AbstractHeap* heap, Value* value)
+void AbstractHeapRepository::decorateCCallWrite(const AbstractHeap* heap, B3::Value* value)
 {
     m_heapForCCallWrite.append(HeapForValue(heap, value));
 }
 
-void AbstractHeapRepository::decoratePatchpointRead(const AbstractHeap* heap, Value* value)
+void AbstractHeapRepository::decoratePatchpointRead(const AbstractHeap* heap, B3::Value* value)
 {
     m_heapForPatchpointRead.append(HeapForValue(heap, value));
 }
 
-void AbstractHeapRepository::decoratePatchpointWrite(const AbstractHeap* heap, Value* value)
+void AbstractHeapRepository::decoratePatchpointWrite(const AbstractHeap* heap, B3::Value* value)
 {
     m_heapForPatchpointWrite.append(HeapForValue(heap, value));
 }
 
+void AbstractHeapRepository::decorateFenceRead(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForFenceRead.append(HeapForValue(heap, value));
+}
+
+void AbstractHeapRepository::decorateFenceWrite(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForFenceWrite.append(HeapForValue(heap, value));
+}
+
+void AbstractHeapRepository::decorateFencedAccess(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForFencedAccess.append(HeapForValue(heap, value));
+}
+
 void AbstractHeapRepository::computeRangesAndDecorateInstructions()
 {
+    using namespace B3;
     root.compute();
 
     if (verboseCompilationEnabled()) {
         dataLog("Abstract Heap Repository:\n");
         root.deepDump(WTF::dataFile());
     }
+    
+    auto rangeFor = [&] (const AbstractHeap* heap) -> HeapRange {
+        if (heap)
+            return heap->range();
+        return HeapRange();
+    };
 
     for (HeapForValue entry : m_heapForMemory)
-        entry.value->as<MemoryValue>()->setRange(entry.heap->range());
+        entry.value->as<MemoryValue>()->setRange(rangeFor(entry.heap));
     for (HeapForValue entry : m_heapForCCallRead)
-        entry.value->as<CCallValue>()->effects.reads = entry.heap->range();
+        entry.value->as<CCallValue>()->effects.reads = rangeFor(entry.heap);
     for (HeapForValue entry : m_heapForCCallWrite)
-        entry.value->as<CCallValue>()->effects.writes = entry.heap->range();
+        entry.value->as<CCallValue>()->effects.writes = rangeFor(entry.heap);
     for (HeapForValue entry : m_heapForPatchpointRead)
-        entry.value->as<CCallValue>()->effects.reads = entry.heap->range();
+        entry.value->as<PatchpointValue>()->effects.reads = rangeFor(entry.heap);
     for (HeapForValue entry : m_heapForPatchpointWrite)
-        entry.value->as<CCallValue>()->effects.writes = entry.heap->range();
+        entry.value->as<PatchpointValue>()->effects.writes = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForFenceRead)
+        entry.value->as<FenceValue>()->read = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForFenceWrite)
+        entry.value->as<FenceValue>()->write = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForFencedAccess)
+        entry.value->as<MemoryValue>()->setFenceRange(rangeFor(entry.heap));
 }
 
 } } // namespace JSC::FTL