]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: record only the first occurance in Reachparent graph
authorCherry Zhang <cherryyz@google.com>
Fri, 11 Sep 2020 02:41:29 +0000 (22:41 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 11 Sep 2020 13:53:03 +0000 (13:53 +0000)
In the deadcode pass, a type symbol may be marked twice, one
without UsedInIface, one with. For the second time, don't
update the Reachparent graph, so it only records the path of
the first time the symbol is reached. This ensures the
Reachparent graph is acyclic.

TODO: add a test. (This only affects GOEXPERIMENT=fieldtrack)

Change-Id: I68e8a1a69c3830bc8aee5df946151dc22dcb2b29
Reviewed-on: https://go-review.googlesource.com/c/go/+/254297
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/ld/deadcode.go

index 026942972368b8be19f179fcc8743d68146efb06..35545f950ef454ff76ffea95a57bb91ab3ba1885 100644 (file)
@@ -209,7 +209,7 @@ func (d *deadcodePass) mark(symIdx, parent loader.Sym) {
        if symIdx != 0 && !d.ldr.AttrReachable(symIdx) {
                d.wq.push(symIdx)
                d.ldr.SetAttrReachable(symIdx, true)
-               if objabi.Fieldtrack_enabled != 0 {
+               if objabi.Fieldtrack_enabled != 0 && d.ldr.Reachparent[symIdx] == 0 {
                        d.ldr.Reachparent[symIdx] = parent
                }
                if *flagDumpDep {