]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: mark closure DUPOK if the outer function is
authorCherry Mui <cherryyz@google.com>
Mon, 22 Apr 2024 19:58:29 +0000 (15:58 -0400)
committerCherry Mui <cherryyz@google.com>
Tue, 23 Apr 2024 01:21:39 +0000 (01:21 +0000)
If a function is DUPOK (e.g. an instantiation of a generic
function) and contains closures, the closure also needs to be
DUPOK. Otherwise, when the outer function is included in multiple
packages, the closure will also be included in these packages, and
the linker will dedup the outer function but not the closure,
causing duplicated symbols. In normal builds it is mostly still ok
as these closure symbols are only referenced by indices. But in
shared build mode all symbols are named and kept live, causing an
error.

Should fix the shared build mode.

Change-Id: I227d26e589465440335a4ec7e33d29739ed44aad
Reviewed-on: https://go-review.googlesource.com/c/go/+/580917
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/ir/func.go

index a74bb6ebda0d2083de96e9a0ce6ce385b89e63e7..d20836e0065a5113a21d215901841071054b9a3c 100644 (file)
@@ -481,6 +481,9 @@ func closureName(outerfn *Func, pos src.XPos, why Op) *types.Sym {
 func NewClosureFunc(fpos, cpos src.XPos, why Op, typ *types.Type, outerfn *Func, pkg *Package) *Func {
        fn := NewFunc(fpos, fpos, closureName(outerfn, cpos, why), typ)
        fn.SetIsHiddenClosure(outerfn != nil)
+       if outerfn != nil {
+               fn.SetDupok(outerfn.Dupok()) // if the outer function is dupok, so is the closure
+       }
 
        clo := &ClosureExpr{Func: fn}
        clo.op = OCLOSURE