From 0a510478b0294744894385c6c6f5ded6829b6524 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 5 Apr 2021 20:26:11 -0400 Subject: [PATCH] runtime: use register ABI for race detector functions runtime.raceread/racewrite/racewriterange are functions that are called from compiler instrumented code, follwoing ABIInternal. They are assembly functions defined as ABIInternal in the runtime, in order to avoid wrappers because they need to get the caller's PC. This CL makes them to use the actual internal ABI. Change-Id: Id91d73cf257f7b11a858958d85c38c4aa904d9c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/307812 Trust: Cherry Zhang Reviewed-by: Michael Knyszek --- src/runtime/race_amd64.s | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/runtime/race_amd64.s b/src/runtime/race_amd64.s index 5f6b86a1fe..426777b8bf 100644 --- a/src/runtime/race_amd64.s +++ b/src/runtime/race_amd64.s @@ -44,7 +44,11 @@ // Defined as ABIInternal so as to avoid introducing a wrapper, // which would render runtime.getcallerpc ineffective. TEXT runtime·raceread(SB), NOSPLIT, $0-8 +#ifdef GOEXPERIMENT_REGABI_ARGS + MOVQ AX, RARG1 +#else MOVQ addr+0(FP), RARG1 +#endif MOVQ (SP), RARG2 // void __tsan_read(ThreadState *thr, void *addr, void *pc); MOVQ $__tsan_read(SB), AX @@ -70,7 +74,11 @@ TEXT runtime·racereadpc(SB), NOSPLIT, $0-24 // Defined as ABIInternal so as to avoid introducing a wrapper, // which would render runtime.getcallerpc ineffective. TEXT runtime·racewrite(SB), NOSPLIT, $0-8 +#ifdef GOEXPERIMENT_REGABI_ARGS + MOVQ AX, RARG1 +#else MOVQ addr+0(FP), RARG1 +#endif MOVQ (SP), RARG2 // void __tsan_write(ThreadState *thr, void *addr, void *pc); MOVQ $__tsan_write(SB), AX @@ -121,8 +129,13 @@ TEXT runtime·racereadrangepc1(SB), NOSPLIT, $0-24 // Defined as ABIInternal so as to avoid introducing a wrapper, // which would render runtime.getcallerpc ineffective. TEXT runtime·racewriterange(SB), NOSPLIT, $0-16 +#ifdef GOEXPERIMENT_REGABI_ARGS + MOVQ AX, RARG1 + MOVQ BX, RARG2 +#else MOVQ addr+0(FP), RARG1 MOVQ size+8(FP), RARG2 +#endif MOVQ (SP), RARG3 // void __tsan_write_range(ThreadState *thr, void *addr, uintptr size, void *pc); MOVQ $__tsan_write_range(SB), AX -- 2.50.0