Changeset 50109 in webkit for trunk/JavaScriptCore
- Timestamp:
- Oct 26, 2009, 3:49:23 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r50052 r50109 1 2009-10-26 Gabor Loki <[email protected]> 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 1 27 2009-10-26 Steve Block <[email protected]> 2 28 -
trunk/JavaScriptCore/assembler/MacroAssemblerARM.h
r48782 r50109 66 66 67 67 static const RegisterID stackPointerRegister = ARMRegisters::sp; 68 static const RegisterID linkRegister = ARMRegisters::lr; 68 69 69 70 static const Scale ScalePtr = TimesFour; … … 531 532 void ret() 532 533 { 533 pop(ARMRegisters::pc);534 m_assembler.mov_r(ARMRegisters::pc, linkRegister); 534 535 } 535 536 … … 747 748 void prepareCall() 748 749 { 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); 754 753 } 755 754 -
trunk/JavaScriptCore/jit/JIT.h
r49820 r50109 250 250 static const RegisterID timeoutCheckRegister = ARMRegisters::r5; 251 251 static const RegisterID callFrameRegister = ARMRegisters::r4; 252 static const RegisterID ctiReturnRegister = ARMRegisters::r6;253 252 254 253 static const RegisterID regT0 = ARMRegisters::r0; … … 620 619 #error "OPCODE_SAMPLING is not yet supported" 621 620 #else 622 static const int patchOffsetGetByIdSlowCaseCall = 36;621 static const int patchOffsetGetByIdSlowCaseCall = 28; 623 622 #endif 624 623 static const int patchOffsetOpCallCompareToJump = 12; … … 641 640 static const int sequenceGetByIdHotPathConstantSpace = 3; 642 641 // sequenceGetByIdSlowCase 643 static const int sequenceGetByIdSlowCaseInstructionSpace = 40;642 static const int sequenceGetByIdSlowCaseInstructionSpace = 32; 644 643 static const int sequenceGetByIdSlowCaseConstantSpace = 2; 645 644 // sequencePutById -
trunk/JavaScriptCore/jit/JITInlineMethods.h
r48744 r50109 145 145 #endif 146 146 147 #if PLATFORM(ARM _THUMB2)147 #if PLATFORM(ARM) 148 148 149 149 ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg) … … 162 162 } 163 163 164 #else // PLATFORM(X86) || PLATFORM(X86_64) || PLATFORM(ARM_TRADITIONAL)164 #else // PLATFORM(X86) || PLATFORM(X86_64) 165 165 166 166 ALWAYS_INLINE void JIT::preserveReturnAddressAfterCall(RegisterID reg) … … 192 192 move(stackPointerRegister, firstArgumentRegister); 193 193 poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); 194 #if PLATFORM(ARM_TRADITIONAL)195 move(ctiReturnRegister, ARMRegisters::lr);196 #endif197 194 } 198 195 ALWAYS_INLINE void JIT::restoreArgumentReferenceForTrampoline() … … 201 198 // Within a trampoline the return address will be on the stack at this point. 202 199 addPtr(Imm32(sizeof(void*)), stackPointerRegister, firstArgumentRegister); 203 #elif PLATFORM(ARM _THUMB2)200 #elif PLATFORM(ARM) 204 201 move(stackPointerRegister, firstArgumentRegister); 205 202 #endif -
trunk/JavaScriptCore/jit/JITOpcodes.cpp
r49888 r50109 1793 1793 move(stackPointerRegister, ARMRegisters::S0); 1794 1794 1795 move(ctiReturnRegister, ARMRegisters::lr);1796 1795 call(Address(regT1, OBJECT_OFFSETOF(JSFunction, m_data))); 1797 1796 -
trunk/JavaScriptCore/jit/JITStubs.cpp
r49734 r50109 536 536 "stmdb sp!, {r1-r3}" "\n" 537 537 "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" 542 540 "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" 546 542 "mov pc, r0" "\n" 547 "add sp, sp, #3 2" "\n"543 "add sp, sp, #36" "\n" 548 544 "ldmia sp!, {r4-r8, lr}" "\n" 549 545 "add sp, sp, #12" "\n" 550 546 "mov pc, lr" "\n" 551 552 // the return instruction553 "ldr pc, [sp], #4" "\n"554 547 ); 555 548 … … 558 551 SYMBOL_STRING(ctiVMThrowTrampoline) ":" "\n" 559 552 "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" 564 554 565 555 // Both has the same return sequence 566 556 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n" 567 557 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n" 568 "add sp, sp, #3 2" "\n"558 "add sp, sp, #36" "\n" 569 559 "ldmia sp!, {r4-r8, lr}" "\n" 570 560 "add sp, sp, #12" "\n" … … 908 898 ); \ 909 899 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) 910 916 911 917 #else -
trunk/JavaScriptCore/jit/JITStubs.h
r49734 r50109 164 164 JITStubArg args[7]; 165 165 166 ReturnAddressPtr thunkReturnAddress; 167 166 168 void* preservedR4; 167 169 void* preservedR5; … … 174 176 CallFrame* callFrame; 175 177 JSValue* exception; 178 179 // These arguments passed on the stack. 176 180 Profiler** enabledProfilerReference; 177 181 JSGlobalData* globalData; 178 182 179 183 // 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; } 181 185 }; 182 186 #else -
trunk/JavaScriptCore/yarr/RegexJIT.cpp
r49365 r50109 1310 1310 #endif 1311 1311 #elif PLATFORM(ARM) 1312 #if PLATFORM(ARM_TRADITIONAL)1313 push(ARMRegisters::lr);1314 #endif1315 1312 push(ARMRegisters::r4); 1316 1313 push(ARMRegisters::r5);
Note:
See TracChangeset
for help on using the changeset viewer.