Changeset 215592 in webkit
- Timestamp:
- Apr 20, 2017 4:55:45 PM (7 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r215584 r215592 1 2017-04-20 Mark Lam <mark.lam@apple.com> 2 3 Update the MASM probe to only take 1 arg instead of 2 (in addition to the callback function). 4 https://bugs.webkit.org/show_bug.cgi?id=171088 5 6 Reviewed by Michael Saboff and Saam Barati. 7 8 Experience shows that we never use the 2nd arg. So, let's remove it to reduce 9 the footprint at each probe site. 10 11 Also fix the MacroAssembler::print() function so that it is a no-op when 12 !ENABLE(MASM_PROBE). This will allow us to have print() statements in JIT code 13 without a lot of #if ENABLE(MASM_PROBE)s later. 14 15 * assembler/AbstractMacroAssembler.h: 16 * assembler/MacroAssembler.cpp: 17 (JSC::stdFunctionCallback): 18 (JSC::MacroAssembler::probe): 19 * assembler/MacroAssembler.h: 20 * assembler/MacroAssemblerARM.cpp: 21 (JSC::MacroAssemblerARM::probe): 22 * assembler/MacroAssemblerARM.h: 23 * assembler/MacroAssemblerARM64.cpp: 24 (JSC::MacroAssemblerARM64::probe): 25 * assembler/MacroAssemblerARM64.h: 26 * assembler/MacroAssemblerARMv7.cpp: 27 (JSC::MacroAssemblerARMv7::probe): 28 * assembler/MacroAssemblerARMv7.h: 29 * assembler/MacroAssemblerPrinter.cpp: 30 (JSC::MacroAssemblerPrinter::printCallback): 31 * assembler/MacroAssemblerPrinter.h: 32 (JSC::MacroAssemblerPrinter::print): 33 (JSC::MacroAssembler::print): 34 * assembler/MacroAssemblerX86Common.cpp: 35 (JSC::MacroAssemblerX86Common::probe): 36 * assembler/MacroAssemblerX86Common.h: 37 1 38 2017-04-20 Matt Baker <mattbaker@apple.com> 2 39 -
trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
r215565 r215592 923 923 // This prototype is only provided here to document the interface. 924 924 925 void probe(ProbeFunction, void* arg 1, void* arg2);925 void probe(ProbeFunction, void* arg); 926 926 927 927 #endif // ENABLE(MASM_PROBE) -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.cpp
r215196 r215592 38 38 static void stdFunctionCallback(ProbeContext* context) 39 39 { 40 auto func = static_cast<const std::function<void(ProbeContext*)>*>(context->arg 1);40 auto func = static_cast<const std::function<void(ProbeContext*)>*>(context->arg); 41 41 (*func)(context); 42 42 } … … 44 44 void MacroAssembler::probe(std::function<void(ProbeContext*)> func) 45 45 { 46 probe(stdFunctionCallback, new std::function<void(ProbeContext*)>(func) , 0);46 probe(stdFunctionCallback, new std::function<void(ProbeContext*)>(func)); 47 47 } 48 48 #endif // ENABLE(MASM_PROBE) -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r215196 r215592 1814 1814 using MacroAssemblerBase::probe; 1815 1815 1816 void probe(std::function<void(ProbeContext*)>); 1817 #endif 1818 1816 1819 // Let's you print from your JIT generated code. 1820 // This only works if ENABLE(MASM_PROBE). Otherwise, print() is a no-op. 1817 1821 // See comments in MacroAssemblerPrinter.h for examples of how to use this. 1818 1822 template<typename... Arguments> 1819 1823 void print(Arguments... args); 1820 1821 void probe(std::function<void (ProbeContext*)>);1822 #endif1823 1824 }; 1824 1825 … … 1830 1831 1831 1832 ProbeFunction probeFunction; 1832 void* arg1; 1833 void* arg2; 1833 void* arg; 1834 1834 CPUState cpu; 1835 1835 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.cpp
r215196 r215592 108 108 #define PTR_SIZE 4 109 109 #define PROBE_PROBE_FUNCTION_OFFSET (0 * PTR_SIZE) 110 #define PROBE_ARG1_OFFSET (1 * PTR_SIZE) 111 #define PROBE_ARG2_OFFSET (2 * PTR_SIZE) 112 113 #define PROBE_FIRST_GPREG_OFFSET (4 * PTR_SIZE) 110 #define PROBE_ARG_OFFSET (1 * PTR_SIZE) 111 112 #define PROBE_FIRST_GPREG_OFFSET (2 * PTR_SIZE) 114 113 115 114 #define GPREG_SIZE 4 … … 155 154 156 155 #define PROBE_SIZE (PROBE_FIRST_FPREG_OFFSET + (16 * FPREG_SIZE)) 156 #define PROBE_ALIGNED_SIZE (PROBE_SIZE) 157 157 158 158 // These ASSERTs remind you that if you change the layout of ProbeContext, … … 160 160 #define PROBE_OFFSETOF(x) offsetof(struct ProbeContext, x) 161 161 COMPILE_ASSERT(PROBE_OFFSETOF(probeFunction) == PROBE_PROBE_FUNCTION_OFFSET, ProbeContext_probeFunction_offset_matches_ctiMasmProbeTrampoline); 162 COMPILE_ASSERT(PROBE_OFFSETOF(arg1) == PROBE_ARG1_OFFSET, ProbeContext_arg1_offset_matches_ctiMasmProbeTrampoline); 163 COMPILE_ASSERT(PROBE_OFFSETOF(arg2) == PROBE_ARG2_OFFSET, ProbeContext_arg2_offset_matches_ctiMasmProbeTrampoline); 162 COMPILE_ASSERT(PROBE_OFFSETOF(arg) == PROBE_ARG_OFFSET, ProbeContext_arg_offset_matches_ctiMasmProbeTrampoline); 163 164 COMPILE_ASSERT(!(PROBE_CPU_R0_OFFSET & 0x3), ProbeContext_cpu_r0_offset_should_be_4_byte_aligned); 164 165 165 166 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.r0) == PROBE_CPU_R0_OFFSET, ProbeContext_cpu_r0_offset_matches_ctiMasmProbeTrampoline); … … 183 184 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.fpscr) == PROBE_CPU_FPSCR_OFFSET, ProbeContext_cpu_fpscr_offset_matches_ctiMasmProbeTrampoline); 184 185 186 COMPILE_ASSERT(!(PROBE_CPU_D0_OFFSET & 0xf), ProbeContext_cpu_d0_offset_should_be_16_byte_aligned); 187 185 188 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d0) == PROBE_CPU_D0_OFFSET, ProbeContext_cpu_d0_offset_matches_ctiMasmProbeTrampoline); 186 189 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d1) == PROBE_CPU_D1_OFFSET, ProbeContext_cpu_d1_offset_matches_ctiMasmProbeTrampoline); … … 199 202 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d14) == PROBE_CPU_D14_OFFSET, ProbeContext_cpu_d14_offset_matches_ctiMasmProbeTrampoline); 200 203 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d15) == PROBE_CPU_D15_OFFSET, ProbeContext_cpu_d15_offset_matches_ctiMasmProbeTrampoline); 204 201 205 COMPILE_ASSERT(sizeof(ProbeContext) == PROBE_SIZE, ProbeContext_size_matches_ctiMasmProbeTrampoline); 206 COMPILE_ASSERT(!(PROBE_ALIGNED_SIZE & 0xf), ProbeContext_aligned_size_offset_should_be_16_byte_aligned); 202 207 #undef PROBE_OFFSETOF 203 208 … … 212 217 // The top of stack now looks like this: 213 218 // esp[0 * ptrSize]: probeFunction 214 // esp[1 * ptrSize]: arg1 215 // esp[2 * ptrSize]: arg2 216 // esp[3 * ptrSize]: saved r3 / S0 217 // esp[4 * ptrSize]: saved ip 218 // esp[5 * ptrSize]: saved lr 219 // esp[6 * ptrSize]: saved sp 219 // esp[1 * ptrSize]: arg 220 // esp[2 * ptrSize]: saved r3 / S0 221 // esp[3 * ptrSize]: saved ip 222 // esp[4 * ptrSize]: saved lr 223 // esp[5 * ptrSize]: saved sp 220 224 221 225 "mov ip, sp" "\n" 222 226 "mov r3, sp" "\n" 223 "sub r3, r3, #" STRINGIZE_VALUE_OF(PROBE_ SIZE) "\n"227 "sub r3, r3, #" STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) "\n" 224 228 225 229 // The ARM EABI specifies that the stack needs to be 16 byte aligned. … … 238 242 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_PROBE_FUNCTION_OFFSET) "]" "\n" 239 243 "ldr lr, [ip, #1 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 240 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG 1_OFFSET) "]" "\n"244 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG_OFFSET) "]" "\n" 241 245 "ldr lr, [ip, #2 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 242 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ ARG2_OFFSET) "]" "\n"246 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_R3_OFFSET) "]" "\n" 243 247 "ldr lr, [ip, #3 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 244 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_ R3_OFFSET) "]" "\n"248 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_IP_OFFSET) "]" "\n" 245 249 "ldr lr, [ip, #4 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 246 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_ IP_OFFSET) "]" "\n"250 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n" 247 251 "ldr lr, [ip, #5 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 248 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n"249 "ldr lr, [ip, #6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n"250 252 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 251 253 … … 348 350 #endif // COMPILER(GCC_OR_CLANG) 349 351 350 void MacroAssemblerARM::probe(ProbeFunction function, void* arg 1, void* arg2)352 void MacroAssemblerARM::probe(ProbeFunction function, void* arg) 351 353 { 352 354 push(RegisterID::sp); … … 355 357 push(RegisterID::S0); 356 358 // The following uses RegisterID::S0. So, they must come after we push S0 above. 357 push(trustedImm32FromPtr(arg2)); 358 push(trustedImm32FromPtr(arg1)); 359 push(trustedImm32FromPtr(arg)); 359 360 push(trustedImm32FromPtr(function)); 360 361 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
r214220 r215592 1560 1560 1561 1561 #if ENABLE(MASM_PROBE) 1562 void probe(ProbeFunction, void* arg 1, void* arg2);1562 void probe(ProbeFunction, void* arg); 1563 1563 #endif // ENABLE(MASM_PROBE) 1564 1564 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp
r215196 r215592 45 45 #define PTR_SIZE 8 46 46 #define PROBE_PROBE_FUNCTION_OFFSET (0 * PTR_SIZE) 47 #define PROBE_ARG1_OFFSET (1 * PTR_SIZE) 48 #define PROBE_ARG2_OFFSET (2 * PTR_SIZE) 49 50 #define PROBE_FIRST_GPREG_OFFSET (3 * PTR_SIZE) 47 #define PROBE_ARG_OFFSET (1 * PTR_SIZE) 48 49 #define PROBE_FIRST_GPREG_OFFSET (2 * PTR_SIZE) 51 50 52 51 #define GPREG_SIZE 8 … … 126 125 #define SAVED_CALLER_SP PROBE_SIZE 127 126 #define PROBE_SIZE_PLUS_SAVED_CALLER_SP (SAVED_CALLER_SP + PTR_SIZE) 127 #define PROBE_ALIGNED_SIZE (PROBE_SIZE_PLUS_SAVED_CALLER_SP) 128 128 129 129 // These ASSERTs remind you that if you change the layout of ProbeContext, … … 131 131 #define PROBE_OFFSETOF(x) offsetof(struct ProbeContext, x) 132 132 COMPILE_ASSERT(PROBE_OFFSETOF(probeFunction) == PROBE_PROBE_FUNCTION_OFFSET, ProbeContext_probeFunction_offset_matches_ctiMasmProbeTrampoline); 133 COMPILE_ASSERT(PROBE_OFFSETOF(arg1) == PROBE_ARG1_OFFSET, ProbeContext_arg1_offset_matches_ctiMasmProbeTrampoline); 134 COMPILE_ASSERT(PROBE_OFFSETOF(arg2) == PROBE_ARG2_OFFSET, ProbeContext_arg2_offset_matches_ctiMasmProbeTrampoline); 133 COMPILE_ASSERT(PROBE_OFFSETOF(arg) == PROBE_ARG_OFFSET, ProbeContext_arg_offset_matches_ctiMasmProbeTrampoline); 134 135 COMPILE_ASSERT(!(PROBE_CPU_X0_OFFSET & 0x7), ProbeContext_cpu_r0_offset_should_be_8_byte_aligned); 135 136 136 137 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.x0) == PROBE_CPU_X0_OFFSET, ProbeContext_cpu_x0_offset_matches_ctiMasmProbeTrampoline); … … 172 173 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.fpsr) == PROBE_CPU_FPSR_OFFSET, ProbeContext_cpu_fpsr_offset_matches_ctiMasmProbeTrampoline); 173 174 175 COMPILE_ASSERT(!(PROBE_CPU_Q0_OFFSET & 0x7), ProbeContext_cpu_q0_offset_should_be_8_byte_aligned); 176 174 177 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.q0) == PROBE_CPU_Q0_OFFSET, ProbeContext_cpu_q0_offset_matches_ctiMasmProbeTrampoline); 175 178 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.q1) == PROBE_CPU_Q1_OFFSET, ProbeContext_cpu_q1_offset_matches_ctiMasmProbeTrampoline); … … 207 210 208 211 COMPILE_ASSERT(sizeof(ProbeContext) == PROBE_SIZE, ProbeContext_size_matches_ctiMasmProbeTrampoline); 212 COMPILE_ASSERT(!(PROBE_ALIGNED_SIZE & 0xf), ProbeContext_aligned_size_offset_should_be_16_byte_aligned); 209 213 210 214 #undef PROBE_OFFSETOF … … 221 225 // sp[0 * ptrSize]: probeFunction 222 226 // sp[1 * ptrSize]: arg1 223 // sp[2 * ptrSize]: arg2 224 // sp[3 * ptrSize]: address of arm64ProbeTrampoline() 225 // sp[4 * ptrSize]: saved x27 226 // sp[5 * ptrSize]: saved x28 227 // sp[6 * ptrSize]: saved lr 228 // sp[7 * ptrSize]: saved sp 227 // sp[2 * ptrSize]: address of arm64ProbeTrampoline() 228 // sp[3 * ptrSize]: saved x27 229 // sp[4 * ptrSize]: saved x28 230 // sp[5 * ptrSize]: saved lr 231 // sp[6 * ptrSize]: saved sp 229 232 230 233 "mov x27, sp" "\n" 231 234 "mov x28, sp" "\n" 232 235 233 "sub x28, x28, #" STRINGIZE_VALUE_OF(PROBE_ SIZE_PLUS_SAVED_CALLER_SP) "\n"236 "sub x28, x28, #" STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) "\n" 234 237 235 238 // The ARM EABI specifies that the stack needs to be 16 byte aligned. … … 267 270 "str x26, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X26_OFFSET) "]" "\n" 268 271 272 "ldr x0, [x27, #3 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 273 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" 269 274 "ldr x0, [x27, #4 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 270 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" 275 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X28_OFFSET) "]" "\n" 276 277 "str fp, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" 278 271 279 "ldr x0, [x27, #5 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 272 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X28_OFFSET) "]" "\n" 273 274 "str fp, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" 275 280 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n" 276 281 "ldr x0, [x27, #6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 277 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n"278 "ldr x0, [x27, #7 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n"279 282 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 280 283 … … 289 292 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_PROBE_FUNCTION_OFFSET) "]" "\n" 290 293 "ldr x0, [x27, #1 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 291 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG1_OFFSET) "]" "\n" 292 "ldr x0, [x27, #2 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 293 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG2_OFFSET) "]" "\n" 294 "str x0, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG_OFFSET) "]" "\n" 294 295 295 296 "str d0, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_Q0_OFFSET) "]" "\n" … … 472 473 } 473 474 474 void MacroAssemblerARM64::probe(ProbeFunction function, void* arg 1, void* arg2)475 void MacroAssemblerARM64::probe(ProbeFunction function, void* arg) 475 476 { 476 sub64(TrustedImm32( 8* 8), sp);477 478 store64(x27, Address(sp, 4* 8));479 store64(x28, Address(sp, 5* 8));480 store64(lr, Address(sp, 6* 8));481 482 add64(TrustedImm32( 8* 8), sp, x28);483 store64(x28, Address(sp, 7* 8)); // Save original sp value.477 sub64(TrustedImm32(7 * 8), sp); 478 479 store64(x27, Address(sp, 3 * 8)); 480 store64(x28, Address(sp, 4 * 8)); 481 store64(lr, Address(sp, 5 * 8)); 482 483 add64(TrustedImm32(7 * 8), sp, x28); 484 store64(x28, Address(sp, 6 * 8)); // Save original sp value. 484 485 485 486 move(TrustedImmPtr(reinterpret_cast<void*>(function)), x28); 486 487 store64(x28, Address(sp)); 487 move(TrustedImmPtr(arg 1), x28);488 move(TrustedImmPtr(arg), x28); 488 489 store64(x28, Address(sp, 1 * 8)); 489 move(TrustedImmPtr( arg2), x28);490 move(TrustedImmPtr(reinterpret_cast<void*>(arm64ProbeTrampoline)), x28); 490 491 store64(x28, Address(sp, 2 * 8)); 491 move(TrustedImmPtr(reinterpret_cast<void*>(arm64ProbeTrampoline)), x28);492 store64(x28, Address(sp, 3 * 8));493 492 494 493 move(TrustedImmPtr(reinterpret_cast<void*>(ctiMasmProbeTrampoline)), x28); … … 497 496 // ctiMasmProbeTrampoline should have restored every register except for 498 497 // lr and the sp. 499 load64(Address(sp, 6* 8), lr);500 add64(TrustedImm32( 8* 8), sp);498 load64(Address(sp, 5 * 8), lr); 499 add64(TrustedImm32(7 * 8), sp); 501 500 } 502 501 #endif // ENABLE(MASM_PROBE) -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r215565 r215592 3764 3764 3765 3765 #if ENABLE(MASM_PROBE) 3766 void probe(ProbeFunction, void* arg 1, void* arg2);3766 void probe(ProbeFunction, void* arg); 3767 3767 #endif // ENABLE(MASM_PROBE) 3768 3768 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.cpp
r215196 r215592 44 44 #define PTR_SIZE 4 45 45 #define PROBE_PROBE_FUNCTION_OFFSET (0 * PTR_SIZE) 46 #define PROBE_ARG1_OFFSET (1 * PTR_SIZE) 47 #define PROBE_ARG2_OFFSET (2 * PTR_SIZE) 48 49 #define PROBE_FIRST_GPREG_OFFSET (3 * PTR_SIZE) 46 #define PROBE_ARG_OFFSET (1 * PTR_SIZE) 47 48 #define PROBE_FIRST_GPREG_OFFSET (2 * PTR_SIZE) 50 49 51 50 #define GPREG_SIZE 4 … … 106 105 #define PROBE_CPU_D31_OFFSET (PROBE_FIRST_FPREG_OFFSET + (31 * FPREG_SIZE)) 107 106 #define PROBE_SIZE (PROBE_FIRST_FPREG_OFFSET + (32 * FPREG_SIZE)) 107 #define PROBE_ALIGNED_SIZE (PROBE_SIZE) 108 108 109 109 // These ASSERTs remind you that if you change the layout of ProbeContext, … … 111 111 #define PROBE_OFFSETOF(x) offsetof(struct ProbeContext, x) 112 112 COMPILE_ASSERT(PROBE_OFFSETOF(probeFunction) == PROBE_PROBE_FUNCTION_OFFSET, ProbeContext_probeFunction_offset_matches_ctiMasmProbeTrampoline); 113 COMPILE_ASSERT(PROBE_OFFSETOF(arg1) == PROBE_ARG1_OFFSET, ProbeContext_arg1_offset_matches_ctiMasmProbeTrampoline); 114 COMPILE_ASSERT(PROBE_OFFSETOF(arg2) == PROBE_ARG2_OFFSET, ProbeContext_arg2_offset_matches_ctiMasmProbeTrampoline); 113 COMPILE_ASSERT(PROBE_OFFSETOF(arg) == PROBE_ARG_OFFSET, ProbeContext_arg_offset_matches_ctiMasmProbeTrampoline); 114 115 COMPILE_ASSERT(!(PROBE_CPU_R0_OFFSET & 0x3), ProbeContext_cpu_r0_offset_should_be_4_byte_aligned); 115 116 116 117 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.r0) == PROBE_CPU_R0_OFFSET, ProbeContext_cpu_r0_offset_matches_ctiMasmProbeTrampoline); … … 134 135 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.fpscr) == PROBE_CPU_FPSCR_OFFSET, ProbeContext_cpu_fpscr_offset_matches_ctiMasmProbeTrampoline); 135 136 137 COMPILE_ASSERT(!(PROBE_CPU_D0_OFFSET & 0xf), ProbeContext_cpu_d0_offset_should_be_16_byte_aligned); 138 136 139 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d0) == PROBE_CPU_D0_OFFSET, ProbeContext_cpu_d0_offset_matches_ctiMasmProbeTrampoline); 137 140 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.d1) == PROBE_CPU_D1_OFFSET, ProbeContext_cpu_d1_offset_matches_ctiMasmProbeTrampoline); … … 169 172 170 173 COMPILE_ASSERT(sizeof(ProbeContext) == PROBE_SIZE, ProbeContext_size_matches_ctiMasmProbeTrampoline); 174 COMPILE_ASSERT(!(PROBE_ALIGNED_SIZE & 0xf), ProbeContext_aligned_size_offset_should_be_16_byte_aligned); 171 175 172 176 #undef PROBE_OFFSETOF … … 184 188 // The top of stack now looks like this: 185 189 // esp[0 * ptrSize]: probeFunction 186 // esp[1 * ptrSize]: arg1 187 // esp[2 * ptrSize]: arg2 188 // esp[3 * ptrSize]: saved r0 189 // esp[4 * ptrSize]: saved ip 190 // esp[5 * ptrSize]: saved lr 191 // esp[6 * ptrSize]: saved sp 190 // esp[1 * ptrSize]: arg 191 // esp[2 * ptrSize]: saved r0 192 // esp[3 * ptrSize]: saved ip 193 // esp[4 * ptrSize]: saved lr 194 // esp[5 * ptrSize]: saved sp 192 195 193 196 "mov ip, sp" "\n" 194 197 "mov r0, sp" "\n" 195 "sub r0, r0, #" STRINGIZE_VALUE_OF(PROBE_ SIZE) "\n"198 "sub r0, r0, #" STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) "\n" 196 199 197 200 // The ARM EABI specifies that the stack needs to be 16 byte aligned. … … 210 213 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_PROBE_FUNCTION_OFFSET) "]" "\n" 211 214 "ldr lr, [ip, #1 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 212 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG 1_OFFSET) "]" "\n"215 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ARG_OFFSET) "]" "\n" 213 216 "ldr lr, [ip, #2 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 214 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_ ARG2_OFFSET) "]" "\n"217 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_R0_OFFSET) "]" "\n" 215 218 "ldr lr, [ip, #3 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 216 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_ R0_OFFSET) "]" "\n"219 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_IP_OFFSET) "]" "\n" 217 220 "ldr lr, [ip, #4 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 218 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_ IP_OFFSET) "]" "\n"221 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n" 219 222 "ldr lr, [ip, #5 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n" 220 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n"221 "ldr lr, [ip, #6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "]" "\n"222 223 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 223 224 … … 325 326 #endif // COMPILER(GCC_OR_CLANG) 326 327 327 void MacroAssemblerARMv7::probe(ProbeFunction function, void* arg 1, void* arg2)328 void MacroAssemblerARMv7::probe(ProbeFunction function, void* arg) 328 329 { 329 330 push(RegisterID::lr); … … 334 335 push(RegisterID::r0); 335 336 // The following uses RegisterID::ip. So, they must come after we push ip above. 336 push(trustedImm32FromPtr(arg2)); 337 push(trustedImm32FromPtr(arg1)); 337 push(trustedImm32FromPtr(arg)); 338 338 push(trustedImm32FromPtr(function)); 339 339 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r213652 r215592 2017 2017 2018 2018 #if ENABLE(MASM_PROBE) 2019 void probe(ProbeFunction, void* arg 1, void* arg2);2019 void probe(ProbeFunction, void* arg); 2020 2020 #endif // ENABLE(MASM_PROBE) 2021 2021 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerPrinter.cpp
r215196 r215592 176 176 typedef PrintArg Arg; 177 177 PrintArgsList& argsList = 178 *reinterpret_cast<PrintArgsList*>(context->arg 1);178 *reinterpret_cast<PrintArgsList*>(context->arg); 179 179 for (size_t i = 0; i < argsList.size(); i++) { 180 180 auto& arg = argsList[i]; -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerPrinter.h
r215196 r215592 26 26 #pragma once 27 27 28 #include "MacroAssembler.h" 29 30 namespace JSC { 31 28 32 #if ENABLE(MASM_PROBE) 29 30 #include "MacroAssembler.h" 31 32 namespace JSC { 33 33 34 34 // What is MacroAssembler::print()? 35 35 // =============================== … … 168 168 auto argsList = std::make_unique<PrintArgsList>(); 169 169 appendPrintArg(argsList.get(), args...); 170 masm->probe(printCallback, argsList.release() , 0);170 masm->probe(printCallback, argsList.release()); 171 171 } 172 172 … … 297 297 void printMemory(MacroAssembler::CPUState&, const Memory&); 298 298 299 #else // ENABLE(MASM_PROBE) 300 301 template<typename... Arguments> 302 void MacroAssembler::print(Arguments...) { } 303 304 #endif // ENABLE(MASM_PROBE) 305 299 306 } // namespace JSC 300 301 #endif // ENABLE(MASM_PROBE) -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.cpp
r215196 r215592 48 48 49 49 #define PROBE_PROBE_FUNCTION_OFFSET (0 * PTR_SIZE) 50 #define PROBE_ARG1_OFFSET (1 * PTR_SIZE) 51 #define PROBE_ARG2_OFFSET (2 * PTR_SIZE) 52 53 #define PROBE_FIRST_GPR_OFFSET (3 * PTR_SIZE) 50 #define PROBE_ARG_OFFSET (1 * PTR_SIZE) 51 52 #define PROBE_FIRST_GPR_OFFSET (2 * PTR_SIZE) 54 53 #define PROBE_CPU_EAX_OFFSET (PROBE_FIRST_GPR_OFFSET + (0 * PTR_SIZE)) 55 54 #define PROBE_CPU_ECX_OFFSET (PROBE_FIRST_GPR_OFFSET + (1 * PTR_SIZE)) … … 91 90 #if CPU(X86) 92 91 #define PROBE_SIZE (PROBE_CPU_XMM7_OFFSET + XMM_SIZE) 92 #define PROBE_ALIGNED_SIZE (PROBE_SIZE + (2 * XMM_SIZE)) 93 93 #else // CPU(X86_64) 94 94 #define PROBE_CPU_XMM8_OFFSET (PROBE_FIRST_XMM_OFFSET + (8 * XMM_SIZE)) … … 101 101 #define PROBE_CPU_XMM15_OFFSET (PROBE_FIRST_XMM_OFFSET + (15 * XMM_SIZE)) 102 102 #define PROBE_SIZE (PROBE_CPU_XMM15_OFFSET + XMM_SIZE) 103 #define PROBE_ALIGNED_SIZE (PROBE_SIZE + (4 * XMM_SIZE)) 103 104 #endif // CPU(X86_64) 104 105 … … 107 108 #define PROBE_OFFSETOF(x) offsetof(struct ProbeContext, x) 108 109 COMPILE_ASSERT(PROBE_OFFSETOF(probeFunction) == PROBE_PROBE_FUNCTION_OFFSET, ProbeContext_probeFunction_offset_matches_ctiMasmProbeTrampoline); 109 COMPILE_ASSERT(PROBE_OFFSETOF(arg1) == PROBE_ARG1_OFFSET, ProbeContext_arg1_offset_matches_ctiMasmProbeTrampoline); 110 COMPILE_ASSERT(PROBE_OFFSETOF(arg2) == PROBE_ARG2_OFFSET, ProbeContext_arg2_offset_matches_ctiMasmProbeTrampoline); 110 COMPILE_ASSERT(PROBE_OFFSETOF(arg) == PROBE_ARG_OFFSET, ProbeContext_arg_offset_matches_ctiMasmProbeTrampoline); 111 111 112 112 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.eax) == PROBE_CPU_EAX_OFFSET, ProbeContext_cpu_eax_offset_matches_ctiMasmProbeTrampoline); … … 132 132 #endif // CPU(X86_64) 133 133 134 COMPILE_ASSERT(!(PROBE_CPU_XMM0_OFFSET & 0x7), ProbeContext_cpu_xmm0_offset_should_be_8_byte_aligned); 135 134 136 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.xmm0) == PROBE_CPU_XMM0_OFFSET, ProbeContext_cpu_xmm0_offset_matches_ctiMasmProbeTrampoline); 135 137 COMPILE_ASSERT(PROBE_OFFSETOF(cpu.xmm1) == PROBE_CPU_XMM1_OFFSET, ProbeContext_cpu_xmm1_offset_matches_ctiMasmProbeTrampoline); … … 153 155 154 156 COMPILE_ASSERT(sizeof(ProbeContext) == PROBE_SIZE, ProbeContext_size_matches_ctiMasmProbeTrampoline); 157 COMPILE_ASSERT(!(PROBE_ALIGNED_SIZE & 0x1f), ProbeContext_aligned_size_offset_should_be_32_byte_aligned); 155 158 156 159 #undef PROBE_OFFSETOF … … 171 174 // esp[2 * ptrSize]: probeFunction 172 175 // esp[3 * ptrSize]: arg1 173 // esp[4 * ptrSize]: arg2 174 // esp[5 * ptrSize]: saved eax 175 // esp[6 * ptrSize]: saved esp 176 // esp[4 * ptrSize]: saved eax 177 // esp[5 * ptrSize]: saved esp 176 178 177 179 "movl %esp, %eax" "\n" 178 "subl $" STRINGIZE_VALUE_OF(PROBE_ SIZE) ", %esp" "\n"180 "subl $" STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) ", %esp" "\n" 179 181 180 182 // The X86_64 ABI specifies that the worse case stack alignment requirement … … 198 200 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_PROBE_FUNCTION_OFFSET) "(%ebp)" "\n" 199 201 "movl 3 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%eax), %ecx" "\n" 200 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_ARG 1_OFFSET) "(%ebp)" "\n"202 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_ARG_OFFSET) "(%ebp)" "\n" 201 203 "movl 4 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%eax), %ecx" "\n" 202 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_ ARG2_OFFSET) "(%ebp)" "\n"204 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_CPU_EAX_OFFSET) "(%ebp)" "\n" 203 205 "movl 5 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%eax), %ecx" "\n" 204 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_CPU_EAX_OFFSET) "(%ebp)" "\n"205 "movl 6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%eax), %ecx" "\n"206 206 "movl %ecx, " STRINGIZE_VALUE_OF(PROBE_CPU_ESP_OFFSET) "(%ebp)" "\n" 207 207 … … 264 264 // Locate the "safe area" at 2x sizeof(ProbeContext) below where the new 265 265 // rsp will be. This time we don't have to 32-byte align it because we're 266 // not using t o store any xmm regs.266 // not using this area to store any xmm regs. 267 267 "movl " STRINGIZE_VALUE_OF(PROBE_CPU_ESP_OFFSET) "(%ebp), %eax" "\n" 268 "subl $2 * " STRINGIZE_VALUE_OF(PROBE_ SIZE) ", %eax" "\n"268 "subl $2 * " STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) ", %eax" "\n" 269 269 "movl %eax, %esp" "\n" 270 270 … … 324 324 // esp[2 * ptrSize]: probeFunction 325 325 // esp[3 * ptrSize]: arg1 326 // esp[4 * ptrSize]: arg2 327 // esp[5 * ptrSize]: saved rax 328 // esp[6 * ptrSize]: saved rsp 326 // esp[4 * ptrSize]: saved rax 327 // esp[5 * ptrSize]: saved rsp 329 328 330 329 "movq %rsp, %rax" "\n" 331 "subq $" STRINGIZE_VALUE_OF(PROBE_ SIZE) ", %rsp" "\n"330 "subq $" STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) ", %rsp" "\n" 332 331 333 332 // The X86_64 ABI specifies that the worse case stack alignment requirement … … 351 350 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_PROBE_FUNCTION_OFFSET) "(%rbp)" "\n" 352 351 "movq 3 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%rax), %rcx" "\n" 353 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_ARG 1_OFFSET) "(%rbp)" "\n"352 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_ARG_OFFSET) "(%rbp)" "\n" 354 353 "movq 4 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%rax), %rcx" "\n" 355 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_ ARG2_OFFSET) "(%rbp)" "\n"354 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_CPU_EAX_OFFSET) "(%rbp)" "\n" 356 355 "movq 5 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%rax), %rcx" "\n" 357 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_CPU_EAX_OFFSET) "(%rbp)" "\n"358 "movq 6 * " STRINGIZE_VALUE_OF(PTR_SIZE) "(%rax), %rcx" "\n"359 356 "movq %rcx, " STRINGIZE_VALUE_OF(PROBE_CPU_ESP_OFFSET) "(%rbp)" "\n" 360 357 … … 449 446 // not using to store any xmm regs. 450 447 "movq " STRINGIZE_VALUE_OF(PROBE_CPU_ESP_OFFSET) "(%rbp), %rax" "\n" 451 "subq $2 * " STRINGIZE_VALUE_OF(PROBE_ SIZE) ", %rax" "\n"448 "subq $2 * " STRINGIZE_VALUE_OF(PROBE_ALIGNED_SIZE) ", %rax" "\n" 452 449 "movq %rax, %rsp" "\n" 453 450 … … 532 529 // the address of the instruction immediately following the probe. 533 530 534 void MacroAssemblerX86Common::probe(ProbeFunction function, void* arg 1, void* arg2)531 void MacroAssemblerX86Common::probe(ProbeFunction function, void* arg) 535 532 { 536 533 push(RegisterID::esp); 537 534 push(RegisterID::eax); 538 move(TrustedImmPtr(arg2), RegisterID::eax); 539 push(RegisterID::eax); 540 move(TrustedImmPtr(arg1), RegisterID::eax); 535 move(TrustedImmPtr(arg), RegisterID::eax); 541 536 push(RegisterID::eax); 542 537 move(TrustedImmPtr(reinterpret_cast<void*>(function)), RegisterID::eax); -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r215565 r215592 3952 3952 3953 3953 #if ENABLE(MASM_PROBE) 3954 void probe(ProbeFunction, void* arg 1, void* arg2);3954 void probe(ProbeFunction, void* arg); 3955 3955 #endif // ENABLE(MASM_PROBE) 3956 3956
Note: See TracChangeset
for help on using the changeset viewer.