aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2022-08-03 15:14:25 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2022-08-08 14:12:01 +0000
commit3ea3d0e8a7f4e2bfa96535aafb6bd802d2907808 (patch)
treecaec85cfb9ce0ec05bfd30c5b1a880be249855f4 /src
parent9463638ca883f07467ad8e294cf3ba7f7b175eb2 (diff)
downloadgo-3ea3d0e8a7f4e2bfa96535aafb6bd802d2907808.tar.xz
cmd/compile: correct alignment of atomic.Int64
Same as CL 417555, but for cmd/compile. Fixes #54220 Change-Id: I4cc6deaf0a87c952f636888b4ab73f81a44bfebd Reviewed-on: https://go-review.googlesource.com/c/go/+/420975 Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/noder/sizes.go11
-rw-r--r--src/cmd/compile/internal/types2/sizes.go4
2 files changed, 13 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/noder/sizes.go b/src/cmd/compile/internal/noder/sizes.go
index 9ba0e509d7..7820746db1 100644
--- a/src/cmd/compile/internal/noder/sizes.go
+++ b/src/cmd/compile/internal/noder/sizes.go
@@ -25,6 +25,17 @@ func (s *gcSizes) Alignof(T types2.Type) int64 {
// is the same as unsafe.Alignof(x[0]), but at least 1."
return s.Alignof(t.Elem())
case *types2.Struct:
+ if t.NumFields() == 0 && types2.IsSyncAtomicAlign64(T) {
+ // Special case: sync/atomic.align64 is an
+ // empty struct we recognize as a signal that
+ // the struct it contains must be
+ // 64-bit-aligned.
+ //
+ // This logic is equivalent to the logic in
+ // cmd/compile/internal/types/size.go:calcStructOffset
+ return 8
+ }
+
// spec: "For a variable x of struct type: unsafe.Alignof(x)
// is the largest of the values unsafe.Alignof(x.f) for each
// field f of x, but at least 1."
diff --git a/src/cmd/compile/internal/types2/sizes.go b/src/cmd/compile/internal/types2/sizes.go
index 4da309461f..c99a12b2e9 100644
--- a/src/cmd/compile/internal/types2/sizes.go
+++ b/src/cmd/compile/internal/types2/sizes.go
@@ -53,7 +53,7 @@ func (s *StdSizes) Alignof(T Type) int64 {
// is the same as unsafe.Alignof(x[0]), but at least 1."
return s.Alignof(t.elem)
case *Struct:
- if len(t.fields) == 0 && isSyncAtomicAlign64(T) {
+ if len(t.fields) == 0 && IsSyncAtomicAlign64(T) {
// Special case: sync/atomic.align64 is an
// empty struct we recognize as a signal that
// the struct it contains must be
@@ -104,7 +104,7 @@ func (s *StdSizes) Alignof(T Type) int64 {
return a
}
-func isSyncAtomicAlign64(T Type) bool {
+func IsSyncAtomicAlign64(T Type) bool {
named, ok := T.(*Named)
if !ok {
return false