]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: clean up brloop
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 22 Mar 2017 05:06:39 +0000 (22:06 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 22 Mar 2017 16:11:31 +0000 (16:11 +0000)
Add docs.
Reduce indentation.

Passes toolstash-check -all.

Change-Id: I968d1af25989886ae9945052e05e211a107dde9c
Reviewed-on: https://go-review.googlesource.com/38443
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/internal/obj/pass.go

index 9794a109c24793cecde0769f05c3bd19f91a7896..4342902dec01adce4a4d763b67cc757dc9b43614 100644 (file)
@@ -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
                }
        }
 }