]> Cypherpunks repositories - gostls13.git/commit
runtime/internal/atomic: panic nicely on unaligned 64-bit atomics
authorAustin Clements <austin@google.com>
Thu, 15 Oct 2020 19:52:58 +0000 (15:52 -0400)
committerAustin Clements <austin@google.com>
Fri, 16 Oct 2020 17:31:17 +0000 (17:31 +0000)
commit83317d9e3cb0674f71d1118d8814aefb31ac1239
tree16539cb2567000e6a77f2190a5380f9aff68c76c
parentafba990169f41d9026c923da5235584db32cab67
runtime/internal/atomic: panic nicely on unaligned 64-bit atomics

On 386 and arm, unaligned 64-bit atomics aren't safe, so we check for
this and panic. Currently, we panic by dereferencing nil, which may be
expedient but is pretty user-hostile since it gives no hint of what
the actual problem was.

This CL replaces this with an actual panic. The only subtlety here is
now the atomic assembly implementations are calling back into Go, so
they have to play nicely with stack maps and stack scanning. On 386,
this just requires declaring NO_LOCAL_POINTERS. On arm, this is
somewhat more complicated: first, we have to move the alignment check
into the functions that have Go signatures. Then we have to support
both the tail call from these functions to the underlying
implementation (which requires that they have no frame) and the call
into Go to panic (which requires that they have a frame). We resolve
this by forcing them to have no frame and setting up the frame
manually just before the panic call.

Change-Id: I19f1e860045df64088013db37a18acea47342c69
Reviewed-on: https://go-review.googlesource.com/c/go/+/262778
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/internal/atomic/asm_386.s
src/runtime/internal/atomic/asm_arm.s
src/runtime/internal/atomic/atomic_mipsx.go
src/runtime/internal/atomic/atomic_test.go
src/runtime/internal/atomic/unaligned.go [new file with mode: 0644]
src/sync/atomic/atomic_test.go