]> Cypherpunks repositories - gostls13.git/commit
runtime: align 12-byte objects to 8 bytes on 32-bit systems
authorMichael Anthony Knyszek <mknyszek@google.com>
Thu, 10 Sep 2020 21:20:46 +0000 (21:20 +0000)
committerMichael Knyszek <mknyszek@google.com>
Thu, 1 Oct 2020 19:13:03 +0000 (19:13 +0000)
commit5756b3560141d0c09c4a27d2025f5438f49f59f2
tree5566f0116be723146e00cb3b565b5ad2544f7314
parentcc2a5cf4b8b0aeaccd3dd439f8d3d68f25eef358
runtime: align 12-byte objects to 8 bytes on 32-bit systems

Currently on 32-bit systems 8-byte fields in a struct have an alignment
of 4 bytes, which means that atomic instructions may fault. This issue
is tracked in #36606.

Our current workaround is to allocate memory and put any such atomically
accessed fields at the beginning of the object. This workaround fails
because the tiny allocator might not align the object right. This case
specifically only happens with 12-byte objects because a type's size is
rounded up to its alignment. So if e.g. we have a type like:

type obj struct {
    a uint64
    b byte
}

then its size will be 12 bytes, because "a" will require a 4 byte
alignment. This argument may be extended to all objects of size 9-15
bytes.

So, make this workaround work by specifically aligning such objects to 8
bytes on 32-bit systems. This change leaves a TODO to remove the code
once #36606 gets resolved. It also adds a test which will presumably no
longer be necessary (the compiler should enforce the right alignment)
when it gets resolved as well.

Fixes #37262.

Change-Id: I3a34e5b014b3c37ed2e5e75e62d71d8640aa42bc
Reviewed-on: https://go-review.googlesource.com/c/go/+/254057
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Michael Knyszek <mknyszek@google.com>
src/runtime/malloc.go
src/runtime/malloc_test.go