]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix stkptrsize calculation
authorRuss Cox <rsc@golang.org>
Thu, 8 Aug 2013 20:44:16 +0000 (16:44 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 8 Aug 2013 20:44:16 +0000 (16:44 -0400)
I moved the pointer block from one end of the frame
to the other toward the end of working on the last CL,
and of course that made the optimization no longer work.

Now it works again:

0030 (bug361.go:12) DATA    gclocals·0+0(SB)/4,$4
0030 (bug361.go:12) DATA    gclocals·0+4(SB)/4,$3
0030 (bug361.go:12) GLOBL   gclocals·0+0(SB),8,$8

Fixes arm build (this time for sure!).

TBR=golang-dev
CC=cshapiro, golang-dev, iant
https://golang.org/cl/12627044

src/cmd/gc/pgen.c

index ad005a8f92635f77f0ad0e259a56a8be519aa62a..64b03b341f9190c3ae950e66155806e2ea792483 100644 (file)
@@ -341,7 +341,7 @@ dumpgclocals(Node* fn, Sym *sym)
                node = ll->n;
                if(node->class == PAUTO && node->op == ONAME) {
                        if(haspointers(node->type)) {
-                               xoffset = node->xoffset + stksize;
+                               xoffset = node->xoffset + stkptrsize;
                                walktype1(node->type, &xoffset, bv);
                        }
                }
@@ -397,7 +397,6 @@ allocauto(Prog* ptxt)
        NodeList *ll;
        Node* n;
        vlong w;
-       vlong ptrlimit;
 
        if(curfn->dcl == nil) {
                stksize = 0;
@@ -437,7 +436,7 @@ allocauto(Prog* ptxt)
 
        // Reassign stack offsets of the locals that are still there.
        stksize = 0;
-       ptrlimit = -1;
+       stkptrsize = 0;
        for(ll = curfn->dcl; ll != nil; ll=ll->next) {
                n = ll->n;
                if (n->class != PAUTO || n->op != ONAME)
@@ -449,8 +448,8 @@ allocauto(Prog* ptxt)
                        fatal("bad width");
                stksize += w;
                stksize = rnd(stksize, n->type->align);
-               if(ptrlimit < 0 && haspointers(n->type))
-                       ptrlimit = stksize - w;
+               if(haspointers(n->type))
+                       stkptrsize = stksize;
                if(thechar == '5')
                        stksize = rnd(stksize, widthptr);
                if(stksize >= (1ULL<<31)) {
@@ -460,11 +459,6 @@ allocauto(Prog* ptxt)
                n->stkdelta = -stksize - n->xoffset;
        }
        stksize = rnd(stksize, widthptr);
-
-       if(ptrlimit < 0)
-               stkptrsize = 0;
-       else
-               stkptrsize = stksize - ptrlimit;
        stkptrsize = rnd(stkptrsize, widthptr);
 
        fixautoused(ptxt);