From: Russ Cox Date: Thu, 8 Aug 2013 20:44:16 +0000 (-0400) Subject: cmd/gc: fix stkptrsize calculation X-Git-Tag: go1.2rc2~715 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=390656affd8993ce6332dca3fa86d57659622fdf;p=gostls13.git cmd/gc: fix stkptrsize calculation 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 --- diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c index ad005a8f92..64b03b341f 100644 --- a/src/cmd/gc/pgen.c +++ b/src/cmd/gc/pgen.c @@ -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);