]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/compile: add //go:uintptrkeepalive
authorMichael Pratt <mpratt@google.com>
Fri, 25 Feb 2022 19:21:25 +0000 (14:21 -0500)
committerMichael Pratt <mpratt@google.com>
Thu, 21 Apr 2022 18:06:38 +0000 (18:06 +0000)
commit342b495301bbd8b75c2721212a08ce41e3f82265
tree6fce352fb0c644e25a3360f709b8f3a3da69f103
parente25a5ce120673835a7e6c92bf0d88f44a61e9079
cmd/compile: add //go:uintptrkeepalive

This CL exports the existing ir.UintptrKeepAlive via the new directive
//go:uintptrkeepalive. This makes the compiler insert KeepAlives for
pointers converted to uintptr in calls, keeping them alive for the
duration of the call.

//go:uintptrkeepalive requires //go:nosplit, as stack growth can't
handle these arguments (it cannot know which are pointers). We currently
check this on the immediate function, but the actual restriction applies
to all transitive calls.

The existing //go:uintptrescapes is an extension of
//go:uintptrkeepalive which forces pointers to escape to the heap, thus
eliminating the stack growth issue.

This pragma is limited to the standard library.

For #51087

Change-Id: If9a19d484d3561b4219e5539b70c11a3cc09391e
Reviewed-on: https://go-review.googlesource.com/c/go/+/388095
Run-TryBot: Michael Pratt <mpratt@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
src/cmd/compile/doc.go
src/cmd/compile/internal/escape/escape.go
src/cmd/compile/internal/inline/inl.go
src/cmd/compile/internal/ir/node.go
src/cmd/compile/internal/noder/decl.go
src/cmd/compile/internal/noder/lex.go
src/cmd/compile/internal/noder/noder.go
src/cmd/compile/internal/noder/writer.go
src/runtime/HACKING.md
test/live_uintptrkeepalive.go
test/uintptrkeepalive.go [new file with mode: 0644]