]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6l, cmd/8l: fix chaining bug in jump rewrite
authorRuss Cox <rsc@golang.org>
Wed, 30 May 2012 20:10:53 +0000 (16:10 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 30 May 2012 20:10:53 +0000 (16:10 -0400)
The code was inconsistent about when it used
brchain(x) and when it used x directly, with the result
that you could end up emitting code for brchain(x) but
leave the jump pointing at an unemitted x.

R=ken2
CC=golang-dev
https://golang.org/cl/6250077

src/cmd/6l/pass.c
src/cmd/8l/pass.c

index ecbebbbdc7731a0fec900ac777dad343bb18a294..758f61d651047822ff609c1bf519a5088002bad1 100644 (file)
@@ -192,6 +192,10 @@ loop:
                 * recurse to follow one path.
                 * continue loop on the other.
                 */
+               if((q = brchain(p->pcond)) != P)
+                       p->pcond = q;
+               if((q = brchain(p->link)) != P)
+                       p->link = q;
                if(p->from.type == D_CONST) {
                        if(p->from.offset == 1) {
                                /*
@@ -204,8 +208,8 @@ loop:
                                p->pcond = q;
                        }
                } else {                        
-                       q = brchain(p->link);
-                       if(q != P && q->mark)
+                       q = p->link;
+                       if(q->mark)
                        if(a != ALOOP) {
                                p->as = relinv(a);
                                p->link = p->pcond;
@@ -213,12 +217,9 @@ loop:
                        }
                }
                xfol(p->link, last);
-               q = brchain(p->pcond);
-               if(q->mark) {
-                       p->pcond = q;
+               if(p->pcond->mark)
                        return;
-               }
-               p = q;
+               p = p->pcond;
                goto loop;
        }
        p = p->link;
index d92c2f55a046f055d0fa6c39d2a6e38eb6e97dbc..9704e3530ed04aaa76059ef31da32315be4e6f0f 100644 (file)
@@ -184,6 +184,10 @@ loop:
                 * recurse to follow one path.
                 * continue loop on the other.
                 */
+               if((q = brchain(p->pcond)) != P)
+                       p->pcond = q;
+               if((q = brchain(p->link)) != P)
+                       p->link = q;
                if(p->from.type == D_CONST) {
                        if(p->from.offset == 1) {
                                /*
@@ -196,8 +200,8 @@ loop:
                                p->pcond = q;
                        }
                } else {
-                       q = brchain(p->link);
-                       if(q != P && q->mark)
+                       q = p->link;
+                       if(q->mark)
                        if(a != ALOOP) {
                                p->as = relinv(a);
                                p->link = p->pcond;
@@ -205,12 +209,9 @@ loop:
                        }
                }
                xfol(p->link, last);
-               q = brchain(p->pcond);
-               if(q->mark) {
-                       p->pcond = q;
+               if(p->pcond->mark)
                        return;
-               }
-               p = q;
+               p = p->pcond;
                goto loop;
        }
        p = p->link;