⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 281004 in webkit


Ignore:
Timestamp:
Aug 12, 2021, 7:06:34 PM (5 years ago)
Author:
Alan Coon
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

Location:
branches/safari-611.3.10.0-branch/Source/JavaScriptCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-611.3.10.0-branch/Source/JavaScriptCore/ChangeLog

    r280849 r281004  
     12021-08-12  Russell Epstein  <repstein@apple.com>
     2
     3        Cherry-pick r280984. rdar://problem/81752592
     4
     5    Update ARM64EHash
     6    https://bugs.webkit.org/show_bug.cgi?id=228962
     7    <rdar://79883337>
     8   
     9    Reviewed by Mark Lam.
     10   
     11    * assembler/AssemblerBuffer.h:
     12    (JSC::ARM64EHash::makeDiversifier):
     13    (JSC::ARM64EHash::nextValue):
     14    (JSC::ARM64EHash::bitsForDiversifier):
     15    (JSC::ARM64EHash::currentHash):
     16    (JSC::ARM64EHash::setUpdatedHash):
     17    (JSC::ARM64EHash::ARM64EHash):
     18    (JSC::ARM64EHash::update):
     19    (JSC::ARM64EHash::finalize):
     20    (JSC::AssemblerBuffer::AssemblerBuffer):
     21    (JSC::AssemblerBuffer::putIntegralUnchecked):
     22    (JSC::AssemblerBuffer::hash const):
     23    * assembler/LinkBuffer.cpp:
     24    (JSC::LinkBuffer::copyCompactAndLinkCode):
     25   
     26   
     27    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@280984 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     28
     29    2021-08-12  Saam Barati  <sbarati@apple.com>
     30
     31            Update ARM64EHash
     32            https://bugs.webkit.org/show_bug.cgi?id=228962
     33            <rdar://79883337>
     34
     35            Reviewed by Mark Lam.
     36
     37            * assembler/AssemblerBuffer.h:
     38            (JSC::ARM64EHash::makeDiversifier):
     39            (JSC::ARM64EHash::nextValue):
     40            (JSC::ARM64EHash::bitsForDiversifier):
     41            (JSC::ARM64EHash::currentHash):
     42            (JSC::ARM64EHash::setUpdatedHash):
     43            (JSC::ARM64EHash::ARM64EHash):
     44            (JSC::ARM64EHash::update):
     45            (JSC::ARM64EHash::finalize):
     46            (JSC::AssemblerBuffer::AssemblerBuffer):
     47            (JSC::AssemblerBuffer::putIntegralUnchecked):
     48            (JSC::AssemblerBuffer::hash const):
     49            * assembler/LinkBuffer.cpp:
     50            (JSC::LinkBuffer::copyCompactAndLinkCode):
     51
    1522021-08-10  Russell Epstein  <repstein@apple.com>
    253
  • branches/safari-611.3.10.0-branch/Source/JavaScriptCore/assembler/AssemblerBuffer.h

    r272521 r281004  
    206206    class ARM64EHash {
    207207    public:
    208         ARM64EHash(uint32_t initialHash)
    209             : m_hash(initialHash)
    210         {
    211         }
    212 
    213         ALWAYS_INLINE uint32_t update(uint32_t value)
    214         {
    215             uint64_t input = value ^ m_hash;
    216             uint64_t a = static_cast<uint32_t>(tagInt(input, static_cast<PtrTag>(0)) >> 39);
    217             uint64_t b = tagInt(input, static_cast<PtrTag>(0xb7e151628aed2a6a)) >> 23;
    218             m_hash = a ^ b;
    219             return m_hash;
     208        static constexpr uint8_t initializationNamespace = 0x11;
     209
     210        static ALWAYS_INLINE PtrTag makeDiversifier(uint8_t namespaceTag, uint64_t index, uint32_t value)
     211        {
     212            // <namespaceTag:8><index:24><value:32>
     213            return static_cast<PtrTag>((static_cast<uint64_t>(namespaceTag) << 56) + ((index & 0xFFFFFF) << 32) + static_cast<uint64_t>(value));
     214        }
     215
     216        static ALWAYS_INLINE uint32_t nextValue(uint64_t instruction, uint64_t index, uint32_t currentValue)
     217        {
     218            uint64_t a = tagInt(instruction, makeDiversifier(0x12, index, currentValue));
     219            uint64_t b = tagInt(instruction, makeDiversifier(0x13, index, currentValue));
     220            return static_cast<uint32_t>((a >> 39) ^ (b >> 23));
     221        }
     222
     223        static ALWAYS_INLINE uint32_t bitsForDiversifier(void* diversifier)
     224        {
     225            return static_cast<uint32_t>(bitwise_cast<uintptr_t>(diversifier));
     226        }
     227
     228        ALWAYS_INLINE uint32_t currentHash(uint32_t index, void* diversifier)
     229        {
     230            uint64_t result;
     231            bool hashFieldIsTagged = index == 0;
     232            if (hashFieldIsTagged)
     233                result = untagInt(m_hash, makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
     234            else
     235                result = m_hash;
     236            return static_cast<uint32_t>(result);
     237        }
     238
     239        ALWAYS_INLINE void setUpdatedHash(uint32_t value, uint32_t index, void* diversifier)
     240        {
     241            bool shouldTagHashField = index == 0;
     242            if (shouldTagHashField)
     243                m_hash = tagInt(static_cast<uint64_t>(value), makeDiversifier(initializationNamespace, index, bitsForDiversifier(diversifier)));
     244            else
     245                m_hash = value;
     246        }
     247
     248        ARM64EHash(void* diversifier)
     249        {
     250            setUpdatedHash(0, 0, diversifier);
     251        }
     252 
     253        ALWAYS_INLINE uint32_t update(uint32_t instruction, uint32_t index, void* diversifier)
     254        {
     255            uint32_t currentHash = this->currentHash(index, diversifier);
     256            uint64_t nextIndex = index + 1;
     257            uint32_t output = nextValue(instruction, nextIndex, currentHash);
     258            setUpdatedHash(output, nextIndex, diversifier);
     259            return output;
    220260        }
    221261
    222262    private:
    223         uint32_t m_hash;
     263        uint64_t m_hash;
    224264    };
    225265#endif
     
    231271            , m_index(0)
    232272#if CPU(ARM64E)
    233             , m_hash(static_cast<uint32_t>(bitwise_cast<uint64_t>(this)))
     273            , m_hash(this)
    234274            , m_hashes()
    235275#endif
     
    389429            static_assert(sizeof(value) == 4, "");
    390430#if CPU(ARM64E)
    391             uint32_t hash = m_hash.update(value);
     431            uint32_t hash = m_hash.update(value, m_index / sizeof(IntegralType), this);
    392432            WTF::unalignedStore<uint32_t>(m_hashes.buffer() + m_index, hash);
    393433#endif
  • branches/safari-611.3.10.0-branch/Source/JavaScriptCore/assembler/LinkBuffer.cpp

    r271143 r281004  
    237237    uint8_t* inData = bitwise_cast<uint8_t*>(m_assemblerStorage.buffer());
    238238#if CPU(ARM64E)
    239     ARM64EHash verifyUncompactedHash { static_cast<uint32_t>(bitwise_cast<uint64_t>(&macroAssembler.m_assembler.buffer())) };
     239    void* bufferPtr = &macroAssembler.m_assembler.buffer();
     240    ARM64EHash verifyUncompactedHash { bufferPtr };
    240241    m_assemblerHashesStorage = macroAssembler.m_assembler.buffer().releaseAssemblerHashes();
    241242    uint32_t* inHashes = bitwise_cast<uint32_t*>(m_assemblerHashesStorage.buffer());
     
    259260        InstructionType value = *ptr;
    260261#if CPU(ARM64E)
    261         uint32_t hash = verifyUncompactedHash.update(value);
    262262        unsigned index = (bitwise_cast<uint8_t*>(ptr) - inData) / 4;
     263        uint32_t hash = verifyUncompactedHash.update(value, index, bufferPtr);
    263264        RELEASE_ASSERT(inHashes[index] == hash);
    264265#endif
Note: See TracChangeset for help on using the changeset viewer.