Ignore:
Timestamp:
Mar 16, 2022, 5:05:08 AM (3 years ago)
Author:
Angelos Oikonomopoulos
Message:

MacroAssemblerARMv7: Be friendlier to DisallowMacroScratchRegisterUsage
https://bugs.webkit.org/show_bug.cgi?id=237888

Reviewed by Žan Doberšek.

Only check that we're allowed to use the scratch register at sites
where we're using it implicitly. When it's explicitly passed in by the
caller, use invalidateCachedAddressTempRegister to invalidate it
without asserting anything about m_allowScratchRegister.

Since helpers can explictly make use of addressTempRegister, an
argument can be made that this is still fragile (i.e. future changes
could run into this). The alternative would be to have the topmost caller
do fine-grained management of DisallowMacroScratchRegisterUsage,
allowing it around explicit calls to MacroAssemblerARMv7 with
scratchRegister() in the arguments and disallowing it for helpers.

As there are currently no helpers that would trip this, this patch opts
for the former approach, to make DisallowMacroScratchRegisterUsage
easier to work with (there'll be more usage of the API in an upcoming
wasm32 patch).

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::scratchRegister):
(JSC::MacroAssemblerARMv7::load32):
(JSC::MacroAssemblerARMv7::load16):
(JSC::MacroAssemblerARMv7::load16SignedExtendTo32):
(JSC::MacroAssemblerARMv7::load8):
(JSC::MacroAssemblerARMv7::load8SignedExtendTo32):
(JSC::MacroAssemblerARMv7::loadPair32):
(JSC::MacroAssemblerARMv7::move):
(JSC::MacroAssemblerARMv7::farJump):
(JSC::MacroAssemblerARMv7::setupArmAddress):
(JSC::MacroAssemblerARMv7::invalidateCachedAddressTempRegister):

  • bytecode/CallLinkInfo.cpp:

(JSC::CallLinkInfo::emitFastPathImpl):

  • jit/BaselineJITRegisters.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h

    r291217 r291339  
    7979    static constexpr unsigned numFPRs = std::initializer_list<int>({ FOR_EACH_FP_REGISTER(DUMMY_REGISTER_VALUE) }).size();
    8080#undef DUMMY_REGISTER_VALUE
    81     static constexpr RegisterID scratchRegister() { return addressTempRegister; }
     81    static constexpr RegisterID s_scratchRegister = addressTempRegister;
     82    RegisterID scratchRegister()
     83    {
     84        RELEASE_ASSERT(m_allowScratchRegister);
     85        return s_scratchRegister;
     86    }
    8287
    8388    MacroAssemblerARMv7()
     
    680685    {
    681686        if (dest == addressTempRegister)
    682             cachedAddressTempRegister().invalidate();
     687            invalidateCachedAddressTempRegister();
    683688        else if (dest == dataTempRegister)
    684689            cachedDataTempRegister().invalidate();
     
    699704    {
    700705        if (dest == addressTempRegister)
    701             cachedAddressTempRegister().invalidate();
     706            invalidateCachedAddressTempRegister();
    702707        else if (dest == dataTempRegister)
    703708            cachedDataTempRegister().invalidate();
     
    719724        ASSERT(address.type == ArmAddress::HasIndex);
    720725        if (dest == addressTempRegister)
    721             cachedAddressTempRegister().invalidate();
     726            invalidateCachedAddressTempRegister();
    722727        else if (dest == dataTempRegister)
    723728            cachedDataTempRegister().invalidate();
     
    729734    {
    730735        if (dest == addressTempRegister)
    731             cachedAddressTempRegister().invalidate();
     736            invalidateCachedAddressTempRegister();
    732737        else if (dest == dataTempRegister)
    733738            cachedDataTempRegister().invalidate();
     
    749754        ASSERT(address.type == ArmAddress::HasIndex);
    750755        if (dest == addressTempRegister)
    751             cachedAddressTempRegister().invalidate();
     756            invalidateCachedAddressTempRegister();
    752757        else if (dest == dataTempRegister)
    753758            cachedDataTempRegister().invalidate();
     
    934939            if (!(absOffset & ~0x3fc)) {
    935940                if ((dest1 == addressTempRegister) || (dest2 == addressTempRegister))
    936                     cachedAddressTempRegister().invalidate();
     941                    invalidateCachedAddressTempRegister();
    937942                if ((dest1 == dataTempRegister) || (dest2 == dataTempRegister))
    938943                    cachedDataTempRegister().invalidate();
     
    16661671            cachedDataTempRegister().invalidate();
    16671672        else if (dest == addressTempRegister)
    1668             cachedAddressTempRegister().invalidate();
     1673            invalidateCachedAddressTempRegister();
    16691674    }
    16701675
     
    20552060    {
    20562061        cachedDataTempRegister().invalidate();
    2057         cachedAddressTempRegister().invalidate();
     2062        invalidateCachedAddressTempRegister();
    20582063        m_assembler.bx(target);
    20592064    }
     
    20632068        move(target, addressTempRegister);
    20642069        cachedDataTempRegister().invalidate();
    2065         cachedAddressTempRegister().invalidate();
     2070        invalidateCachedAddressTempRegister();
    20662071        m_assembler.bx(addressTempRegister);
    20672072    }
     
    25302535            } else {
    25312536                move(TrustedImm32(address.offset), addressTempRegister);
     2537                m_assembler.add(addressTempRegister, addressTempRegister, address.base);
    25322538                cachedAddressTempRegister().invalidate();
    2533                 m_assembler.add(addressTempRegister, addressTempRegister, address.base);
    25342539            }
    25352540
     
    26212626    }
    26222627
     2628    ALWAYS_INLINE void invalidateCachedAddressTempRegister()
     2629    {
     2630        // This function is intended for when we are explicitly using
     2631        // addressTempRegister (because the caller supplied it), so it can
     2632        // ignore m_allowScratchRegister.
     2633        m_cachedAddressTempRegister.invalidate();
     2634    }
     2635
    26232636    ALWAYS_INLINE CachedTempRegister& cachedAddressTempRegister()
    26242637    {
Note: See TracChangeset for help on using the changeset viewer.