Changeset 245313 in webkit


Ignore:
Timestamp:
May 14, 2019 3:44:26 PM (5 years ago)
Author:
keith_miller@apple.com
Message:

Fix issue with byteOffset on ARM64E
https://bugs.webkit.org/show_bug.cgi?id=197884

Reviewed by Saam Barati.

JSTests:

We didn't have any tests that run with non-byte/non-zero offset
typed arrays.

  • stress/ftl-gettypedarrayoffset-wasteful.js:

Source/JavaScriptCore:

We forgot to remove the tag from the ArrayBuffer's data
pointer. This corrupted data when computing the offset. We didn't
catch this because we didn't run any with a non-zero byteOffset in
the JITs.

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset):

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileGetTypedArrayByteOffset):
(JSC::FTL::DFG::LowerDFGToB3::untagArrayPtr):
(JSC::FTL::DFG::LowerDFGToB3::removeArrayPtrTag):
(JSC::FTL::DFG::LowerDFGToB3::speculateTypedArrayIsNotNeutered):

  • jit/IntrinsicEmitter.cpp:

(JSC::IntrinsicGetterAccessCase::emitIntrinsicGetter):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r245288 r245313  
     12019-05-14  Keith Miller  <keith_miller@apple.com>
     2
     3        Fix issue with byteOffset on ARM64E
     4        https://bugs.webkit.org/show_bug.cgi?id=197884
     5
     6        Reviewed by Saam Barati.
     7
     8        We didn't have any tests that run with non-byte/non-zero offset
     9        typed arrays.
     10
     11        * stress/ftl-gettypedarrayoffset-wasteful.js:
     12
    1132019-05-14  Yusuke Suzuki  <ysuzuki@apple.com>
    214
  • trunk/JSTests/stress/ftl-gettypedarrayoffset-wasteful.js

    r163324 r245313  
    88    var b = new Uint8Array(new ArrayBuffer(42), 0);
    99    if (foo(b) != 0)
    10         throw "error"
     10        throw new Error();
     11    b = new Uint8Array(new ArrayBuffer(42), 5);
     12    if (foo(b) !== 5)
     13        throw new Error();
     14    b = new Int32Array(new ArrayBuffer(100000 * 4), i * 4);
     15    if (foo(b) !== i * 4)
     16        throw new Error();
    1117}
    1218
  • trunk/Source/JavaScriptCore/ChangeLog

    r245311 r245313  
     12019-05-14  Keith Miller  <keith_miller@apple.com>
     2
     3        Fix issue with byteOffset on ARM64E
     4        https://bugs.webkit.org/show_bug.cgi?id=197884
     5
     6        Reviewed by Saam Barati.
     7
     8        We forgot to remove the tag from the ArrayBuffer's data
     9        pointer. This corrupted data when computing the offset.  We didn't
     10        catch this because we didn't run any with a non-zero byteOffset in
     11        the JITs.
     12
     13        * dfg/DFGSpeculativeJIT.cpp:
     14        (JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset):
     15        * ftl/FTLLowerDFGToB3.cpp:
     16        (JSC::FTL::DFG::LowerDFGToB3::compileGetTypedArrayByteOffset):
     17        (JSC::FTL::DFG::LowerDFGToB3::untagArrayPtr):
     18        (JSC::FTL::DFG::LowerDFGToB3::removeArrayPtrTag):
     19        (JSC::FTL::DFG::LowerDFGToB3::speculateTypedArrayIsNotNeutered):
     20        * jit/IntrinsicEmitter.cpp:
     21        (JSC::IntrinsicGetterAccessCase::emitIntrinsicGetter):
     22
    1232019-05-14  Tadeu Zagallo  <tzagallo@apple.com>
    224
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r245239 r245313  
    67956795
    67966796    m_jit.loadPtr(MacroAssembler::Address(baseGPR, JSArrayBufferView::offsetOfVector()), vectorGPR);
     6797
     6798    // FIXME: This should mask the PAC bits
     6799    // https://bugs.webkit.org/show_bug.cgi?id=197701
    67976800    JITCompiler::Jump nullVector = m_jit.branchTestPtr(JITCompiler::Zero, vectorGPR);
    67986801
     
    68066809    // https://bugs.webkit.org/show_bug.cgi?id=175515
    68076810    m_jit.loadPtr(MacroAssembler::Address(arrayBufferGPR, ArrayBuffer::offsetOfData()), dataGPR);
     6811#if CPU(ARM64E)
     6812    m_jit.removeArrayPtrTag(dataGPR);
     6813#endif
     6814
    68086815    m_jit.subPtr(dataGPR, vectorGPR);
    68096816   
  • trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp

    r245239 r245313  
    39163916        // https://bugs.webkit.org/show_bug.cgi?id=175515
    39173917        LValue dataPtr = m_out.loadPtr(arrayBufferPtr, m_heaps.ArrayBuffer_data);
     3918        dataPtr = removeArrayPtrTag(dataPtr);
    39183919
    39193920        ValueFromBlock wastefulOut = m_out.anchor(m_out.sub(vectorPtr, dataPtr));
     
    1410414105    LValue untagArrayPtr(LValue ptr, LValue size)
    1410514106    {
    14106 
    14107 #if !GIGACAGE_ENABLED && CPU(ARM64E)
     14107#if CPU(ARM64E)
    1410814108        PatchpointValue* authenticate = m_out.patchpoint(pointerType());
    1410914109        authenticate->appendSomeRegister(ptr);
     
    1411814118        return ptr;
    1411914119#endif
     14120    }
     14121
     14122    LValue removeArrayPtrTag(LValue ptr)
     14123    {
     14124#if CPU(ARM64E)
     14125        PatchpointValue* authenticate = m_out.patchpoint(pointerType());
     14126        authenticate->appendSomeRegister(ptr);
     14127        authenticate->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
     14128            jit.move(params[1].gpr(), params[0].gpr());
     14129            jit.removeArrayPtrTag(params[0].gpr());
     14130        });
     14131        return authenticate;
     14132#endif
     14133        return ptr;
    1412014134    }
    1412114135
     
    1657516589        LBasicBlock lastNext = m_out.appendTo(isWasteful, continuation);
    1657616590        LValue vector = m_out.loadPtr(base, m_heaps.JSArrayBufferView_vector);
    16577 #if !GIGACAGE_ENABLED && CPU(ARM64E)
    16578         // FIXME: We could probably make this a mask. https://bugs.webkit.org/show_bug.cgi?id=197701
    16579         PatchpointValue* authenticate = m_out.patchpoint(pointerType());
    16580         authenticate->appendSomeRegister(vector);
    16581         authenticate->setGenerator([=] (CCallHelpers& jit, const StackmapGenerationParams& params) {
    16582             jit.move(params[1].gpr(), params[0].gpr());
    16583             jit.removeArrayPtrTag(params[0].gpr());
    16584         });
    16585         vector = authenticate;
    16586 #endif
     16591        // FIXME: We could probably make this a mask.
     16592        // https://bugs.webkit.org/show_bug.cgi?id=197701
     16593        vector = removeArrayPtrTag(vector);
    1658716594        speculate(Uncountable, jsValueValue(vector), m_node, m_out.isZero64(vector));
    1658816595        m_out.jump(continuation);
  • trunk/Source/JavaScriptCore/jit/IntrinsicEmitter.cpp

    r245064 r245313  
    115115        jit.loadPtr(MacroAssembler::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR);
    116116        jit.loadPtr(MacroAssembler::Address(baseGPR, JSArrayBufferView::offsetOfVector()), valueGPR);
    117 #if !GIGACAGE_ENABLED && CPU(ARM64E)
     117#if CPU(ARM64E)
    118118        jit.removeArrayPtrTag(valueGPR);
    119119#endif
    120120        jit.loadPtr(MacroAssembler::Address(scratchGPR, Butterfly::offsetOfArrayBuffer()), scratchGPR);
    121121        jit.loadPtr(MacroAssembler::Address(scratchGPR, ArrayBuffer::offsetOfData()), scratchGPR);
     122#if CPU(ARM64E)
     123        jit.removeArrayPtrTag(scratchGPR);
     124#endif
    122125        jit.subPtr(scratchGPR, valueGPR);
    123126
Note: See TracChangeset for help on using the changeset viewer.