1
0
mirror of https://github.com/golang/go synced 2024-10-03 04:21:22 -06:00

cc: disallow ... argument unless NOSPLIT is set.

check that NOSPLIT functions don't use too much stack.
correct some missing NOSPLITs in the runtime library.

Fixes bug reported in
https://groups.google.com/group/golang-nuts/t/efff68b73941eccf

R=ken2
CC=golang-dev
https://golang.org/cl/236041
This commit is contained in:
Russ Cox 2010-03-04 15:34:25 -08:00
parent 6e3853e294
commit 36c5c5bf40
8 changed files with 46 additions and 8 deletions

View File

@ -34,9 +34,17 @@
Prog* Prog*
gtext(Sym *s, int32 stkoff) gtext(Sym *s, int32 stkoff)
{ {
int32 a;
a = 0;
if(!(textflag & NOSPLIT))
a = argsize();
else if(stkoff >= 128)
yyerror("stack frame too large for NOSPLIT function");
gpseudo(ATEXT, s, nodconst(stkoff)); gpseudo(ATEXT, s, nodconst(stkoff));
p->to.type = D_CONST2; p->to.type = D_CONST2;
p->to.offset2 = argsize(); p->to.offset2 = a;
return p; return p;
} }

View File

@ -34,9 +34,13 @@ Prog*
gtext(Sym *s, int32 stkoff) gtext(Sym *s, int32 stkoff)
{ {
vlong v; vlong v;
v = argsize() << 32; v = 0;
if(!(textflag & NOSPLIT))
v |= argsize() << 32;
v |= stkoff & 0xffffffff; v |= stkoff & 0xffffffff;
if((textflag & NOSPLIT) && stkoff >= 128)
yyerror("stack frame too large for NOSPLIT function");
gpseudo(ATEXT, s, nodgconst(v, types[TVLONG])); gpseudo(ATEXT, s, nodgconst(v, types[TVLONG]));
return p; return p;

View File

@ -33,9 +33,17 @@
Prog* Prog*
gtext(Sym *s, int32 stkoff) gtext(Sym *s, int32 stkoff)
{ {
int32 a;
a = 0;
if(!(textflag & NOSPLIT))
a = argsize();
else if(stkoff >= 128)
yyerror("stack frame too large for NOSPLIT function");
gpseudo(ATEXT, s, nodconst(stkoff)); gpseudo(ATEXT, s, nodconst(stkoff));
p->to.type = D_CONST2; p->to.type = D_CONST2;
p->to.offset2 = argsize(); p->to.offset2 = a;
return p; return p;
} }

View File

@ -43,6 +43,7 @@ argsize(void)
case TVOID: case TVOID:
break; break;
case TDOT: case TDOT:
yyerror("function takes ... without textflag NOSPLIT");
s += 64; s += 64;
break; break;
default: default:

View File

@ -393,6 +393,7 @@ closed:
} }
// chansend1(hchan *chan any, elem any); // chansend1(hchan *chan any, elem any);
#pragma textflag 7
void void
·chansend1(Hchan* c, ...) ·chansend1(Hchan* c, ...)
{ {
@ -405,6 +406,7 @@ void
} }
// chansend2(hchan *chan any, elem any) (pres bool); // chansend2(hchan *chan any, elem any) (pres bool);
#pragma textflag 7
void void
·chansend2(Hchan* c, ...) ·chansend2(Hchan* c, ...)
{ {
@ -420,6 +422,7 @@ void
} }
// chanrecv1(hchan *chan any) (elem any); // chanrecv1(hchan *chan any) (elem any);
#pragma textflag 7
void void
·chanrecv1(Hchan* c, ...) ·chanrecv1(Hchan* c, ...)
{ {
@ -433,6 +436,7 @@ void
} }
// chanrecv2(hchan *chan any) (elem any, pres bool); // chanrecv2(hchan *chan any) (elem any, pres bool);
#pragma textflag 7
void void
·chanrecv2(Hchan* c, ...) ·chanrecv2(Hchan* c, ...)
{ {
@ -448,6 +452,7 @@ void
} }
// newselect(size uint32) (sel *byte); // newselect(size uint32) (sel *byte);
#pragma textflag 7
void void
·newselect(int32 size, ...) ·newselect(int32 size, ...)
{ {
@ -476,6 +481,7 @@ void
} }
// selectsend(sel *byte, hchan *chan any, elem any) (selected bool); // selectsend(sel *byte, hchan *chan any, elem any) (selected bool);
#pragma textflag 7
void void
·selectsend(Select *sel, Hchan *c, ...) ·selectsend(Select *sel, Hchan *c, ...)
{ {
@ -521,6 +527,7 @@ void
} }
// selectrecv(sel *byte, hchan *chan any, elem *any) (selected bool); // selectrecv(sel *byte, hchan *chan any, elem *any) (selected bool);
#pragma textflag 7
void void
·selectrecv(Select *sel, Hchan *c, ...) ·selectrecv(Select *sel, Hchan *c, ...)
{ {
@ -563,6 +570,7 @@ void
// selectdefaul(sel *byte) (selected bool); // selectdefaul(sel *byte) (selected bool);
#pragma textflag 7
void void
·selectdefault(Select *sel, ...) ·selectdefault(Select *sel, ...)
{ {

View File

@ -758,6 +758,7 @@ mapaccess(Hmap *h, byte *ak, byte *av, bool *pres)
} }
// mapaccess1(hmap *map[any]any, key any) (val any); // mapaccess1(hmap *map[any]any, key any) (val any);
#pragma textflag 7
void void
·mapaccess1(Hmap *h, ...) ·mapaccess1(Hmap *h, ...)
{ {
@ -785,6 +786,7 @@ void
} }
// mapaccess2(hmap *map[any]any, key any) (val any, pres bool); // mapaccess2(hmap *map[any]any, key any) (val any, pres bool);
#pragma textflag 7
void void
·mapaccess2(Hmap *h, ...) ·mapaccess2(Hmap *h, ...)
{ {
@ -844,6 +846,7 @@ mapassign(Hmap *h, byte *ak, byte *av)
} }
// mapassign1(hmap *map[any]any, key any, val any); // mapassign1(hmap *map[any]any, key any, val any);
#pragma textflag 7
void void
·mapassign1(Hmap *h, ...) ·mapassign1(Hmap *h, ...)
{ {
@ -856,6 +859,7 @@ void
} }
// mapassign2(hmap *map[any]any, key any, val any, pres bool); // mapassign2(hmap *map[any]any, key any, val any, pres bool);
#pragma textflag 7
void void
·mapassign2(Hmap *h, ...) ·mapassign2(Hmap *h, ...)
{ {
@ -934,6 +938,7 @@ mapiternext(struct hash_iter *it)
} }
// mapiter1(hiter *any) (key any); // mapiter1(hiter *any) (key any);
#pragma textflag 7
void void
·mapiter1(struct hash_iter *it, ...) ·mapiter1(struct hash_iter *it, ...)
{ {
@ -973,6 +978,7 @@ mapiterkey(struct hash_iter *it, void *ak)
} }
// mapiter2(hiter *any) (key any, val any); // mapiter2(hiter *any) (key any, val any);
#pragma textflag 7
void void
·mapiter2(struct hash_iter *it, ...) ·mapiter2(struct hash_iter *it, ...)
{ {

View File

@ -157,6 +157,7 @@ vprintf(int8 *s, byte *arg)
// unlock(&debuglock); // unlock(&debuglock);
} }
#pragma textflag 7
void void
·printf(String s, ...) ·printf(String s, ...)
{ {

View File

@ -666,6 +666,7 @@ oldstack(void)
uint32 args; uint32 args;
byte *sp; byte *sp;
G *g1; G *g1;
static int32 goid;
//printf("oldstack m->cret=%p\n", m->cret); //printf("oldstack m->cret=%p\n", m->cret);
@ -678,6 +679,7 @@ oldstack(void)
sp -= args; sp -= args;
mcpy(top->fp, sp, args); mcpy(top->fp, sp, args);
} }
goid = old.gobuf.g->goid; // fault if g is bad, before gogo
stackfree(g1->stackguard - StackGuard); stackfree(g1->stackguard - StackGuard);
g1->stackbase = old.stackbase; g1->stackbase = old.stackbase;
@ -765,9 +767,9 @@ malg(int32 stacksize)
*/ */
#pragma textflag 7 #pragma textflag 7
void void
·newproc(int32 siz, byte* fn, byte* arg0) ·newproc(int32 siz, byte* fn, ...)
{ {
newproc1(fn, (byte*)&arg0, siz, 0); newproc1(fn, (byte*)(&fn+1), siz, 0);
} }
void void
@ -815,13 +817,13 @@ newproc1(byte *fn, byte *argp, int32 narg, int32 nret)
#pragma textflag 7 #pragma textflag 7
void void
·deferproc(int32 siz, byte* fn, byte* arg0) ·deferproc(int32 siz, byte* fn, ...)
{ {
Defer *d; Defer *d;
d = malloc(sizeof(*d) + siz - sizeof(d->args)); d = malloc(sizeof(*d) + siz - sizeof(d->args));
d->fn = fn; d->fn = fn;
d->sp = (byte*)&arg0; d->sp = (byte*)(&fn+1);
d->siz = siz; d->siz = siz;
mcpy(d->args, d->sp, d->siz); mcpy(d->args, d->sp, d->siz);