[JSC] Store bits for JSRopeString in 3 stores
[WebKit-https.git] / Source / JavaScriptCore / ftl / FTLAbstractHeapRepository.cpp
index e416fda..9c3c1c7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #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 {
 
-AbstractHeapRepository::AbstractHeapRepository(LContext context)
-    : root(0, "jscRoot")
+AbstractHeapRepository::AbstractHeapRepository()
+    : root(nullptr, "jscRoot")
 
 #define ABSTRACT_HEAP_INITIALIZATION(name) , name(&root, #name)
     FOR_EACH_ABSTRACT_HEAP(ABSTRACT_HEAP_INITIALIZATION)
@@ -50,36 +57,37 @@ AbstractHeapRepository::AbstractHeapRepository(LContext context)
     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(context, &root, #name, offset, size)
+#define INDEXED_ABSTRACT_HEAP_INITIALIZATION(name, offset, size) , name(&root, #name, offset, size)
     FOR_EACH_INDEXED_ABSTRACT_HEAP(INDEXED_ABSTRACT_HEAP_INITIALIZATION)
 #undef INDEXED_ABSTRACT_HEAP_INITIALIZATION
     
-#define NUMBERED_ABSTRACT_HEAP_INITIALIZATION(name) , name(context, &root, #name)
+#define NUMBERED_ABSTRACT_HEAP_INITIALIZATION(name) , name(&root, #name)
     FOR_EACH_NUMBERED_ABSTRACT_HEAP(NUMBERED_ABSTRACT_HEAP_INITIALIZATION)
 #undef NUMBERED_ABSTRACT_HEAP_INITIALIZATION
 
-    , absolute(context, &root, "absolute")
-    , m_context(context)
-    , m_tbaaKind(mdKindID(m_context, "tbaa"))
+    , 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_gcData.offset());
+    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_indexingType.changeParent(&JSCell_usefulBytes);
+    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_gcData.changeParent(&JSCell_usefulBytes);
-    
-    root.m_tbaaMetadata = mdNode(m_context, mdString(m_context, root.m_heapName));
-    
-    RELEASE_ASSERT(m_tbaaKind);
-    RELEASE_ASSERT(root.m_tbaaMetadata);
-    
+    JSCell_cellState.changeParent(&JSCell_usefulBytes);
+    JSRopeString_flags.changeParent(&JSRopeString_fiber0);
+    JSRopeString_length.changeParent(&JSRopeString_fiber1);
+
     RELEASE_ASSERT(!JSCell_freeListNext.offset());
 }
 
@@ -87,6 +95,80 @@ AbstractHeapRepository::~AbstractHeapRepository()
 {
 }
 
+void AbstractHeapRepository::decorateMemory(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForMemory.append(HeapForValue(heap, value));
+}
+
+void AbstractHeapRepository::decorateCCallRead(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForCCallRead.append(HeapForValue(heap, value));
+}
+
+void AbstractHeapRepository::decorateCCallWrite(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForCCallWrite.append(HeapForValue(heap, value));
+}
+
+void AbstractHeapRepository::decoratePatchpointRead(const AbstractHeap* heap, B3::Value* value)
+{
+    m_heapForPatchpointRead.append(HeapForValue(heap, 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(rangeFor(entry.heap));
+    for (HeapForValue entry : m_heapForCCallRead)
+        entry.value->as<CCallValue>()->effects.reads = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForCCallWrite)
+        entry.value->as<CCallValue>()->effects.writes = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForPatchpointRead)
+        entry.value->as<PatchpointValue>()->effects.reads = rangeFor(entry.heap);
+    for (HeapForValue entry : m_heapForPatchpointWrite)
+        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
 
 #endif // ENABLE(FTL_JIT)