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:
parent
53e69e1db5
commit
e90314d024
@ -1334,5 +1334,12 @@ praghjdicks(void)
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
pragtextflag(void)
|
||||
{
|
||||
while(getnsc() != '\n')
|
||||
;
|
||||
}
|
||||
|
||||
#include "../cc/lexbody"
|
||||
#include "../cc/macbody"
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user