]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/compile: eagerly create LSym for closures
authorMichael Pratt <mpratt@google.com>
Fri, 9 Sep 2022 20:23:39 +0000 (16:23 -0400)
committerMichael Pratt <mpratt@google.com>
Fri, 30 Sep 2022 20:04:54 +0000 (20:04 +0000)
commit33738ddd0a99991459d3bf215004e4327c2f8af2
tree37e5a9b70e9b025a513eb181aa3ad3bdb0c53b3e
parent4a49af5755564b5412acea2cfc3ac8556a7af453
cmd/compile: eagerly create LSym for closures

The linker needs FuncInfo metadata for all inlined functions. This is
typically handled by gc.enqueueFunc calling ir.InitLSym for all function
declarations in typecheck.Target.Decls (ir.UseClosure adds all closures
to Decls).

However, non-trivial closures in Decls are ignored, and are insteaded
enqueued when walk of the calling function discovers them.

This presents a problem for direct calls to closures. Inlining will
replace the entire closure definition with its body, which hides the
closure from walk and thus suppresses symbol creation.

Explicitly create a symbol early in this edge case to ensure we keep
this metadata.

InitLSym needs to move out of ssagen to avoid a circular dependency (it
doesn't have anything to do with ssa anyway). There isn't a great place
for it, so I placed it in ir, which seemed least objectionable.

The added test triggers one of these inlined direct non-trivial closure
calls, though the test needs CL 429637 to fail, which adds a FuncInfo
assertion to the linker. Note that the test must use "run" instead of
"compile" since the assertion is in the linker, and "compiler" doesn't
run the linker.

Fixes #54959.

Change-Id: I0bd1db4f3539a78da260934cd968372b7aa92546
Reviewed-on: https://go-review.googlesource.com/c/go/+/436240
Run-TryBot: Michael Pratt <mpratt@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
src/cmd/compile/internal/gc/compile.go
src/cmd/compile/internal/inline/inl.go
src/cmd/compile/internal/ir/abi.go [new file with mode: 0644]
src/cmd/compile/internal/ssagen/abi.go
test/fixedbugs/issue54959.go [new file with mode: 0644]