From: Josh Bleecher Snyder Date: Wed, 22 Mar 2017 05:06:39 +0000 (-0700) Subject: cmd/internal/obj: clean up brloop X-Git-Tag: go1.9beta1~1045 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2f2cd557a642b96a697b09cc84c0a5e342d41d3b;p=gostls13.git cmd/internal/obj: clean up brloop Add docs. Reduce indentation. Passes toolstash-check -all. Change-Id: I968d1af25989886ae9945052e05e211a107dde9c Reviewed-on: https://go-review.googlesource.com/38443 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 9794a109c2..4342902dec 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -32,21 +32,21 @@ package obj // Code and data passes. -func brloop(ctxt *Link, p *Prog) *Prog { - var q *Prog - +// brloop returns the ultimate destination of the series of unconditional jumps beginning at p. +// In the case of an infinite loop, brloop returns nil. +func brloop(p *Prog) *Prog { c := 0 - for q = p; q != nil; q = q.Pcond { + for q := p; q != nil; q = q.Pcond { if q.As != AJMP || q.Pcond == nil { - break + return q } c++ if c >= 5000 { + // infinite loop return nil } } - - return q + panic("unreachable") } // checkaddr checks that a has an expected encoding, especially TYPE_CONST vs TYPE_ADDR. @@ -169,16 +169,18 @@ func linkpatch(ctxt *Link, sym *LSym) { p.Pcond = q } - if ctxt.Flag_optimize { - for p := sym.Text; p != nil; p = p.Link { - if p.Pcond != nil { - p.Pcond = brloop(ctxt, p.Pcond) - if p.Pcond != nil { - if p.To.Type == TYPE_BRANCH { - p.To.Offset = p.Pcond.Pc - } - } - } + if !ctxt.Flag_optimize { + return + } + + // Collapse series of jumps to jumps. + for p := sym.Text; p != nil; p = p.Link { + if p.Pcond == nil { + continue + } + p.Pcond = brloop(p.Pcond) + if p.Pcond != nil && p.To.Type == TYPE_BRANCH { + p.To.Offset = p.Pcond.Pc } } }