aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/abi/abiutils.go
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2021-03-31 20:02:26 -0400
committerDavid Chase <drchase@google.com>2021-04-01 01:26:29 +0000
commit5f646f0a984d43a2e9e99a1338145a862fef425e (patch)
treef1e481ce3c4a4f613428ebbe78737e26e84264d7 /src/cmd/compile/internal/abi/abiutils.go
parentec721d92bf35cd47543acf6792acd474fdd39446 (diff)
downloadgo-5f646f0a984d43a2e9e99a1338145a862fef425e.tar.gz
go-5f646f0a984d43a2e9e99a1338145a862fef425e.zip
cmd/compile: fix parameter offset calculation
For struct like { { a int64; b int16 }; c int32 }, on 64-bit machines the offset of c is 16, as the inner struct takes 16 bytes because we round up type size to its alignment. Update the abi package's offset calculation to include this. We only need to do this for struct type, because for all other types its size is naturally aligned. TODO: add a test. Change-Id: I0c661768cb1ed3cb409b20a88b7e23e059f8e3e1 Reviewed-on: https://go-review.googlesource.com/c/go/+/306449 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/abi/abiutils.go')
-rw-r--r--src/cmd/compile/internal/abi/abiutils.go1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/abi/abiutils.go b/src/cmd/compile/internal/abi/abiutils.go
index feda2153f7..56e008830f 100644
--- a/src/cmd/compile/internal/abi/abiutils.go
+++ b/src/cmd/compile/internal/abi/abiutils.go
@@ -214,6 +214,7 @@ func appendParamOffsets(offsets []int64, at int64, t *types.Type) ([]int64, int6
for _, f := range t.FieldSlice() {
offsets, at = appendParamOffsets(offsets, at, f.Type)
}
+ at = align(at, t) // type size is rounded up to its alignment
case types.TSLICE:
return appendParamOffsets(offsets, at, synthSlice)
case types.TSTRING: