diff options
Diffstat (limited to 'src/cmd/compile/internal/gc/esc.go')
-rw-r--r-- | src/cmd/compile/internal/gc/esc.go | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 90ad75cbea..69b59646f1 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -472,9 +472,29 @@ func escAnalyze(all []*Node, recursive bool) { // visit the upstream of each dst, mark address nodes with // addrescapes, mark parameters unsafe + escapes := make([]uint16, len(e.dsts)) + for i, n := range e.dsts { + escapes[i] = n.Esc + } for _, n := range e.dsts { escflood(e, n) } + for { + done := true + for i, n := range e.dsts { + if n.Esc != escapes[i] { + done = false + if Debug['m'] > 2 { + Warnl(n.Lineno, "Reflooding %v %S", e.curfnSym(n), n) + } + escapes[i] = n.Esc + escflood(e, n) + } + } + if done { + break + } + } // for all top level functions, tag the typenodes corresponding to the param nodes for _, n := range all { @@ -1796,6 +1816,7 @@ func escwalkBody(e *EscState, level Level, dst *Node, src *Node, step *EscStep, } leaks = level.int() <= 0 && level.guaranteedDereference() <= 0 && dstE.Escloopdepth < modSrcLoopdepth + leaks = leaks || level.int() <= 0 && dst.Esc&EscMask == EscHeap osrcesc = src.Esc switch src.Op { |