Skip to content

Commit 192d65e

Browse files
mauri870gopherbot
authored andcommitted
sync/atomic: public And/Or ops and race instrumentation
This CL implements the new sync/atomic AND and OR apis as well as their race counterparts. Fixes #61395 Change-Id: I294eefe4b3ac27bc4ed237edcbfa88a8c646d86f GitHub-Last-Rev: f174297 GitHub-Pull-Request: #64331 Reviewed-on: https://go-review.googlesource.com/c/go/+/544455 Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Austin Clements <[email protected]> Auto-Submit: Austin Clements <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 664088b commit 192d65e

File tree

11 files changed

+840
-0
lines changed

11 files changed

+840
-0
lines changed

api/next/61395.txt

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
pkg sync/atomic, func AndInt32(*int32, int32) int32 #61395
2+
pkg sync/atomic, func AndInt64(*int64, int64) int64 #61395
3+
pkg sync/atomic, func AndUint32(*uint32, uint32) uint32 #61395
4+
pkg sync/atomic, func AndUint64(*uint64, uint64) uint64 #61395
5+
pkg sync/atomic, func AndUintptr(*uintptr, uintptr) uintptr #61395
6+
pkg sync/atomic, func OrInt32(*int32, int32) int32 #61395
7+
pkg sync/atomic, func OrInt64(*int64, int64) int64 #61395
8+
pkg sync/atomic, func OrUint32(*uint32, uint32) uint32 #61395
9+
pkg sync/atomic, func OrUint64(*uint64, uint64) uint64 #61395
10+
pkg sync/atomic, func OrUintptr(*uintptr, uintptr) uintptr #61395
11+
pkg sync/atomic, method (*Int32) And(int32) int32 #61395
12+
pkg sync/atomic, method (*Int64) And(int64) int64 #61395
13+
pkg sync/atomic, method (*Uint32) And(uint32) uint32 #61395
14+
pkg sync/atomic, method (*Uint64) And(uint64) uint64 #61395
15+
pkg sync/atomic, method (*Uintptr) And(uintptr) uintptr #61395
16+
pkg sync/atomic, method (*Int32) Or(int32) int32 #61395
17+
pkg sync/atomic, method (*Int64) Or(int64) int64 #61395
18+
pkg sync/atomic, method (*Uint32) Or(uint32) uint32 #61395
19+
pkg sync/atomic, method (*Uint64) Or(uint64) uint64 #61395
20+
pkg sync/atomic, method (*Uintptr) Or(uintptr) uintptr #61395
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<!-- Issue #61395 -->
2+
The new [`atomic.And`](/pkg/sync/atomic#And) and [`atomic.Or`](/pkg/sync/atomic#Or)
3+
operators apply a bitwise `AND` or `OR` to the given input, returning the old value.

src/runtime/race.go

+34
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@ var __tsan_report_count byte
323323
//go:cgo_import_static __tsan_go_atomic64_exchange
324324
//go:cgo_import_static __tsan_go_atomic32_fetch_add
325325
//go:cgo_import_static __tsan_go_atomic64_fetch_add
326+
//go:cgo_import_static __tsan_go_atomic32_fetch_and
327+
//go:cgo_import_static __tsan_go_atomic64_fetch_and
328+
//go:cgo_import_static __tsan_go_atomic32_fetch_or
329+
//go:cgo_import_static __tsan_go_atomic64_fetch_or
326330
//go:cgo_import_static __tsan_go_atomic32_compare_exchange
327331
//go:cgo_import_static __tsan_go_atomic64_compare_exchange
328332

@@ -642,6 +646,36 @@ func abigen_sync_atomic_AddUint64(addr *uint64, delta uint64) (new uint64)
642646
//go:linkname abigen_sync_atomic_AddUintptr sync/atomic.AddUintptr
643647
func abigen_sync_atomic_AddUintptr(addr *uintptr, delta uintptr) (new uintptr)
644648

649+
//go:linkname abigen_sync_atomic_AndInt32 sync/atomic.AndInt32
650+
func abigen_sync_atomic_AndInt32(addr *int32, mask int32) (old int32)
651+
652+
//go:linkname abigen_sync_atomic_AndUint32 sync/atomic.AndUint32
653+
func abigen_sync_atomic_AndUint32(addr *uint32, mask uint32) (old uint32)
654+
655+
//go:linkname abigen_sync_atomic_AndInt64 sync/atomic.AndInt64
656+
func abigen_sync_atomic_AndInt64(addr *int64, mask int64) (old int64)
657+
658+
//go:linkname abigen_sync_atomic_AndUint64 sync/atomic.AndUint64
659+
func abigen_sync_atomic_AndUint64(addr *uint64, mask uint64) (old uint64)
660+
661+
//go:linkname abigen_sync_atomic_AndUintptr sync/atomic.AndUintptr
662+
func abigen_sync_atomic_AndUintptr(addr *uintptr, mask uintptr) (old uintptr)
663+
664+
//go:linkname abigen_sync_atomic_OrInt32 sync/atomic.OrInt32
665+
func abigen_sync_atomic_OrInt32(addr *int32, mask int32) (old int32)
666+
667+
//go:linkname abigen_sync_atomic_OrUint32 sync/atomic.OrUint32
668+
func abigen_sync_atomic_OrUint32(addr *uint32, mask uint32) (old uint32)
669+
670+
//go:linkname abigen_sync_atomic_OrInt64 sync/atomic.OrInt64
671+
func abigen_sync_atomic_OrInt64(addr *int64, mask int64) (old int64)
672+
673+
//go:linkname abigen_sync_atomic_OrUint64 sync/atomic.OrUint64
674+
func abigen_sync_atomic_OrUint64(addr *uint64, mask uint64) (old uint64)
675+
676+
//go:linkname abigen_sync_atomic_OrUintptr sync/atomic.OrUintptr
677+
func abigen_sync_atomic_OrUintptr(addr *uintptr, mask uintptr) (old uintptr)
678+
645679
//go:linkname abigen_sync_atomic_CompareAndSwapInt32 sync/atomic.CompareAndSwapInt32
646680
func abigen_sync_atomic_CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
647681

src/runtime/race_amd64.s

+51
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,57 @@ TEXT sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
303303
GO_ARGS
304304
JMP sync∕atomic·AddInt64(SB)
305305

306+
// And
307+
TEXT sync∕atomic·AndInt32(SB), NOSPLIT|NOFRAME, $0-20
308+
GO_ARGS
309+
MOVQ $__tsan_go_atomic32_fetch_and(SB), AX
310+
CALL racecallatomic<>(SB)
311+
RET
312+
313+
TEXT sync∕atomic·AndInt64(SB), NOSPLIT|NOFRAME, $0-24
314+
GO_ARGS
315+
MOVQ $__tsan_go_atomic64_fetch_and(SB), AX
316+
CALL racecallatomic<>(SB)
317+
RET
318+
319+
TEXT sync∕atomic·AndUint32(SB), NOSPLIT, $0-20
320+
GO_ARGS
321+
JMP sync∕atomic·AndInt32(SB)
322+
323+
TEXT sync∕atomic·AndUint64(SB), NOSPLIT, $0-24
324+
GO_ARGS
325+
JMP sync∕atomic·AndInt64(SB)
326+
327+
TEXT sync∕atomic·AndUintptr(SB), NOSPLIT, $0-24
328+
GO_ARGS
329+
JMP sync∕atomic·AndInt64(SB)
330+
331+
// Or
332+
TEXT sync∕atomic·OrInt32(SB), NOSPLIT|NOFRAME, $0-20
333+
GO_ARGS
334+
MOVQ $__tsan_go_atomic32_fetch_or(SB), AX
335+
CALL racecallatomic<>(SB)
336+
RET
337+
338+
TEXT sync∕atomic·OrInt64(SB), NOSPLIT|NOFRAME, $0-24
339+
GO_ARGS
340+
MOVQ $__tsan_go_atomic64_fetch_or(SB), AX
341+
CALL racecallatomic<>(SB)
342+
RET
343+
344+
TEXT sync∕atomic·OrUint32(SB), NOSPLIT, $0-20
345+
GO_ARGS
346+
JMP sync∕atomic·OrInt32(SB)
347+
348+
TEXT sync∕atomic·OrUint64(SB), NOSPLIT, $0-24
349+
GO_ARGS
350+
JMP sync∕atomic·OrInt64(SB)
351+
352+
TEXT sync∕atomic·OrUintptr(SB), NOSPLIT, $0-24
353+
GO_ARGS
354+
JMP sync∕atomic·OrInt64(SB)
355+
356+
306357
// CompareAndSwap
307358
TEXT sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT|NOFRAME, $0-17
308359
GO_ARGS

src/runtime/race_arm64.s

+50
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,56 @@ TEXT sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
312312
GO_ARGS
313313
JMP sync∕atomic·AddInt64(SB)
314314

315+
// And
316+
TEXT sync∕atomic·AndInt32(SB), NOSPLIT, $0-20
317+
GO_ARGS
318+
MOVD $__tsan_go_atomic32_fetch_and(SB), R9
319+
BL racecallatomic<>(SB)
320+
RET
321+
322+
TEXT sync∕atomic·AndInt64(SB), NOSPLIT, $0-24
323+
GO_ARGS
324+
MOVD $__tsan_go_atomic64_fetch_and(SB), R9
325+
BL racecallatomic<>(SB)
326+
RET
327+
328+
TEXT sync∕atomic·AndUint32(SB), NOSPLIT, $0-20
329+
GO_ARGS
330+
JMP sync∕atomic·AndInt32(SB)
331+
332+
TEXT sync∕atomic·AndUint64(SB), NOSPLIT, $0-24
333+
GO_ARGS
334+
JMP sync∕atomic·AndInt64(SB)
335+
336+
TEXT sync∕atomic·AndUintptr(SB), NOSPLIT, $0-24
337+
GO_ARGS
338+
JMP sync∕atomic·AndInt64(SB)
339+
340+
// Or
341+
TEXT sync∕atomic·OrInt32(SB), NOSPLIT, $0-20
342+
GO_ARGS
343+
MOVD $__tsan_go_atomic32_fetch_or(SB), R9
344+
BL racecallatomic<>(SB)
345+
RET
346+
347+
TEXT sync∕atomic·OrInt64(SB), NOSPLIT, $0-24
348+
GO_ARGS
349+
MOVD $__tsan_go_atomic64_fetch_or(SB), R9
350+
BL racecallatomic<>(SB)
351+
RET
352+
353+
TEXT sync∕atomic·OrUint32(SB), NOSPLIT, $0-20
354+
GO_ARGS
355+
JMP sync∕atomic·OrInt32(SB)
356+
357+
TEXT sync∕atomic·OrUint64(SB), NOSPLIT, $0-24
358+
GO_ARGS
359+
JMP sync∕atomic·OrInt64(SB)
360+
361+
TEXT sync∕atomic·OrUintptr(SB), NOSPLIT, $0-24
362+
GO_ARGS
363+
JMP sync∕atomic·OrInt64(SB)
364+
315365
// CompareAndSwap
316366
TEXT sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT, $0-17
317367
GO_ARGS

src/runtime/race_ppc64le.s

+46
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,52 @@ TEXT sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
325325
GO_ARGS
326326
BR sync∕atomic·AddInt64(SB)
327327

328+
// And
329+
TEXT sync∕atomic·AndInt32(SB), NOSPLIT, $0-20
330+
GO_ARGS
331+
MOVD $__tsan_go_atomic32_fetch_and(SB), R8
332+
BR racecallatomic<>(SB)
333+
334+
TEXT sync∕atomic·AndInt64(SB), NOSPLIT, $0-24
335+
GO_ARGS
336+
MOVD $__tsan_go_atomic64_fetch_and(SB), R8
337+
BR racecallatomic<>(SB)
338+
339+
TEXT sync∕atomic·AndUint32(SB), NOSPLIT, $0-20
340+
GO_ARGS
341+
BR sync∕atomic·AndInt32(SB)
342+
343+
TEXT sync∕atomic·AndUint64(SB), NOSPLIT, $0-24
344+
GO_ARGS
345+
BR sync∕atomic·AndInt64(SB)
346+
347+
TEXT sync∕atomic·AndUintptr(SB), NOSPLIT, $0-24
348+
GO_ARGS
349+
BR sync∕atomic·AndInt64(SB)
350+
351+
// Or
352+
TEXT sync∕atomic·OrInt32(SB), NOSPLIT, $0-20
353+
GO_ARGS
354+
MOVD $__tsan_go_atomic32_fetch_or(SB), R8
355+
BR racecallatomic<>(SB)
356+
357+
TEXT sync∕atomic·OrInt64(SB), NOSPLIT, $0-24
358+
GO_ARGS
359+
MOVD $__tsan_go_atomic64_fetch_or(SB), R8
360+
BR racecallatomic<>(SB)
361+
362+
TEXT sync∕atomic·OrUint32(SB), NOSPLIT, $0-20
363+
GO_ARGS
364+
BR sync∕atomic·OrInt32(SB)
365+
366+
TEXT sync∕atomic·OrUint64(SB), NOSPLIT, $0-24
367+
GO_ARGS
368+
BR sync∕atomic·OrInt64(SB)
369+
370+
TEXT sync∕atomic·OrUintptr(SB), NOSPLIT, $0-24
371+
GO_ARGS
372+
BR sync∕atomic·OrInt64(SB)
373+
328374
// CompareAndSwap in tsan
329375
TEXT sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT, $0-17
330376
GO_ARGS

src/runtime/race_s390x.s

+50
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,56 @@ TEXT sync∕atomic·AddUintptr(SB), NOSPLIT, $0-24
274274
GO_ARGS
275275
JMP sync∕atomic·AddInt64(SB)
276276

277+
// And
278+
TEXT sync∕atomic·AndInt32(SB), NOSPLIT, $0-20
279+
GO_ARGS
280+
MOVD $__tsan_go_atomic32_fetch_and(SB), R1
281+
BL racecallatomic<>(SB)
282+
RET
283+
284+
TEXT sync∕atomic·AndInt64(SB), NOSPLIT, $0-24
285+
GO_ARGS
286+
MOVD $__tsan_go_atomic64_fetch_and(SB), R1
287+
BL racecallatomic<>(SB)
288+
RET
289+
290+
TEXT sync∕atomic·AndUint32(SB), NOSPLIT, $0-20
291+
GO_ARGS
292+
JMP sync∕atomic·AndInt32(SB)
293+
294+
TEXT sync∕atomic·AndUint64(SB), NOSPLIT, $0-24
295+
GO_ARGS
296+
JMP sync∕atomic·AndInt64(SB)
297+
298+
TEXT sync∕atomic·AndUintptr(SB), NOSPLIT, $0-24
299+
GO_ARGS
300+
JMP sync∕atomic·AndInt64(SB)
301+
302+
// Or
303+
TEXT sync∕atomic·OrInt32(SB), NOSPLIT, $0-20
304+
GO_ARGS
305+
MOVD $__tsan_go_atomic32_fetch_or(SB), R1
306+
BL racecallatomic<>(SB)
307+
RET
308+
309+
TEXT sync∕atomic·OrInt64(SB), NOSPLIT, $0-24
310+
GO_ARGS
311+
MOVD $__tsan_go_atomic64_fetch_or(SB), R1
312+
BL racecallatomic<>(SB)
313+
RET
314+
315+
TEXT sync∕atomic·OrUint32(SB), NOSPLIT, $0-20
316+
GO_ARGS
317+
JMP sync∕atomic·OrInt32(SB)
318+
319+
TEXT sync∕atomic·OrUint64(SB), NOSPLIT, $0-24
320+
GO_ARGS
321+
JMP sync∕atomic·OrInt64(SB)
322+
323+
TEXT sync∕atomic·OrUintptr(SB), NOSPLIT, $0-24
324+
GO_ARGS
325+
JMP sync∕atomic·OrInt64(SB)
326+
277327
// CompareAndSwap
278328

279329
TEXT sync∕atomic·CompareAndSwapInt32(SB), NOSPLIT, $0-17

src/sync/atomic/asm.s

+30
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,33 @@ TEXT ·StoreUint64(SB),NOSPLIT,$0
8383

8484
TEXT ·StoreUintptr(SB),NOSPLIT,$0
8585
JMP internal∕runtime∕atomic·Storeuintptr(SB)
86+
87+
TEXT ·AndInt32(SB),NOSPLIT,$0
88+
JMP internal∕runtime∕atomic·And32(SB)
89+
90+
TEXT ·AndUint32(SB),NOSPLIT,$0
91+
JMP internal∕runtime∕atomic·And32(SB)
92+
93+
TEXT ·AndUintptr(SB),NOSPLIT,$0
94+
JMP internal∕runtime∕atomic·Anduintptr(SB)
95+
96+
TEXT ·AndInt64(SB),NOSPLIT,$0
97+
JMP internal∕runtime∕atomic·And64(SB)
98+
99+
TEXT ·AndUint64(SB),NOSPLIT,$0
100+
JMP internal∕runtime∕atomic·And64(SB)
101+
102+
TEXT ·OrInt32(SB),NOSPLIT,$0
103+
JMP internal∕runtime∕atomic·Or32(SB)
104+
105+
TEXT ·OrUint32(SB),NOSPLIT,$0
106+
JMP internal∕runtime∕atomic·Or32(SB)
107+
108+
TEXT ·OrUintptr(SB),NOSPLIT,$0
109+
JMP internal∕runtime∕atomic·Oruintptr(SB)
110+
111+
TEXT ·OrInt64(SB),NOSPLIT,$0
112+
JMP internal∕runtime∕atomic·Or64(SB)
113+
114+
TEXT ·OrUint64(SB),NOSPLIT,$0
115+
JMP internal∕runtime∕atomic·Or64(SB)

0 commit comments

Comments
 (0)