]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: generate ABI wrappers for //go:linkname'd symbols
authorAustin Clements <austin@google.com>
Fri, 31 May 2019 19:32:22 +0000 (15:32 -0400)
committerAustin Clements <austin@google.com>
Thu, 6 Jun 2019 19:44:08 +0000 (19:44 +0000)
commitb402bd4499a59c6f1fac4dc2684390b5d4d1c2eb
tree70ea78d9a606bca08d258208b48cbf3a1e6d4234
parentac8dbe7747971007d58eb39e2e7e615cf9f04493
cmd/compile: generate ABI wrappers for //go:linkname'd symbols

Calling a Go symbol from assembly in another package currently results
in a link failure because the Go symbol is defined as ABIInternal, but
the assembly call is from ABI0. In general this is okay because you
shouldn't do this anyway, but there are special cases where this is
necessary, especially between the runtime and packages closely tied to
the runtime in std.

Currently, we address this for runtime symbols with a hack in cmd/go
that knows to scan related packages when building the symabis file for
the runtime and runtime/internal/atomic. However, in addition to being
a messy solution in the first place, this hack causes races in cmd/go
that are difficult to work around.

We considered creating dummy references from assembly in the runtime
to these symbols, just to make sure they get ABI0 wrappers. However,
there are a fairly large number of these symbols on some platforms,
and it can vary significantly depending on build flags (e.g., race
mode), so even this solution is fairly unpalatable.

This CL addresses this by providing a way to mark symbols in Go code
that should be made available to assembly in other packages. Rather
than introduce a new pragma, we lightly expand the meaning of
"//go:linkname", since that pragma already generally indicates that
you're making the symbol available in a way it wasn't before. This
also dovetails nicely with the behavior of go:linkname in gccgo, which
makes unexported symbols available to other packages.

Follow-up CLs will make use of this and then remove the hack from
cmd/go.

Updates #31230.

Change-Id: I23060c97280626581f025c5c01fb8d24bb4c5159
Reviewed-on: https://go-review.googlesource.com/c/go/+/179860
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/gsubr.go