From 390656affd8993ce6332dca3fa86d57659622fdf Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 8 Aug 2013 16:44:16 -0400 Subject: [PATCH] cmd/gc: fix stkptrsize calculation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c index ad005a8f926..64b03b341f9 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);