1
0
mirror of https://github.com/golang/go synced 2024-11-22 00:44:39 -07:00

pragma textflag

fixes latent bugs in go and defer

R=r
OCL=23613
CL=23613
This commit is contained in:
Ken Thompson 2009-01-27 14:12:35 -08:00
parent 53e69e1db5
commit e90314d024
8 changed files with 27 additions and 19 deletions

View File

@ -1334,5 +1334,12 @@ praghjdicks(void)
;
}
void
pragtextflag(void)
{
while(getnsc() != '\n')
;
}
#include "../cc/lexbody"
#include "../cc/macbody"

View File

@ -1473,7 +1473,9 @@ gpseudo(int a, Sym *s, Node *n)
p->as = a;
p->from.type = D_EXTERN;
p->from.sym = s;
p->from.scale = (profileflg ? 0 : NOPROF);
p->from.scale = textflag;
textflag = 0;
if(s->class == CSTATIC)
p->from.type = D_STATIC;
naddr(n, &p->to);

View File

@ -1363,7 +1363,9 @@ gpseudo(int a, Sym *s, Node *n)
p->as = a;
p->from.type = D_EXTERN;
p->from.sym = s;
p->from.scale = (profileflg ? 0 : NOPROF);
p->from.scale = textflag;
textflag = 0;
if(s->class == CSTATIC)
p->from.type = D_STATIC;
naddr(n, &p->to);

View File

@ -498,7 +498,7 @@ EXTERN Term term[NTERM];
EXTERN int nterm;
EXTERN int packflg;
EXTERN int fproundflg;
EXTERN int profileflg;
EXTERN int textflag;
EXTERN int ncontin;
EXTERN int canreach;
EXTERN int warnreach;
@ -747,7 +747,7 @@ void arginit(void);
void pragvararg(void);
void pragpack(void);
void pragfpround(void);
void pragprofile(void);
void pragtextflag(void);
void pragincomplete(void);
/*

View File

@ -450,25 +450,19 @@ pragfpround(void)
}
void
pragprofile(void)
pragtextflag(void)
{
Sym *s;
profileflg = 0;
textflag = 0;
s = getsym();
if(s) {
profileflg = atoi(s->name+1);
if(strcmp(s->name, "on") == 0 ||
strcmp(s->name, "yes") == 0)
profileflg = 1;
}
textflag = 7;
if(s)
textflag = atoi(s->name+1);
while(getnsc() != '\n')
;
if(debug['f'])
if(profileflg)
print("%4ld: profileflg %d\n", lineno, profileflg);
else
print("%4ld: profileflg off\n", lineno);
print("%4ld: textflag %d\n", lineno, textflag);
}
void

View File

@ -75,7 +75,6 @@ main(int argc, char *argv[])
ginit();
arginit();
profileflg = 1; /* #pragma can turn it off */
tufield = simplet((1L<<tfield->etype) | BUNSIGNED);
ndef = 0;
outfile = 0;

View File

@ -725,8 +725,8 @@ macprag(void)
pragfpround();
return;
}
if(s && strcmp(s->name, "profile") == 0) {
pragprofile();
if(s && strcmp(s->name, "textflag") == 0) {
pragtextflag();
return;
}
if(s && strcmp(s->name, "varargck") == 0) {

View File

@ -155,6 +155,7 @@ malg(int32 stacksize)
return g;
}
#pragma textflag 7
void
sys·newproc(int32 siz, byte* fn, byte* arg0)
{
@ -204,6 +205,7 @@ sys·newproc(int32 siz, byte* fn, byte* arg0)
//printf(" goid=%d\n", newg->goid);
}
#pragma textflag 7
void
sys·deferproc(int32 siz, byte* fn, byte* arg0)
{
@ -219,6 +221,7 @@ sys·deferproc(int32 siz, byte* fn, byte* arg0)
g->defer = d;
}
#pragma textflag 7
void
sys·deferreturn(int32 arg0)
{
@ -760,6 +763,7 @@ newstack(void)
*(int32*)345 = 123; // never return
}
#pragma textflag 7
void
sys·morestack(uint64 u)
{