@@ -162,7 +162,7 @@ data:
162
162
JAE ret
163
163
call:
164
164
MOVQ AX, AX // w/o this 6a miscompiles this function
165
- JMP racecall<> (SB)
165
+ JMP racecall(SB)
166
166
ret:
167
167
RET
168
168
@@ -180,8 +180,8 @@ TEXT racefuncenter<>(SB), NOSPLIT|NOFRAME, $0-0
180
180
MOVQ R11, RARG1
181
181
// void __tsan_func_enter(ThreadState *thr, void *pc);
182
182
MOVQ $__tsan_func_enter(SB), AX
183
- // racecall<> preserves BX
184
- CALL racecall<> (SB)
183
+ // racecall preserves BX
184
+ CALL racecall(SB)
185
185
MOVQ BX, DX // restore function entry context
186
186
RET
187
187
@@ -191,7 +191,7 @@ TEXT runtime·racefuncexit(SB), NOSPLIT, $0-0
191
191
MOVQ g_racectx(R14), RARG0 // goroutine context
192
192
// void __tsan_func_exit(ThreadState *thr);
193
193
MOVQ $__tsan_func_exit(SB), AX
194
- JMP racecall<> (SB)
194
+ JMP racecall(SB)
195
195
196
196
// Atomic operations for sync/atomic package.
197
197
@@ -303,6 +303,59 @@ TEXT sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
303
303
GO_ARGS
304
304
JMP sync∕atomic·AddInt64(SB)
305
305
306
+
307
+ // For OpenBSD, see race_openbsd_amd64.s for implementation.
308
+ #ifndef GOOS_openbsd
309
+ // And
310
+ TEXT sync∕atomic·AndInt32(SB), NOSPLIT|NOFRAME, $0 -20
311
+ GO_ARGS
312
+ MOVQ $__tsan_go_atomic32_fetch_and(SB), AX
313
+ CALL racecallatomic<>(SB)
314
+ RET
315
+
316
+ TEXT sync∕atomic·AndInt64(SB), NOSPLIT|NOFRAME, $0 -24
317
+ GO_ARGS
318
+ MOVQ $__tsan_go_atomic64_fetch_and(SB), AX
319
+ CALL racecallatomic<>(SB)
320
+ RET
321
+ // Or
322
+ TEXT sync∕atomic·OrInt32(SB), NOSPLIT|NOFRAME, $0 -20
323
+ GO_ARGS
324
+ MOVQ $__tsan_go_atomic32_fetch_or(SB), AX
325
+ CALL racecallatomic<>(SB)
326
+ RET
327
+
328
+ TEXT sync∕atomic·OrInt64(SB), NOSPLIT|NOFRAME, $0 -24
329
+ GO_ARGS
330
+ MOVQ $__tsan_go_atomic64_fetch_or(SB), AX
331
+ CALL racecallatomic<>(SB)
332
+ RET
333
+ #endif
334
+
335
+ TEXT sync∕atomic·AndUint32(SB), NOSPLIT, $0 -20
336
+ GO_ARGS
337
+ JMP sync∕atomic·AndInt32(SB)
338
+
339
+ TEXT sync∕atomic·AndUint64(SB), NOSPLIT, $0 -24
340
+ GO_ARGS
341
+ JMP sync∕atomic·AndInt64(SB)
342
+
343
+ TEXT sync∕atomic·AndUintptr(SB), NOSPLIT, $0 -24
344
+ GO_ARGS
345
+ JMP sync∕atomic·AndInt64(SB)
346
+
347
+ TEXT sync∕atomic·OrUint32(SB), NOSPLIT, $0 -20
348
+ GO_ARGS
349
+ JMP sync∕atomic·OrInt32(SB)
350
+
351
+ TEXT sync∕atomic·OrUint64(SB), NOSPLIT, $0 -24
352
+ GO_ARGS
353
+ JMP sync∕atomic·OrInt64(SB)
354
+
355
+ TEXT sync∕atomic·OrUintptr(SB), NOSPLIT, $0 -24
356
+ GO_ARGS
357
+ JMP sync∕atomic·OrInt64(SB)
358
+
306
359
// CompareAndSwap
307
360
TEXT sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT|NOFRAME, $0 -17
308
361
GO_ARGS
@@ -350,26 +403,26 @@ racecallatomic_ok:
350
403
MOVQ 8 (SP), RARG1 // caller pc
351
404
MOVQ (SP), RARG2 // pc
352
405
LEAQ 16 (SP), RARG3 // arguments
353
- JMP racecall<> (SB) // does not return
406
+ JMP racecall(SB) // does not return
354
407
racecallatomic_ignore:
355
408
// Addr is outside the good range.
356
409
// Call __tsan_go_ignore_sync_begin to ignore synchronization during the atomic op.
357
410
// An attempt to synchronize on the address would cause crash.
358
411
MOVQ AX, BX // remember the original function
359
412
MOVQ $__tsan_go_ignore_sync_begin(SB), AX
360
413
MOVQ g_racectx(R14), RARG0 // goroutine context
361
- CALL racecall<> (SB)
414
+ CALL racecall(SB)
362
415
MOVQ BX, AX // restore the original function
363
416
// Call the atomic function.
364
417
MOVQ g_racectx(R14), RARG0 // goroutine context
365
418
MOVQ 8 (SP), RARG1 // caller pc
366
419
MOVQ (SP), RARG2 // pc
367
420
LEAQ 16 (SP), RARG3 // arguments
368
- CALL racecall<> (SB)
421
+ CALL racecall(SB)
369
422
// Call __tsan_go_ignore_sync_end.
370
423
MOVQ $__tsan_go_ignore_sync_end(SB), AX
371
424
MOVQ g_racectx(R14), RARG0 // goroutine context
372
- JMP racecall<> (SB)
425
+ JMP racecall(SB)
373
426
374
427
// void runtime·racecall(void(*f)(...), ...)
375
428
// Calls C function f from race runtime and passes up to 4 arguments to it.
@@ -380,10 +433,10 @@ TEXT runtime·racecall(SB), NOSPLIT, $0-0
380
433
MOVQ arg1+16 (FP), RARG1
381
434
MOVQ arg2+24 (FP), RARG2
382
435
MOVQ arg3+32 (FP), RARG3
383
- JMP racecall<> (SB)
436
+ JMP racecall(SB)
384
437
385
438
// Switches SP to g0 stack and calls (AX). Arguments already set.
386
- TEXT racecall<> (SB), NOSPLIT|NOFRAME, $0 -0
439
+ TEXT racecall(SB), NOSPLIT|NOFRAME, $0 -0
387
440
MOVQ g_m(R14), R13
388
441
// Switch to g0 stack.
389
442
MOVQ SP, R12 // callee-saved, preserved across the CALL
0 commit comments