Changeset 195578 in webkit


Ignore:
Timestamp:
Jan 25, 2016 8:01:33 PM (8 years ago)
Author:
commit-queue@webkit.org
Message:

[JSC] We should never use x18 on iOS ARM64
https://bugs.webkit.org/show_bug.cgi?id=153461

Patch by Benjamin Poulain <bpoulain@apple.com> on 2016-01-25
Reviewed by Filip Pizlo.

The register x18 is reserved in the iOS variant of the ARM64 ABI.

The weird thing is: if you use it, its value will change completely
randomly. It looks like it is changed by the system on interrupts.

This patch adds x18 to the reserved register and add assertions
to the assembler to prevent similar problems in the future.

  • assembler/ARM64Assembler.h:

(JSC::ARM64Assembler::xOrSp):
(JSC::ARM64Assembler::xOrZr):

  • assembler/AbstractMacroAssembler.h:

(JSC::isIOS): Deleted.

  • assembler/AssemblerCommon.h:

(JSC::isIOS):

  • jit/RegisterSet.cpp:

(JSC::RegisterSet::reservedHardwareRegisters):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r195576 r195578  
     12016-01-25  Benjamin Poulain  <bpoulain@apple.com>
     2
     3        [JSC] We should never use x18 on iOS ARM64
     4        https://bugs.webkit.org/show_bug.cgi?id=153461
     5
     6        Reviewed by Filip Pizlo.
     7
     8        The register x18 is reserved in the iOS variant of the ARM64 ABI.
     9
     10        The weird thing is: if you use it, its value will change completely
     11        randomly. It looks like it is changed by the system on interrupts.
     12
     13        This patch adds x18 to the reserved register and add assertions
     14        to the assembler to prevent similar problems in the future.
     15
     16        * assembler/ARM64Assembler.h:
     17        (JSC::ARM64Assembler::xOrSp):
     18        (JSC::ARM64Assembler::xOrZr):
     19        * assembler/AbstractMacroAssembler.h:
     20        (JSC::isIOS): Deleted.
     21        * assembler/AssemblerCommon.h:
     22        (JSC::isIOS):
     23        * jit/RegisterSet.cpp:
     24        (JSC::RegisterSet::reservedHardwareRegisters):
     25
    1262016-01-25  Commit Queue  <commit-queue@webkit.org>
    227
  • trunk/Source/JavaScriptCore/assembler/ARM64Assembler.h

    r194635 r195578  
    32773277    }
    32783278
    3279     static int xOrSp(RegisterID reg) { ASSERT(!isZr(reg)); return reg; }
    3280     static int xOrZr(RegisterID reg) { ASSERT(!isSp(reg)); return reg & 31; }
     3279    static int xOrSp(RegisterID reg)
     3280    {
     3281        ASSERT(!isZr(reg));
     3282        ASSERT(!isIOS() || reg != ARM64Registers::x18);
     3283        return reg;
     3284    }
     3285    static int xOrZr(RegisterID reg)
     3286    {
     3287        ASSERT(!isSp(reg));
     3288        ASSERT(!isIOS() || reg != ARM64Registers::x18);
     3289        return reg & 31;
     3290    }
    32813291    static FPRegisterID xOrZrAsFPR(RegisterID reg) { return static_cast<FPRegisterID>(xOrZr(reg)); }
    32823292    static int xOrZrOrSp(bool useZr, RegisterID reg) { return useZr ? xOrZr(reg) : xOrSp(reg); }
  • trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h

    r195139 r195578  
    7777}
    7878
    79 inline bool isIOS()
    80 {
    81 #if PLATFORM(IOS)
    82     return true;
    83 #else
    84     return false;
    85 #endif
    86 }
    87 
    8879inline bool optimizeForARMv7IDIVSupported()
    8980{
  • trunk/Source/JavaScriptCore/assembler/AssemblerCommon.h

    r194635 r195578  
    2828
    2929namespace JSC {
     30
     31ALWAYS_INLINE bool isIOS()
     32{
     33#if PLATFORM(IOS)
     34    return true;
     35#else
     36    return false;
     37#endif
     38}
    3039
    3140ALWAYS_INLINE bool isInt9(int32_t value)
  • trunk/Source/JavaScriptCore/jit/RegisterSet.cpp

    r195182 r195578  
    4646{
    4747#if CPU(ARM64)
     48#if PLATFORM(IOS)
     49    return RegisterSet(ARM64Registers::x18, ARM64Registers::lr);
     50#else
    4851    return RegisterSet(ARM64Registers::lr);
     52#endif // PLATFORM(IOS)
    4953#else
    5054    return RegisterSet();
Note: See TracChangeset for help on using the changeset viewer.