Changeset 158751 in webkit
- Timestamp:
- Nov 6, 2013 9:29:12 AM (10 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 deleted
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r158748 r158751 1 2013-11-06 Michael Saboff <msaboff@apple.com> 2 3 Change ctiTrampoline into a thunk 4 https://bugs.webkit.org/show_bug.cgi?id=123844 5 6 Reviewed by Filip Pizlo. 7 8 Converted ctiTrampoline and ctiOpThrowNotCaught into thunks named callToJavaScript 9 and returnFromJavaScript. Cleaned up and in some cases removed JITStubsXXX.h files 10 after removing ctiTrampoline and ctiOpThrowNotCaught. Added callJavaScriptJITFunction 11 to VM that is a function pointer to the callToJavaScript thunk. 12 13 * GNUmakefile.list.am: 14 * JavaScriptCore.xcodeproj/project.pbxproj: 15 * dfg/DFGDriver.cpp: 16 (JSC::DFG::compileImpl): 17 * jit/JITCode.cpp: 18 (JSC::JITCode::execute): 19 * jit/JITExceptions.cpp: 20 (JSC::genericUnwind): 21 * jit/JITStubs.cpp: 22 * jit/JITStubs.h: 23 * jit/JITStubsARM.h: 24 * jit/JITStubsARM64.h: Removed. 25 * jit/JITStubsARMv7.h: 26 * jit/JITStubsMIPS.h: Removed. 27 * jit/JITStubsMSVC64.asm: 28 * jit/JITStubsSH4.h: Removed. 29 * jit/JITStubsX86.h: 30 * jit/JITStubsX86_64.h: 31 * jit/JSInterfaceJIT.h: 32 * jit/ThunkGenerators.cpp: 33 (JSC::returnFromJavaScript): 34 (JSC::callToJavaScript): 35 * jit/ThunkGenerators.h: 36 * runtime/VM.cpp: 37 (JSC::VM::VM): 38 * runtime/VM.h: 39 1 40 2013-11-05 Filip Pizlo <fpizlo@apple.com> 2 41 -
trunk/Source/JavaScriptCore/GNUmakefile.list.am
r158385 r158751 663 663 Source/JavaScriptCore/jit/JITStubs.h \ 664 664 Source/JavaScriptCore/jit/JITStubsARM.h \ 665 Source/JavaScriptCore/jit/JITStubsARM64.h \666 665 Source/JavaScriptCore/jit/JITStubsARMv7.h \ 667 Source/JavaScriptCore/jit/JITStubsMIPS.h \668 Source/JavaScriptCore/jit/JITStubsSH4.h \669 666 Source/JavaScriptCore/jit/JITStubsX86.h \ 670 667 Source/JavaScriptCore/jit/JITStubsX86_64.h \ -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r158384 r158751 715 715 41359CF30FDD89AD00206180 /* DateConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = D21202290AD4310C00ED79B6 /* DateConversion.h */; }; 716 716 4443AE3316E188D90076F110 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51F0EB6105C86C6B00E6DF1B /* Foundation.framework */; }; 717 44DF93E617A1D9200097B97B /* JITStubsARM64.h in Headers */ = {isa = PBXBuildFile; fileRef = 44DF93E517A1D9200097B97B /* JITStubsARM64.h */; };718 717 451539B912DC994500EF7AC4 /* Yarr.h in Headers */ = {isa = PBXBuildFile; fileRef = 451539B812DC994500EF7AC4 /* Yarr.h */; settings = {ATTRIBUTES = (Private, ); }; }; 719 718 5D53726F0E1C54880021E549 /* Tracing.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D53726E0E1C54880021E549 /* Tracing.h */; }; … … 970 969 A7986D5717A0BB1E00A95DD0 /* DFGEdgeUsesStructure.h in Headers */ = {isa = PBXBuildFile; fileRef = A7986D5617A0BB1E00A95DD0 /* DFGEdgeUsesStructure.h */; settings = {ATTRIBUTES = (Private, ); }; }; 971 970 A7A4AE0817973B26005612B1 /* MacroAssemblerX86Common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A4AE0717973B26005612B1 /* MacroAssemblerX86Common.cpp */; }; 972 A7A4AE0D17973B4D005612B1 /* JITStubsMIPS.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A4AE0917973B4D005612B1 /* JITStubsMIPS.h */; };973 A7A4AE0F17973B4D005612B1 /* JITStubsSH4.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A4AE0B17973B4D005612B1 /* JITStubsSH4.h */; };974 971 A7A4AE1017973B4D005612B1 /* JITStubsX86Common.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A4AE0C17973B4D005612B1 /* JITStubsX86Common.h */; }; 975 972 A7A8AF3417ADB5F3005AB174 /* ArrayBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A8AF2517ADB5F2005AB174 /* ArrayBuffer.cpp */; }; … … 1944 1941 371D842C17C98B6E00ECF994 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 1945 1942 449097EE0F8F81B50076A327 /* FeatureDefines.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeatureDefines.xcconfig; sourceTree = "<group>"; }; 1946 44DF93E517A1D9200097B97B /* JITStubsARM64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITStubsARM64.h; sourceTree = "<group>"; };1947 1943 451539B812DC994500EF7AC4 /* Yarr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Yarr.h; path = yarr/Yarr.h; sourceTree = "<group>"; }; 1948 1944 45E12D8806A49B0F00E9DF84 /* jsc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jsc.cpp; sourceTree = "<group>"; tabWidth = 4; }; … … 2254 2250 A79EDB0811531CD60019E912 /* JSObjectRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSObjectRefPrivate.h; sourceTree = "<group>"; }; 2255 2251 A7A4AE0717973B26005612B1 /* MacroAssemblerX86Common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MacroAssemblerX86Common.cpp; sourceTree = "<group>"; }; 2256 A7A4AE0917973B4D005612B1 /* JITStubsMIPS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITStubsMIPS.h; sourceTree = "<group>"; };2257 A7A4AE0B17973B4D005612B1 /* JITStubsSH4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITStubsSH4.h; sourceTree = "<group>"; };2258 2252 A7A4AE0C17973B4D005612B1 /* JITStubsX86Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITStubsX86Common.h; sourceTree = "<group>"; }; 2259 2253 A7A7EE7411B98B8D0065A14F /* ASTBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASTBuilder.h; sourceTree = "<group>"; }; … … 2936 2930 14A6581A0F4E36F4000150FD /* JITStubs.h */, 2937 2931 FEF6835A174343CC00A32E25 /* JITStubsARM.h */, 2938 44DF93E517A1D9200097B97B /* JITStubsARM64.h */,2939 2932 FEF6835B174343CC00A32E25 /* JITStubsARMv7.h */, 2940 A7A4AE0917973B4D005612B1 /* JITStubsMIPS.h */,2941 A7A4AE0B17973B4D005612B1 /* JITStubsSH4.h */,2942 2933 FEF6835D174343CC00A32E25 /* JITStubsX86.h */, 2943 2934 FEF6835C174343CC00A32E25 /* JITStubsX86_64.h */, … … 4411 4402 14C5242B0F5355E900BA3D04 /* JITStubs.h in Headers */, 4412 4403 FEF6835E174343CC00A32E25 /* JITStubsARM.h in Headers */, 4413 44DF93E617A1D9200097B97B /* JITStubsARM64.h in Headers */,4414 4404 FEF6835F174343CC00A32E25 /* JITStubsARMv7.h in Headers */, 4415 A7A4AE0D17973B4D005612B1 /* JITStubsMIPS.h in Headers */,4416 A7A4AE0F17973B4D005612B1 /* JITStubsSH4.h in Headers */,4417 4405 FEF68361174343CC00A32E25 /* JITStubsX86.h in Headers */, 4418 4406 FEF68360174343CC00A32E25 /* JITStubsX86_64.h in Headers */, -
trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp
r158535 r158751 79 79 // Make sure that any stubs that the DFG is going to use are initialized. We want to 80 80 // make sure that all JIT code generation does finalization on the main thread. 81 vm.getCTIStub(callToJavaScript); 82 vm.getCTIStub(throwNotCaught); 81 83 vm.getCTIStub(osrExitGenerationThunkGenerator); 82 84 vm.getCTIStub(throwExceptionFromCallSlowPathGenerator); -
trunk/Source/JavaScriptCore/jit/JITCode.cpp
r155023 r158751 28 28 29 29 #include "Operations.h" 30 #include "ThunkGenerators.h" 30 31 #include <wtf/PrintStream.h> 31 32 … … 44 45 JSValue JITCode::execute(JSStack* stack, CallFrame* callFrame, VM* vm) 45 46 { 46 JSValue result = JSValue::decode(ctiTrampoline(executableAddress(), stack, callFrame, 0, 0, vm)); 47 UNUSED_PARAM(stack); 48 49 JSValue result = JSValue::decode(vm->callJavaScriptJITFunction(executableAddress(), callFrame)); 47 50 return vm->exception() ? jsNull() : result; 48 51 } -
trunk/Source/JavaScriptCore/jit/JITExceptions.cpp
r157636 r158751 50 50 catchRoutine = ExecutableBase::catchRoutineFor(handler, catchPCForInterpreter); 51 51 } else 52 catchRoutine = FunctionPtr(LLInt::getCodePtr(ctiOpThrowNotCaught)).value();52 catchRoutine = vm->getCTIStub(throwNotCaught).code().executableAddress(); 53 53 54 54 vm->callFrameForThrow = callFrame; -
trunk/Source/JavaScriptCore/jit/JITStubs.cpp
r157636 r158751 34 34 #include "JITStubs.h" 35 35 36 #include "Arguments.h"37 #include "ArrayConstructor.h"38 #include "CallFrame.h"39 #include "CallFrameInlines.h"40 #include "CodeBlock.h"41 #include "CodeProfiling.h"42 #include "CommonSlowPaths.h"43 #include "DFGCompilationMode.h"44 #include "DFGDriver.h"45 #include "DFGOSREntry.h"46 #include "DFGWorklist.h"47 #include "Debugger.h"48 #include "DeferGC.h"49 #include "ErrorInstance.h"50 #include "ExceptionHelpers.h"51 #include "GetterSetter.h"52 #include "Heap.h"53 #include <wtf/InlineASM.h>54 #include "JIT.h"55 #include "JITExceptions.h"56 #include "JITToDFGDeferredCompilationCallback.h"57 #include "JSActivation.h"58 #include "JSArray.h"59 #include "JSFunction.h"60 #include "JSGlobalObjectFunctions.h"61 #include "JSNameScope.h"62 #include "JSNotAnObject.h"63 #include "JSPropertyNameIterator.h"64 #include "JSString.h"65 #include "JSWithScope.h"66 #include "LegacyProfiler.h"67 #include "NameInstance.h"68 #include "ObjectConstructor.h"69 #include "ObjectPrototype.h"70 #include "Operations.h"71 #include "Parser.h"72 #include "RegExpObject.h"73 #include "RegExpPrototype.h"74 #include "Register.h"75 #include "RepatchBuffer.h"76 #include "SamplingTool.h"77 #include "SlowPathCall.h"78 #include "Strong.h"79 #include "StructureRareDataInlines.h"80 #include <wtf/StdLibExtras.h>81 #include <stdarg.h>82 #include <stdio.h>83 84 using namespace std;85 86 36 #if CPU(ARM_TRADITIONAL) 87 37 #include "JITStubsARM.h" 88 38 #elif CPU(ARM_THUMB2) 89 39 #include "JITStubsARMv7.h" 90 #elif CPU(MIPS)91 #include "JITStubsMIPS.h"92 #elif CPU(SH4)93 #include "JITStubsSH4.h"94 40 #elif CPU(X86) 95 41 #include "JITStubsX86.h" … … 97 43 #include "JITStubsX86_64.h" 98 44 #elif CPU(ARM64) 99 #include "JITStubsARM64.h" 45 // There isn't an ARM64 specific .h file 46 #elif CPU(MIPS) 47 // There isn't a MIPS specific .h file 48 #elif CPU(SH4) 49 // There isn't an SH4 specific .h file 100 50 #else 101 51 #error "JIT not supported on this platform." 102 52 #endif 103 53 104 namespace JSC {105 106 #if ENABLE(OPCODE_SAMPLING)107 #define CTI_SAMPLER stackFrame.vm->interpreter->sampler()108 #else109 #define CTI_SAMPLER 0110 #endif111 112 } // namespace JSC113 114 54 #endif // ENABLE(JIT) -
trunk/Source/JavaScriptCore/jit/JITStubs.h
r157795 r158751 31 31 #define JITStubs_h 32 32 33 #include "CallData.h"34 #include "Intrinsic.h"35 #include "JITExceptions.h"36 #include "LowLevelInterpreter.h"37 #include "MacroAssemblerCodeRef.h"38 #include "Register.h"39 40 33 namespace JSC { 41 34 42 35 #if ENABLE(JIT) 43 44 struct StructureStubInfo;45 46 class ArrayAllocationProfile;47 class CodeBlock;48 class ExecutablePool;49 class FunctionExecutable;50 class Identifier;51 class VM;52 class JSGlobalObject;53 class JSObject;54 class JSPropertyNameIterator;55 class JSStack;56 class JSValue;57 class JSValueEncodedAsPointer;58 class LegacyProfiler;59 class NativeExecutable;60 class PropertySlot;61 class PutPropertySlot;62 class RegExp;63 class Structure;64 65 #define STUB_ARGS_DECLARATION void** args66 #define STUB_ARGS (args)67 68 #if CPU(X86)69 #if COMPILER(MSVC)70 #define JIT_STUB __fastcall71 #elif COMPILER(GCC)72 #define JIT_STUB __attribute__ ((fastcall))73 #elif COMPILER(SUNCC)74 #define JIT_STUB75 #else76 #error "JIT_STUB function calls require fastcall conventions on x86, add appropriate directive/attribute here for your compiler!"77 #endif78 #else79 #define JIT_STUB80 #endif81 82 extern "C" void ctiOpThrowNotCaught();83 extern "C" EncodedJSValue ctiTrampoline(void* code, JSStack*, CallFrame*, void* /*unused1*/, void* /*unused2*/, VM*);84 36 85 37 #if USE(MASM_PROBE) -
trunk/Source/JavaScriptCore/jit/JITStubsARM.h
r158586 r158751 42 42 namespace JSC { 43 43 44 // Also update the MSVC section (defined at DEFINE_STUB_FUNCTION)45 // when changing one of the following values.46 #define THUNK_RETURN_ADDRESS_OFFSET 6447 #define PRESERVEDR4_OFFSET 6848 49 44 #if COMPILER(GCC) 50 45 … … 151 146 #endif // USE(MASM_PROBE) 152 147 153 154 asm (155 ".text" "\n"156 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"157 HIDE_SYMBOL(ctiTrampoline) "\n"158 INLINE_ARM_FUNCTION(ctiTrampoline)159 SYMBOL_STRING(ctiTrampoline) ":" "\n"160 "stmdb sp!, {r1-r3}" "\n"161 "stmdb sp!, {r4-r6, r8-r11, lr}" "\n"162 "sub sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"163 "mov r5, r2" "\n"164 "ldr r4, [r5]" "\n"165 "str r11, [r4]" "\n"166 // r0 contains the code167 "blx r0" "\n"168 "add sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"169 "ldmia sp!, {r4-r6, r8-r11, lr}" "\n"170 "add sp, sp, #12" "\n"171 "bx lr" "\n"172 );173 174 asm (175 // Both has the same return sequence176 ".text" "\n"177 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"178 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"179 INLINE_ARM_FUNCTION(ctiOpThrowNotCaught)180 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"181 "add sp, sp, #" STRINGIZE_VALUE_OF(PRESERVEDR4_OFFSET) "\n"182 "ldmia sp!, {r4-r6, r8-r11, lr}" "\n"183 "add sp, sp, #12" "\n"184 "bx lr" "\n"185 );186 148 187 149 #if USE(MASM_PROBE) … … 333 295 334 296 335 #define DEFINE_STUB_FUNCTION(rtype, op) \336 extern "C" { \337 rtype JITStubThunked_##op(STUB_ARGS_DECLARATION); \338 }; \339 asm ( \340 ".globl " SYMBOL_STRING(cti_##op) "\n" \341 INLINE_ARM_FUNCTION(cti_##op) \342 SYMBOL_STRING(cti_##op) ":" "\n" \343 "str lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \344 "bl " SYMBOL_STRING(JITStubThunked_##op) "\n" \345 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \346 "bx lr" "\n" \347 ); \348 rtype JITStubThunked_##op(STUB_ARGS_DECLARATION)349 297 350 298 #endif // COMPILER(GCC) 351 299 352 300 #if COMPILER(RVCT) 353 354 __asm EncodedJSValue ctiTrampoline(void*, JSStack*, CallFrame*, void* /*unused1*/, void* /*unused2*/, VM*)355 {356 ARM357 stmdb sp!, {r1-r3}358 stmdb sp!, {r4-r6, r8-r11, lr}359 sub sp, sp, # PRESERVEDR4_OFFSET360 mov r5, r2361 ldr r4, [r5]362 str r11, [r4]363 mov lr, pc364 bx r0365 add sp, sp, # PRESERVEDR4_OFFSET366 ldmia sp!, {r4-r6, r8-r11, lr}367 add sp, sp, #12368 bx lr369 }370 371 __asm void ctiOpThrowNotCaught()372 {373 ARM374 add sp, sp, # PRESERVEDR4_OFFSET375 ldmia sp!, {r4-r8, lr}376 add sp, sp, #12377 bx lr378 }379 380 #define DEFINE_STUB_FUNCTION(rtype, op) rtype JITStubThunked_##op(STUB_ARGS_DECLARATION)381 382 /* The following is a workaround for RVCT toolchain; precompiler macros are not expanded before the code is passed to the assembler */383 384 /* The following section is a template to generate code for GeneratedJITStubs_RVCT.h */385 /* The pattern "#xxx#" will be replaced with "xxx" */386 387 /*388 RVCT(extern "C" #rtype# JITStubThunked_#op#(STUB_ARGS_DECLARATION);)389 RVCT(__asm #rtype# cti_#op#(STUB_ARGS_DECLARATION))390 RVCT({)391 RVCT( PRESERVE8)392 RVCT( IMPORT JITStubThunked_#op#)393 RVCT( str lr, [sp, # THUNK_RETURN_ADDRESS_OFFSET])394 RVCT( bl JITStubThunked_#op#)395 RVCT( ldr lr, [sp, # THUNK_RETURN_ADDRESS_OFFSET])396 RVCT( bx lr)397 RVCT(})398 RVCT()399 */400 301 401 302 /* Include the generated file */ … … 404 305 #endif // COMPILER(RVCT) 405 306 406 #if COMPILER(MSVC)407 408 #define DEFINE_STUB_FUNCTION(rtype, op) extern "C" rtype JITStubThunked_##op(STUB_ARGS_DECLARATION)409 410 /* The following is a workaround for MSVC toolchain; inline assembler is not supported */411 412 /* The following section is a template to generate code for GeneratedJITStubs_MSVC.asm */413 /* The pattern "#xxx#" will be replaced with "xxx" */414 415 /*416 MSVC_BEGIN( AREA Trampoline, CODE)417 MSVC_BEGIN()418 MSVC_BEGIN( EXPORT ctiTrampoline)419 MSVC_BEGIN( EXPORT ctiTrampolineEnd)420 MSVC_BEGIN( EXPORT ctiOpThrowNotCaught)421 MSVC_BEGIN( EXPORT getHostCallReturnValue)422 MSVC_BEGIN( IMPORT getHostCallReturnValueWithExecState)423 MSVC_BEGIN()424 MSVC_BEGIN(ctiTrampoline PROC)425 MSVC_BEGIN( stmdb sp!, {r1-r3})426 MSVC_BEGIN( stmdb sp!, {r4-r6, r8-r11, lr})427 MSVC_BEGIN( sub sp, sp, #68 ; sync with PRESERVEDR4_OFFSET)428 MSVC_BEGIN( mov r5, r2)429 MSVC_BEGIN( ldr r4, [r5])430 MSVC_BEGIN( str r11, [r4])431 MSVC_BEGIN( ; r0 contains the code)432 MSVC_BEGIN( mov lr, pc)433 MSVC_BEGIN( bx r0)434 MSVC_BEGIN( add sp, sp, #68 ; sync with PRESERVEDR4_OFFSET)435 MSVC_BEGIN( ldmia sp!, {r4-r6, r8-r11, lr})436 MSVC_BEGIN( add sp, sp, #12)437 MSVC_BEGIN( bx lr)438 MSVC_BEGIN(ctiTrampolineEnd)439 MSVC_BEGIN(ctiTrampoline ENDP)440 MSVC_BEGIN()441 MSVC_BEGIN(ctiOpThrowNotCaught PROC)442 MSVC_BEGIN( add sp, sp, #68 ; sync with PRESERVEDR4_OFFSET)443 MSVC_BEGIN( ldmia sp!, {r4-r6, r8-r11, lr})444 MSVC_BEGIN( add sp, sp, #12)445 MSVC_BEGIN( bx lr)446 MSVC_BEGIN(ctiOpThrowNotCaught ENDP)447 MSVC_BEGIN()448 MSVC_BEGIN(getHostCallReturnValue PROC)449 MSVC_BEGIN( ldr r5, [r5, #40])450 MSVC_BEGIN( mov r0, r5)451 MSVC_BEGIN( b getHostCallReturnValueWithExecState)452 MSVC_BEGIN(getHostCallReturnValue ENDP)453 MSVC_BEGIN()454 455 MSVC( EXPORT cti_#op#)456 MSVC( IMPORT JITStubThunked_#op#)457 MSVC(cti_#op# PROC)458 MSVC( str lr, [sp, #64] ; sync with THUNK_RETURN_ADDRESS_OFFSET)459 MSVC( bl JITStubThunked_#op#)460 MSVC( ldr lr, [sp, #64] ; sync with THUNK_RETURN_ADDRESS_OFFSET)461 MSVC( bx lr)462 MSVC(cti_#op# ENDP)463 MSVC()464 465 MSVC_END( END)466 */467 #endif // COMPILER(MSVC)468 469 307 } // namespace JSC 470 308 -
trunk/Source/JavaScriptCore/jit/JITStubsARMv7.h
r158586 r158751 42 42 namespace JSC { 43 43 44 #define THUNK_RETURN_ADDRESS_OFFSET 0x3845 #define PRESERVED_RETURN_ADDRESS_OFFSET 0x3C46 #define PRESERVED_R4_OFFSET 0x4047 #define PRESERVED_R5_OFFSET 0x4448 #define PRESERVED_R6_OFFSET 0x4849 #define PRESERVED_R7_OFFSET 0x4C50 #define PRESERVED_R8_OFFSET 0x5051 #define PRESERVED_R9_OFFSET 0x5452 #define PRESERVED_R10_OFFSET 0x5853 #define PRESERVED_R11_OFFSET 0x5C54 #define REGISTER_FILE_OFFSET 0x6055 #define FIRST_STACK_ARGUMENT 0x6856 57 44 #if COMPILER(GCC) 58 45 … … 199 186 #undef PROBE_OFFSETOF 200 187 201 #endif // USE(MASM_PROBE)202 203 204 asm (205 ".text" "\n"206 ".align 2" "\n"207 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"208 HIDE_SYMBOL(ctiTrampoline) "\n"209 ".thumb" "\n"210 ".thumb_func " THUMB_FUNC_PARAM(ctiTrampoline) "\n"211 SYMBOL_STRING(ctiTrampoline) ":" "\n"212 "sub sp, sp, #" STRINGIZE_VALUE_OF(FIRST_STACK_ARGUMENT) "\n"213 "str lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"214 "str r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"215 "str r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"216 "str r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"217 "str r7, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R7_OFFSET) "]" "\n"218 "str r8, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R8_OFFSET) "]" "\n"219 "str r9, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R9_OFFSET) "]" "\n"220 "str r10, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R10_OFFSET) "]" "\n"221 "str r11, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R11_OFFSET) "]" "\n"222 "str r1, [sp, #" STRINGIZE_VALUE_OF(REGISTER_FILE_OFFSET) "]" "\n"223 "mov r5, r2" "\n"224 "ldr r4, [r5]" "\n"225 "str r7, [r4]" "\n"226 "blx r0" "\n"227 "ldr r11, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R11_OFFSET) "]" "\n"228 "ldr r10, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R10_OFFSET) "]" "\n"229 "ldr r9, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R9_OFFSET) "]" "\n"230 "ldr r8, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R8_OFFSET) "]" "\n"231 "ldr r7, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R7_OFFSET) "]" "\n"232 "ldr r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"233 "ldr r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"234 "ldr r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"235 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"236 "add sp, sp, #" STRINGIZE_VALUE_OF(FIRST_STACK_ARGUMENT) "\n"237 "bx lr" "\n"238 );239 240 asm (241 ".text" "\n"242 ".align 2" "\n"243 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"244 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"245 ".thumb" "\n"246 ".thumb_func " THUMB_FUNC_PARAM(ctiOpThrowNotCaught) "\n"247 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"248 "ldr r11, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R11_OFFSET) "]" "\n"249 "ldr r10, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R10_OFFSET) "]" "\n"250 "ldr r9, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R9_OFFSET) "]" "\n"251 "ldr r8, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R8_OFFSET) "]" "\n"252 "ldr r7, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R7_OFFSET) "]" "\n"253 "ldr r6, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R6_OFFSET) "]" "\n"254 "ldr r5, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R5_OFFSET) "]" "\n"255 "ldr r4, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_R4_OFFSET) "]" "\n"256 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PRESERVED_RETURN_ADDRESS_OFFSET) "]" "\n"257 "add sp, sp, #" STRINGIZE_VALUE_OF(FIRST_STACK_ARGUMENT) "\n"258 "bx lr" "\n"259 );260 261 #if USE(MASM_PROBE)262 188 asm ( 263 189 ".text" "\n" … … 419 345 #endif // USE(MASM_PROBE) 420 346 421 422 #define DEFINE_STUB_FUNCTION(rtype, op) \423 extern "C" { \424 rtype JITStubThunked_##op(STUB_ARGS_DECLARATION); \425 }; \426 asm ( \427 ".text" "\n" \428 ".align 2" "\n" \429 ".globl " SYMBOL_STRING(cti_##op) "\n" \430 HIDE_SYMBOL(cti_##op) "\n" \431 ".thumb" "\n" \432 ".thumb_func " THUMB_FUNC_PARAM(cti_##op) "\n" \433 SYMBOL_STRING(cti_##op) ":" "\n" \434 "str lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \435 "bl " SYMBOL_STRING(JITStubThunked_##op) "\n" \436 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "]" "\n" \437 "bx lr" "\n" \438 ); \439 rtype JITStubThunked_##op(STUB_ARGS_DECLARATION) \440 441 347 #endif // COMPILER(GCC) 442 348 443 349 #if COMPILER(RVCT) 444 445 __asm EncodedJSValue ctiTrampoline(void*, JSStack*, CallFrame*, void* /*unused1*/, void* /*unused2*/, VM*)446 {447 PRESERVE8448 sub sp, sp, # FIRST_STACK_ARGUMENT449 str lr, [sp, # PRESERVED_RETURN_ADDRESS_OFFSET ]450 str r4, [sp, # PRESERVED_R4_OFFSET ]451 str r5, [sp, # PRESERVED_R5_OFFSET ]452 str r6, [sp, # PRESERVED_R6_OFFSET ]453 str r7, [sp, # PRESERVED_R7_OFFSET ]454 str r8, [sp, # PRESERVED_R8_OFFSET ]455 str r9, [sp, # PRESERVED_R9_OFFSET ]456 str r10, [sp, # PRESERVED_R10_OFFSET ]457 str r11, [sp, # PRESERVED_R11_OFFSET ]458 str r1, [sp, # REGISTER_FILE_OFFSET ]459 mov r5, r2460 ldr r4, [r5]461 str r7, [r4]462 blx r0463 ldr r11, [sp, # PRESERVED_R11_OFFSET ]464 ldr r10, [sp, # PRESERVED_R10_OFFSET ]465 ldr r9, [sp, # PRESERVED_R9_OFFSET ]466 ldr r8, [sp, # PRESERVED_R8_OFFSET ]467 ldr r7, [sp, # PRESERVED_R7_OFFSET ]468 ldr r6, [sp, # PRESERVED_R6_OFFSET ]469 ldr r5, [sp, # PRESERVED_R5_OFFSET ]470 ldr r4, [sp, # PRESERVED_R4_OFFSET ]471 ldr lr, [sp, # PRESERVED_RETURN_ADDRESS_OFFSET ]472 add sp, sp, # FIRST_STACK_ARGUMENT473 bx lr474 }475 476 __asm void ctiOpThrowNotCaught()477 {478 PRESERVE8479 ldr r11, [sp, # PRESERVED_R11_OFFSET ]480 ldr r10, [sp, # PRESERVED_R10_OFFSET ]481 ldr r9, [sp, # PRESERVED_R9_OFFSET ]482 ldr r8, [sp, # PRESERVED_R8_OFFSET ]483 ldr r7, [sp, # PRESERVED_R7_OFFSET ]484 ldr r6, [sp, # PRESERVED_R6_OFFSET ]485 ldr r5, [sp, # PRESERVED_R5_OFFSET ]486 ldr r4, [sp, # PRESERVED_R4_OFFSET ]487 ldr lr, [sp, # PRESERVED_RETURN_ADDRESS_OFFSET ]488 add sp, sp, # FIRST_STACK_ARGUMENT489 bx lr490 }491 492 #define DEFINE_STUB_FUNCTION(rtype, op) rtype JITStubThunked_##op(STUB_ARGS_DECLARATION)493 494 /* The following is a workaround for RVCT toolchain; precompiler macros are not expanded before the code is passed to the assembler */495 496 /* The following section is a template to generate code for GeneratedJITStubs_RVCT.h */497 /* The pattern "#xxx#" will be replaced with "xxx" */498 499 /*500 RVCT(extern "C" #rtype# JITStubThunked_#op#(STUB_ARGS_DECLARATION);)501 RVCT(__asm #rtype# cti_#op#(STUB_ARGS_DECLARATION))502 RVCT({)503 RVCT( PRESERVE8)504 RVCT( IMPORT JITStubThunked_#op#)505 RVCT( str lr, [sp, # THUNK_RETURN_ADDRESS_OFFSET])506 RVCT( bl JITStubThunked_#op#)507 RVCT( ldr lr, [sp, # THUNK_RETURN_ADDRESS_OFFSET])508 RVCT( bx lr)509 RVCT(})510 RVCT()511 */512 350 513 351 /* Include the generated file */ -
trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm
r158586 r158751 26 26 EXTERN getHostCallReturnValueWithExecState : near 27 27 28 PUBLIC ctiTrampoline29 PUBLIC ctiOpThrowNotCaught30 28 PUBLIC getHostCallReturnValue 31 29 32 30 _TEXT SEGMENT 33 34 ctiTrampoline PROC35 ; Dump register parameters to their home address36 mov qword ptr[rsp+20h], r937 mov qword ptr[rsp+18h], r838 mov qword ptr[rsp+10h], rdx39 mov qword ptr[rsp+8h], rcx40 41 push rbp42 mov rbp, rax ; Save previous frame pointer43 mov rbp, rsp44 push r1245 push r1346 push r1447 push r1548 push rbx49 50 ; JIT operations can use up to 6 args (4 in registers and 2 on the stack).51 ; In addition, X86_64 ABI specifies that the worse case stack alignment52 ; requirement is 32 bytes. Based on these factors, we need to pad the stack53 ; and additional 28h bytes.54 sub rsp, 28h55 mov r12, 51256 mov r14, 0FFFF000000000000h57 mov r15, 0FFFF000000000002h58 mov r13, r859 mov r11, qword ptr[r13] ; Put the previous frame pointer in the host call frame above us60 mov qword ptr[r11], rax61 call rcx62 add rsp, 28h63 pop rbx64 pop r1565 pop r1466 pop r1367 pop r1268 pop rbp69 ret70 ctiTrampoline ENDP71 72 ctiOpThrowNotCaught PROC73 add rsp, 28h74 pop rbx75 pop r1576 pop r1477 pop r1378 pop r1279 pop rbp80 ret81 ctiOpThrowNotCaught ENDP82 31 83 32 getHostCallReturnValue PROC -
trunk/Source/JavaScriptCore/jit/JITStubsX86.h
r158586 r158751 46 46 #if COMPILER(GCC) 47 47 48 asm (49 ".text\n"50 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"51 HIDE_SYMBOL(ctiTrampoline) "\n"52 SYMBOL_STRING(ctiTrampoline) ":" "\n"53 "pushl %ebp" "\n"54 "movl %ebp, %eax" "\n" // Save previous frame pointer55 "movl %esp, %ebp" "\n"56 "pushl %esi" "\n"57 "pushl %edi" "\n"58 "pushl %ebx" "\n"59 60 // JIT Operation can use up to 6 arguments right now. So, we need to61 // reserve space in this stack frame for the out-going args. To ensure that62 // the stack remains aligned on an 16 byte boundary, we round the padding up63 // by 0x1c bytes.64 "subl $0x1c, %esp" "\n"65 "movl 0x38(%esp), %edi" "\n"66 "movl (%edi), %ebx" "\n" // Put the previous frame pointer in the VM entry sentinal frame above us67 "movl %eax, (%ebx)" "\n"68 "call *0x30(%esp)" "\n"69 "addl $0x1c, %esp" "\n"70 71 "popl %ebx" "\n"72 "popl %edi" "\n"73 "popl %esi" "\n"74 "popl %ebp" "\n"75 "ret" "\n"76 );77 78 asm (79 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"80 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"81 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"82 "addl $0x1c, %esp" "\n"83 "popl %ebx" "\n"84 "popl %edi" "\n"85 "popl %esi" "\n"86 "popl %ebp" "\n"87 "ret" "\n"88 );89 90 48 #if USE(MASM_PROBE) 91 49 asm ( … … 243 201 #endif // COMPILER(GCC) 244 202 245 #if COMPILER(MSVC)246 247 extern "C" {248 249 __declspec(naked) EncodedJSValue ctiTrampoline(void* code, JSStack*, CallFrame*, void* /*unused1*/, void* /*unused2*/, VM*)250 {251 __asm {252 push ebp;253 mov eax, ebp;254 mov ebp, esp;255 push esi;256 push edi;257 push ebx;258 sub esp, 0x1c;259 mov ecx, esp;260 mov edi, [esp + 0x38];261 mov ebx, [edi];262 mov [ebx], eax;263 call [esp + 0x30];264 add esp, 0x1c;265 pop ebx;266 pop edi;267 pop esi;268 pop ebp;269 ret;270 }271 }272 273 __declspec(naked) void ctiOpThrowNotCaught()274 {275 __asm {276 add esp, 0x1c;277 pop ebx;278 pop edi;279 pop esi;280 pop ebp;281 ret;282 }283 }284 }285 286 #endif // COMPILER(MSVC)287 288 203 } // namespace JSC 289 204 -
trunk/Source/JavaScriptCore/jit/JITStubsX86_64.h
r158586 r158751 46 46 #if COMPILER(GCC) 47 47 48 asm (49 ".text\n"50 ".globl " SYMBOL_STRING(ctiTrampoline) "\n"51 HIDE_SYMBOL(ctiTrampoline) "\n"52 SYMBOL_STRING(ctiTrampoline) ":" "\n"53 "pushq %rbp" "\n"54 "movq %rbp, %rax" "\n" // Save previous frame pointer55 "movq %rsp, %rbp" "\n"56 "pushq %r12" "\n"57 "pushq %r13" "\n"58 "pushq %r14" "\n"59 "pushq %r15" "\n"60 "pushq %rbx" "\n"61 62 // The X86_64 ABI specifies that the worse case stack alignment requirement63 // is 32 bytes.64 "subq $0x8, %rsp" "\n"65 66 "movq $512, %r12" "\n"67 "movq $0xFFFF000000000000, %r14" "\n"68 "movq $0xFFFF000000000002, %r15" "\n"69 "movq %rdx, %r13" "\n"70 "movq (%r13), %r11" "\n" // Put the previous frame pointer in the VM entry sentinal frame above us71 "movq %rax, (%r11)" "\n"72 "call *%rdi" "\n"73 "addq $0x8, %rsp" "\n"74 "popq %rbx" "\n"75 "popq %r15" "\n"76 "popq %r14" "\n"77 "popq %r13" "\n"78 "popq %r12" "\n"79 "popq %rbp" "\n"80 "ret" "\n"81 );82 83 asm (84 ".globl " SYMBOL_STRING(ctiOpThrowNotCaught) "\n"85 HIDE_SYMBOL(ctiOpThrowNotCaught) "\n"86 SYMBOL_STRING(ctiOpThrowNotCaught) ":" "\n"87 "addq $0x8, %rsp" "\n"88 "popq %rbx" "\n"89 "popq %r15" "\n"90 "popq %r14" "\n"91 "popq %r13" "\n"92 "popq %r12" "\n"93 "popq %rbp" "\n"94 "ret" "\n"95 );96 97 48 #if USE(MASM_PROBE) 98 49 asm ( -
trunk/Source/JavaScriptCore/jit/JSInterfaceJIT.h
r158677 r158751 125 125 static const RegisterID regT5 = ARMRegisters::r8; 126 126 127 // Update ctiTrampoline in JITStubs.cpp if these values are changed!128 127 static const RegisterID callFrameRegister = ARMRegisters::r5; 129 128 -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r158315 r158751 55 55 UNUSED_PARAM(pointerGPR); 56 56 #endif 57 } 58 59 static void returnFromJavaScript(CCallHelpers& jit) 60 { 61 #if CPU(X86_64) 62 #if OS(WINDOWS) 63 // JIT operations can use up to 6 args (4 in registers and 2 on the stack). 64 // In addition, X86_64 ABI specifies that the worse case stack alignment 65 // requirement is 32 bytes. Based on these factors, we need to pad the stack 66 // and additional 40 bytes. 67 # define EXTRA_STACK_SIZE 40 68 jit.addPtr(CCallHelpers::TrustedImm32(8), X86Registers::esp); 69 #else 70 // We don't need extra stack space for out-going args, but we need to align the 71 // stack to 32 byte alignment, therefore add 8 bytes to the stack. 72 # define EXTRA_STACK_SIZE 8 73 jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp); 74 #endif 75 76 jit.pop(X86Registers::ebx); 77 jit.pop(X86Registers::r15); 78 jit.pop(X86Registers::r14); 79 jit.pop(X86Registers::r13); 80 jit.pop(X86Registers::r12); 81 jit.pop(X86Registers::ebp); 82 #elif CPU(X86) 83 // JIT Operation can use up to 6 arguments right now. So, we need to 84 // reserve space in this stack frame for the out-going args. To ensure that 85 // the stack remains aligned on an 16 byte boundary, we round the padding up 86 // by 28 bytes. 87 # define EXTRA_STACK_SIZE 28 88 89 jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp); 90 91 jit.pop(X86Registers::ebx); 92 jit.pop(X86Registers::edi); 93 jit.pop(X86Registers::esi); 94 jit.pop(X86Registers::ebp); 95 #elif CPU(ARM_TRADITIONAL) 96 // JIT Operation can use up to 6 arguments right now. So, we need to 97 // reserve space in this stack frame for the out-going args. We need to 98 // add space for 16 more bytes. 99 # define EXTRA_STACK_SIZE 16 100 101 jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 102 103 jit.pop(ARMRegisters::lr); 104 jit.pop(ARMRegisters::r11); 105 jit.pop(ARMRegisters::r10); 106 jit.pop(ARMRegisters::r9); 107 jit.pop(ARMRegisters::r8); 108 jit.pop(ARMRegisters::r6); 109 jit.pop(ARMRegisters::r5); 110 jit.pop(ARMRegisters::r4); 111 #elif CPU(ARM_THUMB2) 112 // JIT Operation can use up to 6 arguments right now. So, we need to 113 // reserve space in this stack frame for the out-going args. To ensure that 114 // the stack remains aligned on an 16 byte boundary, we round the padding up 115 // by 28 bytes. 116 # define EXTRA_STACK_SIZE 28 117 118 jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 119 jit.push(ARMRegisters::r11); 120 jit.push(ARMRegisters::r10); 121 jit.push(ARMRegisters::r9); 122 jit.push(ARMRegisters::r8); 123 jit.push(ARMRegisters::r7); 124 jit.push(ARMRegisters::r6); 125 jit.push(ARMRegisters::r5); 126 jit.push(ARMRegisters::r4); 127 jit.push(ARMRegisters::lr); 128 #elif CPU(ARM64) 129 jit.pop(ARM64Registers::x28); 130 jit.pop(ARM64Registers::x27); 131 jit.pop(ARM64Registers::x26); 132 jit.pop(ARM64Registers::x25); 133 jit.pop(ARM64Registers::x24); 134 jit.pop(ARM64Registers::x23); 135 jit.pop(ARM64Registers::x22); 136 jit.pop(ARM64Registers::x21); 137 jit.pop(ARM64Registers::x20); 138 jit.pop(ARM64Registers::x19); 139 jit.pop(ARM64Registers::lr); 140 #elif CPU(MIPS) 141 # define PRESERVED_GP_OFFSET 60 142 # define PRESERVED_S0_OFFSET 64 143 # define PRESERVED_S1_OFFSET 68 144 # define PRESERVED_S2_OFFSET 72 145 # define PRESERVED_S3_OFFSET 76 146 # define PRESERVED_S4_OFFSET 80 147 # define PRESERVED_RETURN_ADDRESS_OFFSET 84 148 # define STACK_LENGTH 112 149 150 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S0_OFFSET), MIPSRegisters::s0); 151 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S1_OFFSET), MIPSRegisters::s1); 152 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S2_OFFSET), MIPSRegisters::s2); 153 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S3_OFFSET), MIPSRegisters::s3); 154 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S4_OFFSET), MIPSRegisters::s4); 155 jit.loadPtr(CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_RETURN_ADDRESS_OFFSET), MIPSRegisters::ra); 156 jit.addPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp); 157 #elif CPU(SH4) 158 # define EXTRA_STACK_SIZE 20 159 160 jit.addPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), SH4Registers::sp); 161 jit.pop(SH4Registers::r8); 162 jit.pop(SH4Registers::r9); 163 jit.pop(SH4Registers::r10); 164 jit.pop(SH4Registers::r11); 165 jit.pop(SH4Registers::r13); 166 jit.pop(SH4Registers::pr); 167 jit.pop(SH4Registers::fp); 168 #endif 169 170 jit.ret(); 171 } 172 173 MacroAssemblerCodeRef callToJavaScript(VM* vm) 174 { 175 // The signature of the code generated is EncodedJSValue callToJavaScript(void* code, CallFrame*) 176 177 CCallHelpers jit(vm); 178 179 #if CPU(X86_64) 180 #if OS(WINDOWS) 181 // Dump register parameters to their home address 182 jit.storePtr(X86Registers::r9, CCallHelpers::Address(X86Registers::esp, 0x20)); 183 jit.storePtr(X86Registers::r8, CCallHelpers::Address(X86Registers::esp, 0x18)); 184 jit.storePtr(X86Registers::edx, CCallHelpers::Address(X86Registers::esp, 0x10)); 185 jit.storePtr(X86Registers::ecx, CCallHelpers::Address(X86Registers::esp, 0x8)); 186 #endif // OS(WINDOWS) 187 jit.push(X86Registers::ebp); 188 jit.move(X86Registers::ebp, GPRInfo::nonArgGPR0); 189 jit.move(X86Registers::esp, X86Registers::ebp); 190 jit.push(X86Registers::r12); 191 jit.push(X86Registers::r13); 192 jit.push(X86Registers::r14); 193 jit.push(X86Registers::r15); 194 jit.push(X86Registers::ebx); 195 196 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp); 197 198 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 199 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 200 #elif CPU(X86) 201 jit.push(X86Registers::ebp); 202 jit.move(X86Registers::ebp, GPRInfo::nonArgGPR0); 203 jit.move(X86Registers::esp, X86Registers::ebp); 204 jit.push(X86Registers::esi); 205 jit.push(X86Registers::edi); 206 jit.push(X86Registers::ebx); 207 208 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), X86Registers::esp); 209 #if COMPILER(MSVC) 210 jit.move(X86Registers::esp, X86Registers::ecx); 211 #endif 212 213 jit.load32(CCallHelpers::Address(X86Registers::esp, EXTRA_STACK_SIZE + 24), GPRInfo::callFrameRegister); 214 215 # define CALLFRAME_SRC_REG GPRInfo::callFrameRegister 216 # define CALL_CODE jit.call(CCallHelpers::Address(X86Registers::esp, EXTRA_STACK_SIZE + 20)) 217 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 218 #elif CPU(ARM_TRADITIONAL) 219 jit.push(ARMRegisters::r4); 220 jit.push(ARMRegisters::r5); 221 jit.push(ARMRegisters::r6); 222 jit.push(ARMRegisters::r8); 223 jit.push(ARMRegisters::r9); 224 jit.push(ARMRegisters::r10); 225 jit.push(ARMRegisters::r11); 226 jit.push(ARMRegisters::lr); 227 228 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 229 230 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 231 # define PREVIOUS_CALLFRAME_REG ARMRegisters::r11 232 #elif CPU(ARM_THUMB2) 233 jit.push(ARMRegisters::lr); 234 jit.push(ARMRegisters::r4); 235 jit.push(ARMRegisters::r5); 236 jit.push(ARMRegisters::r6); 237 jit.push(ARMRegisters::r7); 238 jit.push(ARMRegisters::r8); 239 jit.push(ARMRegisters::r9); 240 jit.push(ARMRegisters::r10); 241 jit.push(ARMRegisters::r11); 242 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), ARMRegisters::sp); 243 244 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 245 # define PREVIOUS_CALLFRAME_REG ARMRegisters::r7 246 #elif CPU(ARM64) 247 jit.push(ARM64Registers::lr); 248 jit.push(ARM64Registers::x19); 249 jit.push(ARM64Registers::x20); 250 jit.push(ARM64Registers::x21); 251 jit.push(ARM64Registers::x22); 252 jit.push(ARM64Registers::x23); 253 jit.push(ARM64Registers::x24); 254 jit.push(ARM64Registers::x25); 255 jit.push(ARM64Registers::x26); 256 jit.push(ARM64Registers::x27); 257 jit.push(ARM64Registers::x28); 258 jit.push(ARM64Registers::x29); 259 260 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 261 # define PREVIOUS_CALLFRAME_REG ARM64Registers::x29 262 #elif CPU(MIPS) 263 jit.subPtr(CCallHelpers::TrustedImm32(STACK_LENGTH), MIPSRegisters::sp); 264 jit.storePtr(MIPSRegisters::ra, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_RETURN_ADDRESS_OFFSET)); 265 jit.storePtr(MIPSRegisters::s4, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S4_OFFSET)); 266 jit.storePtr(MIPSRegisters::s3, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S3_OFFSET)); 267 jit.storePtr(MIPSRegisters::s2, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S2_OFFSET)); 268 jit.storePtr(MIPSRegisters::s1, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S1_OFFSET)); 269 jit.storePtr(MIPSRegisters::s0, CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_S0_OFFSET)); 270 #if WTF_MIPS_PIC 271 jit.storePtr(MIPSRegisters::gp), CCallHelpers::Address(MIPSRegisters::sp, PRESERVED_GP_OFFSET)); 272 #endif 273 274 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 275 # define PREVIOUS_CALLFRAME_REG MIPSRegisters::fp 276 #elif CPU(SH4) 277 jit.push(SH4Registers::fp); 278 jit.push(SH4Registers::pr); 279 jit.push(SH4Registers::r13); 280 jit.push(SH4Registers::r11); 281 jit.push(SH4Registers::r10); 282 jit.push(SH4Registers::r9); 283 jit.push(SH4Registers::r8); 284 jit.subPtr(CCallHelpers::TrustedImm32(EXTRA_STACK_SIZE), SH4Registers::sp); 285 jit.move(SH4Registers::fp, GPRInfo::nonArgGPR0); 286 287 # define CALLFRAME_SRC_REG GPRInfo::argumentGPR1 288 # define PREVIOUS_CALLFRAME_REG GPRInfo::nonArgGPR0 289 #endif 290 291 if (CALLFRAME_SRC_REG != GPRInfo::callFrameRegister) 292 jit.move(CALLFRAME_SRC_REG, GPRInfo::callFrameRegister); 293 jit.loadPtr(CCallHelpers::Address(GPRInfo::callFrameRegister), GPRInfo::nonArgGPR1); 294 jit.storePtr(PREVIOUS_CALLFRAME_REG, CCallHelpers::Address(GPRInfo::nonArgGPR1)); 295 296 #if USE(JSVALUE64) 297 jit.move(CCallHelpers::TrustedImm64(0xffff000000000000L), GPRInfo::tagTypeNumberRegister); 298 jit.move(CCallHelpers::TrustedImm64(0xffff000000000002L), GPRInfo::tagMaskRegister); 299 #endif 300 301 #if defined(CALL_CODE) 302 CALL_CODE; 303 #else 304 jit.call(GPRInfo::argumentGPR0); 305 #endif 306 307 #undef CALLFRAME_SRC_REG 308 #undef CALL_CODE 309 #undef PREVIOUS_CALLFRAME_REG 310 311 returnFromJavaScript(jit); 312 313 LinkBuffer patchBuffer(*vm, &jit, GLOBAL_THUNK_ID); 314 return FINALIZE_CODE(patchBuffer, ("Call to JavaScript thunk")); 315 } 316 317 MacroAssemblerCodeRef throwNotCaught(VM* vm) 318 { 319 CCallHelpers jit(vm); 320 321 returnFromJavaScript(jit); 322 323 LinkBuffer patchBuffer(*vm, &jit, GLOBAL_THUNK_ID); 324 return FINALIZE_CODE(patchBuffer, ("Uncaught throw thunk")); 57 325 } 58 326 -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.h
r157480 r158751 31 31 #if ENABLE(JIT) 32 32 namespace JSC { 33 34 MacroAssemblerCodeRef callToJavaScript(VM*); 35 MacroAssemblerCodeRef throwNotCaught(VM*); 33 36 34 37 MacroAssemblerCodeRef throwExceptionFromCallSlowPathGenerator(VM*); -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r158586 r158751 258 258 #if ENABLE(JIT) 259 259 jitStubs = adoptPtr(new JITThunks()); 260 261 callJavaScriptJITFunction = reinterpret_cast<CallJavaScriptJITFunction>(getCTIStub(callToJavaScript).code().executableAddress()); 260 262 #endif 261 263 -
trunk/Source/JavaScriptCore/runtime/VM.h
r158384 r158751 330 330 } 331 331 NativeExecutable* getHostFunction(NativeFunction, Intrinsic); 332 333 typedef EncodedJSValue(*CallJavaScriptJITFunction)(void *, ExecState*); 334 335 CallJavaScriptJITFunction callJavaScriptJITFunction; 332 336 #endif 333 337 #if ENABLE(FTL_JIT)
Note: See TracChangeset
for help on using the changeset viewer.