mirror of
https://github.com/golang/go
synced 2024-11-20 03:44:40 -07: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:
parent
6e3853e294
commit
36c5c5bf40
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,8 +35,12 @@ 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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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, ...)
|
||||||
{
|
{
|
||||||
|
@ -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, ...)
|
||||||
{
|
{
|
||||||
|
@ -157,6 +157,7 @@ vprintf(int8 *s, byte *arg)
|
|||||||
// unlock(&debuglock);
|
// unlock(&debuglock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma textflag 7
|
||||||
void
|
void
|
||||||
·printf(String s, ...)
|
·printf(String s, ...)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user