From: Ken Thompson Date: Mon, 4 May 2009 02:09:14 +0000 (-0700) Subject: more morestack fiddling X-Git-Tag: weekly.2009-11-06~1721 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5963f59067914162ff44bfc512bbd19879b91ab1;p=gostls13.git more morestack fiddling R=r OCL=28204 CL=28204 --- diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c index b26db1dcd6..69b5c7115b 100644 --- a/src/cmd/6l/pass.c +++ b/src/cmd/6l/pass.c @@ -477,40 +477,52 @@ brloop(Prog *p) return q; } +static char* +morename[] = +{ + "sys·morestack00", + "sys·morestack10", + "sys·morestack01", + "sys·morestack11", + + "sys·morestack8", + "sys·morestack16", + "sys·morestack24", + "sys·morestack32", + "sys·morestack40", + "sys·morestack48", +}; +Prog* pmorestack[nelem(morename)]; +Sym* symmorestack[nelem(morename)]; + void dostkoff(void) { Prog *p, *q, *q1; int32 autoffset, deltasp; int a, f, curframe, curbecome, maxbecome, pcsize; - Prog *pmorestack00, *pmorestack01, *pmorestack10, *pmorestack11; - Sym *symmorestack00, *symmorestack01, *symmorestack10, *symmorestack11; - uint32 moreconst1, moreconst2; + uint32 moreconst1, moreconst2, i; - pmorestack00 = P; - pmorestack01 = P; - pmorestack10 = P; - pmorestack11 = P; - - symmorestack00 = lookup("sys·morestack00", 0); - symmorestack01 = lookup("sys·morestack01", 0); - symmorestack10 = lookup("sys·morestack10", 0); - symmorestack11 = lookup("sys·morestack11", 0); + for(i=0; ilink) { if(p->as == ATEXT) { - if(p->from.sym == symmorestack00) - pmorestack00 = p; - if(p->from.sym == symmorestack01) - pmorestack01 = p; - if(p->from.sym == symmorestack10) - pmorestack10 = p; - if(p->from.sym == symmorestack11) - pmorestack11 = p; + for(i=0; ifrom.sym == symmorestack[i]) { + pmorestack[i] = p; + break; + } + } } } - if(pmorestack00 == P || pmorestack01 == P || pmorestack10 == P || pmorestack11 == P) - diag("sys·morestack[01][01] not defined"); + + for(i=0; ias = ACALL; p->to.type = D_BRANCH; - p->pcond = pmorestack00; - p->to.sym = symmorestack00; + p->pcond = pmorestack[0]; + p->to.sym = symmorestack[0]; if(q1) { q1->pcond = p; q1 = P; @@ -687,8 +700,19 @@ dostkoff(void) p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; - p->pcond = pmorestack10; - p->to.sym = symmorestack10; + p->pcond = pmorestack[1]; + p->to.sym = symmorestack[1]; + } else + if(moreconst1 == 0 && moreconst2 <= 48 && moreconst2%8 == 0) { + i = moreconst2/8 + 3; + p->as = ACALL; + p->to.type = D_BRANCH; + p->pcond = pmorestack[i]; + p->to.sym = symmorestack[i]; + if(q1) { + q1->pcond = p; + q1 = P; + } } else if(moreconst1 == 0 && moreconst2 != 0) { p->as = AMOVL; @@ -703,10 +727,9 @@ dostkoff(void) p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; - p->pcond = pmorestack01; - p->to.sym = symmorestack01; + p->pcond = pmorestack[2]; + p->to.sym = symmorestack[2]; } else { - p->as = AMOVQ; p->from.type = D_CONST; p->from.offset = (uint64)moreconst2 << 32; @@ -720,8 +743,8 @@ dostkoff(void) p = appendp(p); p->as = ACALL; p->to.type = D_BRANCH; - p->pcond = pmorestack11; - p->to.sym = symmorestack11; + p->pcond = pmorestack[3]; + p->to.sym = symmorestack[3]; } } @@ -947,14 +970,18 @@ export(void) n = 0; for(i = 0; i < NHASH; i++) for(s = hash[i]; s != S; s = s->link) - if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) + if(s->sig != 0 && s->type != SXREF && + s->type != SUNDEF && + (nexports == 0 || s->subtype == SEXPORT)) n++; esyms = malloc(n*sizeof(Sym*)); ne = n; n = 0; for(i = 0; i < NHASH; i++) for(s = hash[i]; s != S; s = s->link) - if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) + if(s->sig != 0 && s->type != SXREF && + s->type != SUNDEF && + (nexports == 0 || s->subtype == SEXPORT)) esyms[n++] = s; for(i = 0; i < ne-1; i++) for(j = i+1; j < ne; j++) diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index e1b7acdad2..c481ba02ad 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -572,16 +572,37 @@ sweeplist(Prog **first, Prog **last) *last = q; } +static char* +morename[] = +{ + "sys·morestack", + "sys·morestackx", + + "sys·morestack00", + "sys·morestack10", + "sys·morestack01", + "sys·morestack11", + + "sys·morestack8", + "sys·morestack16", + "sys·morestack24", + "sys·morestack32", + "sys·morestack40", + "sys·morestack48", +}; + void deadcode(void) { + int i; + if(debug['v']) Bprint(&bso, "%5.2f deadcode\n", cputime()); mark(lookup(INITENTRY, 0)); - mark(lookup("sys·morestack", 0)); + for(i=0; icret