diff options
| author | Mauri de Souza Meneguzzo <mauri870@gmail.com> | 2024-10-31 10:48:14 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2024-10-31 16:57:53 +0000 |
| commit | 5dbb0a5c6b58f565feb5ac85e42f139343a9eafa (patch) | |
| tree | 6c98203ba9d4bff3bdfbfdfeba1782ed8cd302a6 /src/internal/runtime | |
| parent | 6d39245514c675cdea5c7fd7f778e97bf0728dd5 (diff) | |
| download | go-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')
| -rw-r--r-- | src/internal/runtime/atomic/atomic_arm.go | 12 |
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 |
