1
0
mirror of https://github.com/golang/go synced 2024-11-19 08:24:41 -07:00

runtime: use BX instead of R15 in race detector

If the race detector were runnable in dynamic linking mode,
then R15 would get clobbered. I don't think it is, so maybe
not a problem, but can't hurt to clean it up.

It also lets CL 283474 pass cleanly when checking the whole stdlib
(together with CL 288452).

Change-Id: I5a5021ecc7e7b8bed1cd3a7067c39b24c09e0783
Reviewed-on: https://go-review.googlesource.com/c/go/+/289270
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Keith Randall 2021-02-03 12:25:46 -08:00
parent c49c7a675a
commit a4dac8bd22

View File

@ -184,7 +184,7 @@ TEXT runtime·racefuncenter(SB), NOSPLIT, $0-8
// Common code for racefuncenter/racefuncenterfp // Common code for racefuncenter/racefuncenterfp
// R11 = caller's return address // R11 = caller's return address
TEXT racefuncenter<>(SB), NOSPLIT, $0-0 TEXT racefuncenter<>(SB), NOSPLIT, $0-0
MOVQ DX, R15 // save function entry context (for closures) MOVQ DX, BX // save function entry context (for closures)
#ifndef GOEXPERIMENT_REGABI #ifndef GOEXPERIMENT_REGABI
get_tls(R12) get_tls(R12)
MOVQ g(R12), R14 MOVQ g(R12), R14
@ -193,9 +193,9 @@ TEXT racefuncenter<>(SB), NOSPLIT, $0-0
MOVQ R11, RARG1 MOVQ R11, RARG1
// void __tsan_func_enter(ThreadState *thr, void *pc); // void __tsan_func_enter(ThreadState *thr, void *pc);
MOVQ $__tsan_func_enter(SB), AX MOVQ $__tsan_func_enter(SB), AX
// racecall<> preserves R15 // racecall<> preserves BX
CALL racecall<>(SB) CALL racecall<>(SB)
MOVQ R15, DX // restore function entry context MOVQ BX, DX // restore function entry context
RET RET
// func runtime·racefuncexit() // func runtime·racefuncexit()
@ -376,7 +376,7 @@ racecallatomic_ignore:
// Addr is outside the good range. // Addr is outside the good range.
// Call __tsan_go_ignore_sync_begin to ignore synchronization during the atomic op. // Call __tsan_go_ignore_sync_begin to ignore synchronization during the atomic op.
// An attempt to synchronize on the address would cause crash. // An attempt to synchronize on the address would cause crash.
MOVQ AX, R15 // remember the original function MOVQ AX, BX // remember the original function
MOVQ $__tsan_go_ignore_sync_begin(SB), AX MOVQ $__tsan_go_ignore_sync_begin(SB), AX
#ifndef GOEXPERIMENT_REGABI #ifndef GOEXPERIMENT_REGABI
get_tls(R12) get_tls(R12)
@ -384,7 +384,7 @@ racecallatomic_ignore:
#endif #endif
MOVQ g_racectx(R14), RARG0 // goroutine context MOVQ g_racectx(R14), RARG0 // goroutine context
CALL racecall<>(SB) CALL racecall<>(SB)
MOVQ R15, AX // restore the original function MOVQ BX, AX // restore the original function
// Call the atomic function. // Call the atomic function.
MOVQ g_racectx(R14), RARG0 // goroutine context MOVQ g_racectx(R14), RARG0 // goroutine context
MOVQ 8(SP), RARG1 // caller pc MOVQ 8(SP), RARG1 // caller pc