Changeset 220630 in webkit
- Timestamp:
- Aug 12, 2017 11:47:49 PM (7 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r220318 r220630 71 71 assembler/MacroAssembler.cpp 72 72 assembler/MacroAssemblerARM.cpp 73 assembler/MacroAssemblerARM64.cpp 73 74 assembler/MacroAssemblerARMv7.cpp 74 75 assembler/MacroAssemblerCodeRef.cpp -
trunk/Source/JavaScriptCore/ChangeLog
r220629 r220630 1 2017-08-12 Csaba Osztrogonác <ossy@webkit.org> 2 3 [ARM64] Use x29 and x30 instead of fp and lr to make GCC happy 4 https://bugs.webkit.org/show_bug.cgi?id=175512 5 <rdar://problem/33863584> 6 7 Reviewed by Mark Lam. 8 9 * CMakeLists.txt: Added MacroAssemblerARM64.cpp. 10 * assembler/MacroAssemblerARM64.cpp: Use x29 and x30 instead of fp and lr to make GCC happy. 11 1 12 2017-08-12 Csaba Osztrogonác <ossy@webkit.org> 2 13 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.cpp
r220579 r220630 276 276 static_assert(STATE_PC_NOT_CHANGED != STATE_PC_CHANGED, "STATE_PC_NOT_CHANGED and STATE_PC_CHANGED should not be equal"); 277 277 278 // We use x29 and x30 instead of fp and lr because GCC's inline assembler does not recognize fp and lr. 279 // See https://bugs.webkit.org/show_bug.cgi?id=175512 for details. 278 280 asm ( 279 281 ".text" "\n" … … 315 317 "stp x24, x25, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X24_OFFSET) "]" "\n" 316 318 "stp x4, x5, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X26_OFFSET) "]" "\n" // Store saved r26 and r27 (preloaded into x4 and x5 above). 317 "stp x28, fp, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X28_OFFSET) "]" "\n"319 "stp x28, x29, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X28_OFFSET) "]" "\n" 318 320 "stp x6, x7, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n" // Save values lr and sp (preloaded into x6 and x7 above). 319 321 320 322 "str x6, [sp, #" STRINGIZE_VALUE_OF(SAVED_PROBE_LR_OFFSET) "]" "\n" // Save a duplicate copy of lr (in x6). 321 "str lr, [sp, #" STRINGIZE_VALUE_OF(SAVED_PROBE_RETURN_PC_OFFSET) "]" "\n" // Save a duplicate copy of return pc (in lr).322 323 "add lr, lr, #" STRINGIZE_VALUE_OF(2 * PTR_SIZE) "\n" // The PC after the probe is at 2 instructions past the return point.324 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_PC_OFFSET) "]" "\n"323 "str x30, [sp, #" STRINGIZE_VALUE_OF(SAVED_PROBE_RETURN_PC_OFFSET) "]" "\n" // Save a duplicate copy of return pc (in lr). 324 325 "add x30, x30, #" STRINGIZE_VALUE_OF(2 * PTR_SIZE) "\n" // The PC after the probe is at 2 instructions past the return point. 326 "str x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_PC_OFFSET) "]" "\n" 325 327 326 328 "stp x0, x1, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n" // Store nzcv and fpsr (preloaded into x0 and x1 above). … … 397 399 // Remaining registers to restore are: fpsr, nzcv, x27, x28, fp, lr, sp, and pc. 398 400 399 "mov lr, #" STRINGIZE_VALUE_OF(STATE_PC_NOT_CHANGED) "\n"401 "mov x30, #" STRINGIZE_VALUE_OF(STATE_PC_NOT_CHANGED) "\n" 400 402 401 403 // The only way to set the pc on ARM64 (from user space) is via an indirect branch … … 421 423 "bne " LOCAL_LABEL_STRING(ctiMasmProbeTrampolineError) "\n" 422 424 423 "mov lr, #" STRINGIZE_VALUE_OF(STATE_PC_CHANGED) "\n"425 "mov x30, #" STRINGIZE_VALUE_OF(STATE_PC_CHANGED) "\n" 424 426 425 427 LOCAL_LABEL_STRING(ctiMasmProbeTrampolinePrepareOutgoingRecords) ":" "\n" 426 428 427 "ldr fp, [sp, #" STRINGIZE_VALUE_OF(SAVED_PROBE_RETURN_PC_OFFSET) "]" "\n" // Preload the probe return site pc.429 "ldr x29, [sp, #" STRINGIZE_VALUE_OF(SAVED_PROBE_RETURN_PC_OFFSET) "]" "\n" // Preload the probe return site pc. 428 430 429 431 // The probe handler may have moved the sp. For the return process, we may need … … 456 458 457 459 // Copy the relevant restore data to the new ProbeContext*. 458 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X0_OFFSET) "]" "\n" // Stash the pc changed state away so that we can use lr.459 460 "ldp x28, lr, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" // copy x27 and x28.461 "stp x28, lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n"462 "ldp x28, lr, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" // copy fp and lr.463 "stp x28, lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n"464 "ldp x28, lr, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" // copy sp and pc.465 "stp x28, lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n"466 "ldp x28, lr, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n" // copy nzcv and fpsr.467 "stp x28, lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n"468 469 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X0_OFFSET) "]" "\n" // Retrieve the stashed the pc changed state.460 "str x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X0_OFFSET) "]" "\n" // Stash the pc changed state away so that we can use lr. 461 462 "ldp x28, x30, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" // copy x27 and x28. 463 "stp x28, x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" 464 "ldp x28, x30, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" // copy fp and lr. 465 "stp x28, x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" 466 "ldp x28, x30, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" // copy sp and pc. 467 "stp x28, x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 468 "ldp x28, x30, [x27, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n" // copy nzcv and fpsr. 469 "stp x28, x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n" 470 471 "ldr x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X0_OFFSET) "]" "\n" // Retrieve the stashed the pc changed state. 470 472 471 473 LOCAL_LABEL_STRING(ctiMasmProbeTrampolineFillOutgoingProbeRecords) ":" "\n" 472 474 473 "cbnz lr, " LOCAL_LABEL_STRING(ctiMasmProbeTrampolineEnd) "\n" // Skip lr restoration setup if state (in lr) == STATE_PC_CHANGED.475 "cbnz x30, " LOCAL_LABEL_STRING(ctiMasmProbeTrampolineEnd) "\n" // Skip lr restoration setup if state (in lr) == STATE_PC_CHANGED. 474 476 475 477 // In order to restore lr, we need to do the restoration at the probe return site. … … 482 484 483 485 // Fill in the OutgoingProbeStack for the probe return site. 484 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n"485 "sub lr, lr, #" STRINGIZE_VALUE_OF(OUT_SIZE) "\n"486 "ldr x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 487 "sub x30, x30, #" STRINGIZE_VALUE_OF(OUT_SIZE) "\n" 486 488 487 489 "ldr x27, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_LR_OFFSET) "]" "\n" 488 "str x27, [ lr, #" STRINGIZE_VALUE_OF(OUT_LR_OFFSET) "]" "\n"490 "str x27, [x30, #" STRINGIZE_VALUE_OF(OUT_LR_OFFSET) "]" "\n" 489 491 490 492 // Set up the sp and pc values so that ctiMasmProbeTrampolineEnd will return to the probe return site. 491 "str lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n"492 "str fp, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_PC_OFFSET) "]" "\n" // Store the probe return site pc (preloaded into fp above).493 "str x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 494 "str x29, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_PC_OFFSET) "]" "\n" // Store the probe return site pc (preloaded into fp above). 493 495 494 496 LOCAL_LABEL_STRING(ctiMasmProbeTrampolineEnd) ":" "\n" 495 497 496 498 // Fill in the OutgoingProbeStack. 497 "ldr lr, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n"498 "sub lr, lr, #" STRINGIZE_VALUE_OF(OUT_SIZE) "\n"499 "ldr x30, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_SP_OFFSET) "]" "\n" 500 "sub x30, x30, #" STRINGIZE_VALUE_OF(OUT_SIZE) "\n" 499 501 500 502 "ldp x27, x28, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_NZCV_OFFSET) "]" "\n" 501 "stp x27, x28, [ lr, #" STRINGIZE_VALUE_OF(OUT_NZCV_OFFSET) "]" "\n"503 "stp x27, x28, [x30, #" STRINGIZE_VALUE_OF(OUT_NZCV_OFFSET) "]" "\n" 502 504 "ldp x27, x28, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_X27_OFFSET) "]" "\n" 503 "stp x27, x28, [ lr, #" STRINGIZE_VALUE_OF(OUT_X27_OFFSET) "]" "\n"505 "stp x27, x28, [x30, #" STRINGIZE_VALUE_OF(OUT_X27_OFFSET) "]" "\n" 504 506 "ldr x27, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_FP_OFFSET) "]" "\n" 505 507 "ldr x28, [sp, #" STRINGIZE_VALUE_OF(PROBE_CPU_PC_OFFSET) "]" "\n" 506 "stp x27, x28, [ lr, #" STRINGIZE_VALUE_OF(OUT_FP_OFFSET) "]" "\n"507 "mov sp, lr" "\n"508 "stp x27, x28, [x30, #" STRINGIZE_VALUE_OF(OUT_FP_OFFSET) "]" "\n" 509 "mov sp, x30" "\n" 508 510 509 511 // Restore the remaining registers and pop the OutgoingProbeStack. … … 512 514 "msr fpsr, x28" "\n" 513 515 "ldp x27, x28, [sp], #" STRINGIZE_VALUE_OF(2 * PTR_SIZE) "\n" 514 "ldp fp, lr, [sp], #" STRINGIZE_VALUE_OF(2 * PTR_SIZE) "\n"516 "ldp x29, x30, [sp], #" STRINGIZE_VALUE_OF(2 * PTR_SIZE) "\n" 515 517 "ret" "\n" 516 518
Note: See TracChangeset
for help on using the changeset viewer.