aboutsummaryrefslogtreecommitdiff
path: root/src/internal/runtime/atomic
diff options
context:
space:
mode:
authorMauri de Souza Meneguzzo <mauri870@gmail.com>2024-10-31 10:48:14 +0000
committerGopher Robot <gobot@golang.org>2024-10-31 16:57:53 +0000
commit5dbb0a5c6b58f565feb5ac85e42f139343a9eafa (patch)
tree6c98203ba9d4bff3bdfbfdfeba1782ed8cd302a6 /src/internal/runtime/atomic
parent6d39245514c675cdea5c7fd7f778e97bf0728dd5 (diff)
downloadgo-5dbb0a5c6b58f565feb5ac85e42f139343a9eafa.tar.xz
internal/runtime/atomic: fix uintptr usage in arm And8/Or8
In CL 622075, I introduced code that violated unsafe.Pointer rules by casting to uintptr and back across statements. This change corrects it. Change-Id: Ib6f6c08d9ce33aaeaf41f390c7e9f13a7b8cb974 GitHub-Last-Rev: 01cc68a87c8c0ad068c71a911013421f28a8b4ef GitHub-Pull-Request: golang/go#70129 Cq-Include-Trybots: luci.golang.try:gotip-linux-arm Reviewed-on: https://go-review.googlesource.com/c/go/+/623755 Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/internal/runtime/atomic')
-rw-r--r--src/internal/runtime/atomic/atomic_arm.go12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/internal/runtime/atomic/atomic_arm.go b/src/internal/runtime/atomic/atomic_arm.go
index dcc6ad99d6..8d8ffcf7dc 100644
--- a/src/internal/runtime/atomic/atomic_arm.go
+++ b/src/internal/runtime/atomic/atomic_arm.go
@@ -186,9 +186,8 @@ func Or8(addr *uint8, v uint8)
//go:nosplit
func goOr8(addr *uint8, v uint8) {
// Align down to 4 bytes and use 32-bit CAS.
- uaddr := uintptr(unsafe.Pointer(addr))
- addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
- word := uint32(v) << ((uaddr & 3) * 8) // little endian
+ addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3))
+ word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian
for {
old := *addr32
if Cas(addr32, old, old|word) {
@@ -203,10 +202,9 @@ func And8(addr *uint8, v uint8)
//go:nosplit
func goAnd8(addr *uint8, v uint8) {
// Align down to 4 bytes and use 32-bit CAS.
- uaddr := uintptr(unsafe.Pointer(addr))
- addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
- word := uint32(v) << ((uaddr & 3) * 8) // little endian
- mask := uint32(0xFF) << ((uaddr & 3) * 8) // little endian
+ addr32 := (*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(addr)) &^ 3))
+ word := uint32(v) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian
+ mask := uint32(0xFF) << ((uintptr(unsafe.Pointer(addr)) & 3) * 8) // little endian
word |= ^mask
for {
old := *addr32