Changeset 50109 in webkit


Ignore:
Timestamp:
Oct 26, 2009 3:49:23 PM (14 years ago)
Author:
eric@webkit.org
Message:

2009-10-26 Gabor Loki <loki@inf.u-szeged.hu>

Reviewed by Gavin Barraclough.

The thunkReturnAddress is on JITStackFrame on ARM JIT as well
https://bugs.webkit.org/show_bug.cgi?id=30782

Move the thunkReturnAddress from top of the stack into the JITStackFrame
structure. This is a requirement for JSValue32_64 support on ARM.

  • assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::ret): Return with link register (JSC::MacroAssemblerARM::prepareCall): Store the return address in link register
  • jit/JIT.h: Remove unused ctiReturnRegister
  • jit/JITInlineMethods.h: Same as ARMv7 (JSC::JIT::restoreArgumentReference): Ditto. (JSC::JIT::restoreArgumentReferenceForTrampoline): Ditto.
  • jit/JITOpcodes.cpp: Remove ctiReturnRegister related instruction
  • jit/JITStubs.cpp: Store thunkReturnAddress on JITStackFrame. Use small trampoline functions which handle return addresses for each CTI_STUB_FUNCTION.
  • jit/JITStubs.h: Store thunkReturnAddress on JITStackFrame (JSC::JITStackFrame::returnAddressSlot): Return with the address of thunkReturnAddress
  • yarr/RegexJIT.cpp: (JSC::Yarr::RegexGenerator::generateEnter): Remove the unnecessary instruction
