Title: [281004] branches/safari-611.3.10.0-branch/Source/_javascript_Core
Revision
281004
Author
[email protected]
Date
2021-08-12 19:06:34 -0700 (Thu, 12 Aug 2021)

Log Message

Cherry-pick r280984. rdar://problem/81752592

    Update ARM64EHash
    https://bugs.webkit.org/show_bug.cgi?id=228962
    <rdar://79883337>

    Reviewed by Mark Lam.

    * assembler/AssemblerBuffer.h:
    (JSC::ARM64EHash::makeDiversifier):
    (JSC::ARM64EHash::nextValue):
    (JSC::ARM64EHash::bitsForDiversifier):
    (JSC::ARM64EHash::currentHash):
    (JSC::ARM64EHash::setUpdatedHash):
    (JSC::ARM64EHash::ARM64EHash):
    (JSC::ARM64EHash::update):
    (JSC::ARM64EHash::finalize):
    (JSC::AssemblerBuffer::AssemblerBuffer):
    (JSC::AssemblerBuffer::putIntegralUnchecked):
    (JSC::AssemblerBuffer::hash const):
    * assembler/LinkBuffer.cpp:
    (JSC::LinkBuffer::copyCompactAndLinkCode):

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280984 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-611.3.10.0-branch/Source/_javascript_Core/ChangeLog (281003 => 281004)


--- branches/safari-611.3.10.0-branch/Source/_javascript_Core/ChangeLog	2021-08-13 01:40:47 UTC (rev 281003)
+++ branches/safari-611.3.10.0-branch/Source/_javascript_Core/ChangeLog	2021-08-13 02:06:34 UTC (rev 281004)
@@ -1,3 +1,54 @@
+2021-08-12  Russell Epstein  <[email protected]>
+
+        Cherry-pick r280984. rdar://problem/81752592
+
+    Update ARM64EHash
+    https://bugs.webkit.org/show_bug.cgi?id=228962
+    <rdar://79883337>
+    
+    Reviewed by Mark Lam.
+    
+    * assembler/AssemblerBuffer.h:
+    (JSC::ARM64EHash::makeDiversifier):
+    (JSC::ARM64EHash::nextValue):
+    (JSC::ARM64EHash::bitsForDiversifier):
+    (JSC::ARM64EHash::currentHash):
+    (JSC::ARM64EHash::setUpdatedHash):
+    (JSC::ARM64EHash::ARM64EHash):
+    (JSC::ARM64EHash::update):
+    (JSC::ARM64EHash::finalize):
+    (JSC::AssemblerBuffer::AssemblerBuffer):
+    (JSC::AssemblerBuffer::putIntegralUnchecked):
+    (JSC::AssemblerBuffer::hash const):
+    * assembler/LinkBuffer.cpp:
+    (JSC::LinkBuffer::copyCompactAndLinkCode):
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280984 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-08-12  Saam Barati  <[email protected]>
+
+            Update ARM64EHash
+            https://bugs.webkit.org/show_bug.cgi?id=228962
+            <rdar://79883337>
+
+            Reviewed by Mark Lam.
+
+            * assembler/AssemblerBuffer.h:
+            (JSC::ARM64EHash::makeDiversifier):
+            (JSC::ARM64EHash::nextValue):
+            (JSC::ARM64EHash::bitsForDiversifier):
+            (JSC::ARM64EHash::currentHash):
+            (JSC::ARM64EHash::setUpdatedHash):
+            (JSC::ARM64EHash::ARM64EHash):
+            (JSC::ARM64EHash::update):
+            (JSC::ARM64EHash::finalize):
+            (JSC::AssemblerBuffer::AssemblerBuffer):
+            (JSC::AssemblerBuffer::putIntegralUnchecked):
+            (JSC::AssemblerBuffer::hash const):
+            * assembler/LinkBuffer.cpp:
+            (JSC::LinkBuffer::copyCompactAndLinkCode):
+
 2021-08-10  Russell Epstein  <[email protected]>
 
         Cherry-pick r280507. rdar://problem/79730568

Modified: branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/AssemblerBuffer.h (281003 => 281004)


--- branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/AssemblerBuffer.h	2021-08-13 01:40:47 UTC (rev 281003)
+++ branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/AssemblerBuffer.h	2021-08-13 02:06:34 UTC (rev 281004)
@@ -205,22 +205,62 @@
 #if CPU(ARM64E)
     class ARM64EHash {
     public:
-        ARM64EHash(uint32_t initialHash)
-            : m_hash(initialHash)
+        static constexpr uint8_t initializationNamespace = 0x11;
+
+        static ALWAYS_INLINE PtrTag makeDiversifier(uint8_t namespaceTag, uint64_t index, uint32_t value)
         {
+            // <namespaceTag:8><index:24><value:32>
+            return static_cast<PtrTag>((static_cast<uint64_t>(namespaceTag) << 56) + ((index & 0xFFFFFF) << 32) + static_cast<uint64_t>(value));
         }
 
-        ALWAYS_INLINE uint32_t update(uint32_t value)
+        static ALWAYS_INLINE uint32_t nextValue(uint64_t instruction, uint64_t index, uint32_t currentValue)
         {
-            uint64_t input = value ^ m_hash;
-            uint64_t a = static_cast<uint32_t>(tagInt(input, static_cast<PtrTag>(0)) >> 39);
-            uint64_t b = tagInt(input, static_cast<PtrTag>(0xb7e151628aed2a6a)) >> 23;
-            m_hash = a ^ b;
-            return m_hash;
+            uint64_t a = tagInt(instruction, makeDiversifier(0x12, index, currentValue));
+            uint64_t b = tagInt(instruction, makeDiversifier(0x13, index, currentValue));
+            return static_cast<uint32_t>((a >> 39) ^ (b >> 23));
         }
 
+        static ALWAYS_INLINE uint32_t bitsForDiversifier(void* diversifier)
+        {
+            return static_cast<uint32_t>(bitwise_cast<uintptr_t>(diversifier));
+        }
+
+        ALWAYS_INLINE uint32_t currentHash(uint32_t index, void* diversifier)
+        {
+            uint64_t result;
+            bool hashFieldIsTagged = index == 0;
+            if (hashFieldIsTagged)
+                result = untagInt(m_hash, makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
+            else
+                result = m_hash;
+            return static_cast<uint32_t>(result);
+        }
+
+        ALWAYS_INLINE void setUpdatedHash(uint32_t value, uint32_t index, void* diversifier)
+        {
+            bool shouldTagHashField = index == 0;
+            if (shouldTagHashField)
+                m_hash = tagInt(static_cast<uint64_t>(value), makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
+            else
+                m_hash = value;
+        }
+
+        ARM64EHash(void* diversifier)
+        {
+            setUpdatedHash(0, 0, diversifier);
+        }
+ 
+        ALWAYS_INLINE uint32_t update(uint32_t instruction, uint32_t index, void* diversifier)
+        {
+            uint32_t currentHash = this->currentHash(index, diversifier);
+            uint64_t nextIndex = index + 1;
+            uint32_t output = nextValue(instruction, nextIndex, currentHash);
+            setUpdatedHash(output, nextIndex, diversifier);
+            return output;
+        }
+
     private:
-        uint32_t m_hash;
+        uint64_t m_hash;
     };
 #endif
 
@@ -230,7 +270,7 @@
             : m_storage()
             , m_index(0)
 #if CPU(ARM64E)
-            , m_hash(static_cast<uint32_t>(bitwise_cast<uint64_t>(this)))
+            , m_hash(this)
             , m_hashes()
 #endif
         {
@@ -388,7 +428,7 @@
 #if CPU(ARM64)
             static_assert(sizeof(value) == 4, "");
 #if CPU(ARM64E)
-            uint32_t hash = m_hash.update(value);
+            uint32_t hash = m_hash.update(value, m_index / sizeof(IntegralType), this);
             WTF::unalignedStore<uint32_t>(m_hashes.buffer() + m_index, hash);
 #endif
 #endif

Modified: branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/LinkBuffer.cpp (281003 => 281004)


--- branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/LinkBuffer.cpp	2021-08-13 01:40:47 UTC (rev 281003)
+++ branches/safari-611.3.10.0-branch/Source/_javascript_Core/assembler/LinkBuffer.cpp	2021-08-13 02:06:34 UTC (rev 281004)
@@ -236,7 +236,8 @@
     m_assemblerStorage = macroAssembler.m_assembler.buffer().releaseAssemblerData();
     uint8_t* inData = bitwise_cast<uint8_t*>(m_assemblerStorage.buffer());
 #if CPU(ARM64E)
-    ARM64EHash verifyUncompactedHash { static_cast<uint32_t>(bitwise_cast<uint64_t>(&macroAssembler.m_assembler.buffer())) };
+    void* bufferPtr = &macroAssembler.m_assembler.buffer();
+    ARM64EHash verifyUncompactedHash { bufferPtr };
     m_assemblerHashesStorage = macroAssembler.m_assembler.buffer().releaseAssemblerHashes();
     uint32_t* inHashes = bitwise_cast<uint32_t*>(m_assemblerHashesStorage.buffer());
 #endif
@@ -258,8 +259,8 @@
     auto read = [&](const InstructionType* ptr) -> InstructionType {
         InstructionType value = *ptr;
 #if CPU(ARM64E)
-        uint32_t hash = verifyUncompactedHash.update(value);
         unsigned index = (bitwise_cast<uint8_t*>(ptr) - inData) / 4;
+        uint32_t hash = verifyUncompactedHash.update(value, index, bufferPtr);
         RELEASE_ASSERT(inHashes[index] == hash);
 #endif
         return value;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to