aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/gc/esc.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/gc/esc.go')
-rw-r--r--src/cmd/compile/internal/gc/esc.go21
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 {