Location:
trunk/JavaScriptCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r50052 r50109  
     12009-10-26  Gabor Loki  <loki@inf.u-szeged.hu>
     2
     3        Reviewed by Gavin Barraclough.
     4
     5        The thunkReturnAddress is on JITStackFrame on ARM JIT as well
     6        https://bugs.webkit.org/show_bug.cgi?id=30782
     7
     8        Move the thunkReturnAddress from top of the stack into the JITStackFrame
     9        structure. This is a requirement for JSValue32_64 support on ARM.
     10
     11        * assembler/MacroAssemblerARM.h:
     12        (JSC::MacroAssemblerARM::ret): Return with link register
     13        (JSC::MacroAssemblerARM::prepareCall): Store the return address in link register
     14        * jit/JIT.h: Remove unused ctiReturnRegister
     15        * jit/JITInlineMethods.h: Same as ARMv7
     16        (JSC::JIT::restoreArgumentReference): Ditto.
     17        (JSC::JIT::restoreArgumentReferenceForTrampoline): Ditto.
     18        * jit/JITOpcodes.cpp: Remove ctiReturnRegister related instruction
     19        * jit/JITStubs.cpp: Store thunkReturnAddress on JITStackFrame. Use
     20        small trampoline functions which handle return addresses for each
     21        CTI_STUB_FUNCTION.
     22        * jit/JITStubs.h: Store thunkReturnAddress on JITStackFrame
     23        (JSC::JITStackFrame::returnAddressSlot): Return with the address of thunkReturnAddress
     24        * yarr/RegexJIT.cpp:
     25        (JSC::Yarr::RegexGenerator::generateEnter): Remove the unnecessary instruction
     26
    1272009-10-26  Steve Block  <steveblock@google.com>
    228
  • trunk/JavaScriptCore/assembler/MacroAssemblerARM.h

    r48782 r50109  
    6666
    6767    static const RegisterID stackPointerRegister = ARMRegisters::sp;
     68    static const RegisterID linkRegister = ARMRegisters::lr;
    6869
    6970    static const Scale ScalePtr = TimesFour;
     
    531532    void ret()
    532533    {
    533         pop(ARMRegisters::pc);
     534        m_assembler.mov_r(ARMRegisters::pc, linkRegister);
    534535    }
    535536
     
    747748    void prepareCall()
    748749    {
    749         ensureSpace(3 * sizeof(ARMWord), sizeof(ARMWord));
    750 
    751         // S0 might be used for parameter passing
    752         m_assembler.add_r(ARMRegisters::S1, ARMRegisters::pc, ARMAssembler::OP2_IMM | 0x4);
    753         m_assembler.push_r(ARMRegisters::S1);
     750        ensureSpace(2 * sizeof(ARMWord), sizeof(ARMWord));
     751
     752        m_assembler.mov_r(linkRegister, ARMRegisters::pc);
    754753    }
    755754
  • trunk/JavaScriptCore/jit/JIT.h

    r49820 r50109  
    250250        static const RegisterID timeoutCheckRegister = ARMRegisters::r5;
    251251        static const RegisterID callFrameRegister = ARMRegisters::r4;
    252         static const RegisterID ctiReturnRegister = ARMRegisters::r6;
    253252
    254253        static const RegisterID regT0 = ARMRegisters::r0;
     
    620619        #error "OPCODE_SAMPLING is not yet supported"
    621620#else
    622         static const int patchOffsetGetByIdSlowCaseCall = 36;
     621        static const int patchOffsetGetByIdSlowCaseCall = 28;
    623622#endif
    624623        static const int patchOffsetOpCallCompareToJump = 12;
     
    641640        static const int sequenceGetByIdHotPathConstantSpace = 3;
    642641        // sequenceGetByIdSlowCase
    643         static const int sequenceGetByIdSlowCaseInstructionSpace = 40;
     642        static const int sequenceGetByIdSlowCaseInstructionSpace = 32;
    644643        static const int sequenceGetByIdSlowCaseConstantSpace = 2;
    645644        // sequencePutById
  • trunk/JavaScriptCore/jit/JITInlineMethods.h

    r48744 r50109  
    145145#endif
    146146
    147 #if PLATFORM(ARM_THUMB2)
     147#if PLATFORM(ARM)
    148148
    149149ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg)
     
    162162}
    163163
    164 #else // PLATFORM(X86) || PLATFORM(X86_64) || PLATFORM(ARM_TRADITIONAL)
     164#else // PLATFORM(X86) || PLATFORM(X86_64)
    165165
    166166ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg)
     
    192192    move(stackPointerRegister, firstArgumentRegister);
    193193    poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*));
    194 #if PLATFORM(ARM_TRADITIONAL)
    195     move(ctiReturnRegister, ARMRegisters::lr);
    196 #endif
    197194}
    198195ALWAYS_INLINE void JIT::restoreArgumentReferenceForTrampoline()
     
    201198    // Within a trampoline the return address will be on the stack at this point.
    202199    addPtr(Imm32(sizeof(void*)), stackPointerRegister, firstArgumentRegister);
    203 #elif PLATFORM(ARM_THUMB2)
     200#elif PLATFORM(ARM)
    204201    move(stackPointerRegister, firstArgumentRegister);
    205202#endif
  • trunk/JavaScriptCore/jit/JITOpcodes.cpp

    r49888 r50109  
    17931793    move(stackPointerRegister, ARMRegisters::S0);
    17941794
    1795     move(ctiReturnRegister, ARMRegisters::lr);
    17961795    call(Address(regT1, OBJECT_OFFSETOF(JSFunction, m_data)));
    17971796
  • trunk/JavaScriptCore/jit/JITStubs.cpp

    r49734 r50109  
    536536    "stmdb sp!, {r1-r3}" "\n"
    537537    "stmdb sp!, {r4-r8, lr}" "\n"
    538     "mov r6, pc" "\n"
    539     "add r6, r6, #40" "\n"
    540     "sub sp, sp, #32" "\n"
    541     "ldr r4, [sp, #60]" "\n"
     538    "sub sp, sp, #36" "\n"
     539    "mov r4, r2" "\n"
    542540    "mov r5, #512" "\n"
    543     // r0 contains the code
    544     "add r8, pc, #4" "\n"
    545     "str r8, [sp, #-4]!" "\n"
     541    "mov lr, pc" "\n"
    546542    "mov pc, r0" "\n"
    547     "add sp, sp, #32" "\n"
     543    "add sp, sp, #36" "\n"
    548544    "ldmia sp!, {r4-r8, lr}" "\n"
    549545    "add sp, sp, #12" "\n"
    550546    "mov pc, lr" "\n"
    551 
    552     // the return instruction
    553     "ldr pc, [sp], #4" "\n"
    554547);
    555548
     
    558551SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n"
    559552    "mov r0, sp" "\n"
    560     "mov lr, r6" "\n"
    561     "add r8, pc, #4" "\n"
    562     "str r8, [sp, #-4]!" "\n"
    563     "b " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
     553    "bl " SYMBOL_STRING_RELOCATION(cti_vm_throw) "\n"
    564554
    565555// Both has the same return sequence
    566556".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"
    567557SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"
    568     "add sp, sp, #32" "\n"
     558    "add sp, sp, #36" "\n"
    569559    "ldmia sp!, {r4-r8, lr}" "\n"
    570560    "add sp, sp, #12" "\n"
     
    908898        ); \
    909899    rtype JITStubThunked_##op(STUB_ARGS_DECLARATION) \
     900
     901#elif PLATFORM(ARM_TRADITIONAL) && COMPILER(GCC)
     902
     903#define DEFINE_STUB_FUNCTION(rtype, op) \
     904    extern "C" { \
     905        rtype JITStubThunked_##op(STUB_ARGS_DECLARATION); \
     906    }; \
     907    asm volatile ( \
     908        ".globl " SYMBOL_STRING(cti_##op) "\n" \
     909        SYMBOL_STRING(cti_##op) ":" "\n" \
     910        "str lr, [sp, #32]" "\n" \
     911        "bl " SYMBOL_STRING(JITStubThunked_##op) "\n" \
     912        "ldr lr, [sp, #32]" "\n" \
     913        "mov pc, lr" "\n" \
     914        ); \
     915    rtype JITStubThunked_##op(STUB_ARGS_DECLARATION)
    910916
    911917#else
  • trunk/JavaScriptCore/jit/JITStubs.h

    r49734 r50109  
    164164        JITStubArg args[7];
    165165
     166        ReturnAddressPtr thunkReturnAddress;
     167
    166168        void* preservedR4;
    167169        void* preservedR5;
     
    174176        CallFrame* callFrame;
    175177        JSValue* exception;
     178
     179        // These arguments passed on the stack.
    176180        Profiler** enabledProfilerReference;
    177181        JSGlobalData* globalData;
    178182
    179183        // When JIT code makes a call, it pushes its return address just below the rest of the stack.
    180         ReturnAddressPtr* returnAddressSlot() { return reinterpret_cast<ReturnAddressPtr*>(this) - 1; }
     184        ReturnAddressPtr* returnAddressSlot() { return &thunkReturnAddress; }
    181185    };
    182186#else
  • trunk/JavaScriptCore/yarr/RegexJIT.cpp

    r49365 r50109  
    13101310    #endif
    13111311#elif PLATFORM(ARM)
    1312 #if PLATFORM(ARM_TRADITIONAL)
    1313         push(ARMRegisters::lr);
    1314 #endif
    13151312        push(ARMRegisters::r4);
    13161313        push(ARMRegisters::r5);
Note: See TracChangeset for help on using the changeset viewer.