mirror of
https://github.com/golang/go.git
synced 2025-05-16 21:04:38 +00:00
static init reenabled
R=r OCL=29358 CL=29358
This commit is contained in:
parent
ce5bcbe37f
commit
802e1a6104
@ -11,6 +11,21 @@ static struct
|
|||||||
Type* type;
|
Type* type;
|
||||||
} xxx;
|
} xxx;
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TC_xxx,
|
||||||
|
|
||||||
|
TC_unknown, // class
|
||||||
|
TC_struct,
|
||||||
|
TC_array,
|
||||||
|
TC_slice,
|
||||||
|
TC_map,
|
||||||
|
|
||||||
|
TS_start, // state
|
||||||
|
TS_middle,
|
||||||
|
TS_end,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the init code (thru initfix) reformats the
|
* the init code (thru initfix) reformats the
|
||||||
* var = ...
|
* var = ...
|
||||||
@ -26,6 +41,23 @@ static struct
|
|||||||
* write the code in this form, but ...
|
* write the code in this form, but ...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
typeclass(Type *t)
|
||||||
|
{
|
||||||
|
if(t != T)
|
||||||
|
switch(t->etype) {
|
||||||
|
case TSTRUCT:
|
||||||
|
return TC_struct;
|
||||||
|
case TARRAY:
|
||||||
|
if(t->bound >= 0)
|
||||||
|
return TC_array;
|
||||||
|
return TC_slice;
|
||||||
|
case TMAP:
|
||||||
|
return TC_map;
|
||||||
|
}
|
||||||
|
return TC_unknown;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
initlin(Node* n)
|
initlin(Node* n)
|
||||||
{
|
{
|
||||||
@ -78,16 +110,6 @@ sametmp(Node *n1, Node *n2)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
indsametmp(Node *n1, Node *n2)
|
|
||||||
{
|
|
||||||
if(n1->op == OIND)
|
|
||||||
if(inittmp(n1->left))
|
|
||||||
if(n1->left->xoffset == n2->xoffset)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Node*
|
Node*
|
||||||
findarg(Node *n, char *arg, char *fn)
|
findarg(Node *n, char *arg, char *fn)
|
||||||
{
|
{
|
||||||
@ -203,7 +225,11 @@ mapindex(Node *n)
|
|||||||
|
|
||||||
// pull all the primatives
|
// pull all the primatives
|
||||||
key = findarg(n, "key", "mapassign1");
|
key = findarg(n, "key", "mapassign1");
|
||||||
|
if(key == N)
|
||||||
|
return N;
|
||||||
val = findarg(n, "val", "mapassign1");
|
val = findarg(n, "val", "mapassign1");
|
||||||
|
if(val == N)
|
||||||
|
return N;
|
||||||
index = nodintconst(xxx.type->bound);
|
index = nodintconst(xxx.type->bound);
|
||||||
xxx.type->bound++;
|
xxx.type->bound++;
|
||||||
dowidth(xxx.type);
|
dowidth(xxx.type);
|
||||||
@ -227,83 +253,200 @@ mapindex(Node *n)
|
|||||||
// look through the whole structure
|
// look through the whole structure
|
||||||
// and substitute references of B to A.
|
// and substitute references of B to A.
|
||||||
// some rewrite goes on also.
|
// some rewrite goes on also.
|
||||||
int
|
void
|
||||||
initsub(Node *n, Node *nam)
|
initsub(Node *n, Node *nam)
|
||||||
{
|
{
|
||||||
Iter iter;
|
Iter iter;
|
||||||
Node *r, *w;
|
Node *r, *w, *c;
|
||||||
int any;
|
int class, state;
|
||||||
|
|
||||||
any = 0;
|
// we could probably get a little more
|
||||||
r = listfirst(&iter, &xxx.list);
|
// out of this if we allow minimal simple
|
||||||
while(r != N) {
|
// expression on the right (eg OADDR-ONAME)
|
||||||
switch(r->op) {
|
if(n->op != ONAME)
|
||||||
case OAS:
|
return 0;
|
||||||
case OEMPTY:
|
|
||||||
if(r->left != N)
|
|
||||||
switch(r->left->op) {
|
|
||||||
case ONAME:
|
|
||||||
if(sametmp(r->left, nam)) {
|
|
||||||
any = 1;
|
|
||||||
r->left = n;
|
|
||||||
|
|
||||||
w = slicerewrite(r->right);
|
class = typeclass(nam->type);
|
||||||
if(w != N) {
|
state = TS_start;
|
||||||
n = w->left; // from now on use fixed array
|
|
||||||
r->right = w;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
w = maprewrite(r->right);
|
switch(class) {
|
||||||
if(w != N) {
|
case TC_struct:
|
||||||
n = w->left; // from now on use fixed array
|
goto str;
|
||||||
r->right = w;
|
case TC_array:
|
||||||
break;
|
goto ary;
|
||||||
}
|
case TC_slice:
|
||||||
}
|
goto sli;
|
||||||
break;
|
case TC_map:
|
||||||
case ODOT:
|
goto map;
|
||||||
if(sametmp(r->left->left, nam)) {
|
|
||||||
any = 1;
|
|
||||||
r->left->left = n;
|
|
||||||
}
|
|
||||||
if(indsametmp(r->left->left, nam)) {
|
|
||||||
any = 1;
|
|
||||||
r->left->left->left = n;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OINDEX:
|
|
||||||
if(sametmp(r->left->left, nam)) {
|
|
||||||
any = 1;
|
|
||||||
r->left->left = n;
|
|
||||||
}
|
|
||||||
if(indsametmp(r->left->left, nam)) {
|
|
||||||
any = 1;
|
|
||||||
r->left->left->left = n;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OCALL:
|
|
||||||
// call to mapassign1
|
|
||||||
// look through the parameters
|
|
||||||
w = findarg(r, "hmap", "mapassign1");
|
|
||||||
if(w == N)
|
|
||||||
break;
|
|
||||||
if(sametmp(w, nam)) {
|
|
||||||
any = 1;
|
|
||||||
*r = *mapindex(r);
|
|
||||||
}
|
|
||||||
if(indsametmp(w, nam)) {
|
|
||||||
fatal("indirect map index");
|
|
||||||
any = 1;
|
|
||||||
w->right->left = n;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
r = listnext(&iter);
|
|
||||||
}
|
}
|
||||||
return any;
|
return 0;
|
||||||
|
|
||||||
|
str:
|
||||||
|
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
|
||||||
|
if(r->op != OAS && r->op != OEMPTY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// optional first usage "nam = N"
|
||||||
|
if(r->right == N && sametmp(r->left, nam)) {
|
||||||
|
if(state != TS_start) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: str-first and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// last usage "n = nam"
|
||||||
|
if(r->left != N && sametmp(r->right, nam)) {
|
||||||
|
if(state == TS_end) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: str-last and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_end;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// middle usage "(nam DOT name) AS expr"
|
||||||
|
if(r->left->op != ODOT || !sametmp(r->left->left, nam))
|
||||||
|
continue;
|
||||||
|
if(state == TS_end) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: str-middle and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->left->left = n;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
ary:
|
||||||
|
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
|
||||||
|
if(r->op != OAS && r->op != OEMPTY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// optional first usage "nam = N"
|
||||||
|
if(r->right == N && sametmp(r->left, nam)) {
|
||||||
|
if(state != TS_start) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-first and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// last usage "n = nam"
|
||||||
|
if(r->left != N && sametmp(r->right, nam)) {
|
||||||
|
if(state == TS_end) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-last and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_end;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// middle usage "(nam INDEX literal) = expr"
|
||||||
|
if(r->left->op != OINDEX || !sametmp(r->left->left, nam))
|
||||||
|
continue;
|
||||||
|
if(state == TS_end) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-middle and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->left->left = n;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
sli:
|
||||||
|
w = N;
|
||||||
|
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
|
||||||
|
if(r->op != OAS && r->op != OEMPTY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// first usage "nam = (newarray CALL args)"
|
||||||
|
if(r->right != N && sametmp(r->left, nam)) {
|
||||||
|
w = slicerewrite(r->right);
|
||||||
|
if(w == N)
|
||||||
|
continue;
|
||||||
|
if(state != TS_start) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-first and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->right = w;
|
||||||
|
r->left = n;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// last usage "n = nam"
|
||||||
|
if(r->left != N && sametmp(r->right, nam)) {
|
||||||
|
if(state != TS_middle) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-last and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_end;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// middle usage "(nam INDEX literal) = expr"
|
||||||
|
if(r->left->op != OINDEX || !sametmp(r->left->left, nam))
|
||||||
|
continue;
|
||||||
|
if(state != TS_middle) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-middle and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->left->left = w->left;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
map:
|
||||||
|
return;
|
||||||
|
w = N;
|
||||||
|
for(r=listfirst(&iter, &xxx.list); r != N; r = listnext(&iter)) {
|
||||||
|
if(r->op == OCALL) {
|
||||||
|
// middle usage "(CALL mapassign1 key, val, map)"
|
||||||
|
c = mapindex(r);
|
||||||
|
if(c == N)
|
||||||
|
continue;
|
||||||
|
state = TS_middle;
|
||||||
|
*r = *c;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(r->op != OAS && r->op != OEMPTY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// first usage "nam = (newmap CALL args)"
|
||||||
|
if(r->right != N && sametmp(r->left, nam)) {
|
||||||
|
w = maprewrite(r->right);
|
||||||
|
if(w == N)
|
||||||
|
continue;
|
||||||
|
if(state != TS_start) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-first and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_middle;
|
||||||
|
r->right = w;
|
||||||
|
r->left = n;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// last usage "n = nam"
|
||||||
|
if(r->left != N && sametmp(r->right, nam)) {
|
||||||
|
if(state != TS_middle) {
|
||||||
|
dump("", r);
|
||||||
|
fatal("initsub: ary-last and state=%d", state);
|
||||||
|
}
|
||||||
|
state = TS_end;
|
||||||
|
r->op = OEMPTY;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Node*
|
Node*
|
||||||
@ -312,12 +455,11 @@ initfix(Node* n)
|
|||||||
Iter iter;
|
Iter iter;
|
||||||
Node *r;
|
Node *r;
|
||||||
|
|
||||||
//dump("prelin", n);
|
|
||||||
|
|
||||||
xxx.list = N;
|
xxx.list = N;
|
||||||
initlin(n);
|
initlin(n);
|
||||||
xxx.list = rev(xxx.list);
|
xxx.list = rev(xxx.list);
|
||||||
if(1)
|
|
||||||
|
if(0)
|
||||||
return xxx.list;
|
return xxx.list;
|
||||||
|
|
||||||
if(debug['A'])
|
if(debug['A'])
|
||||||
@ -328,8 +470,7 @@ dump("preinitfix", xxx.list);
|
|||||||
while(r != N) {
|
while(r != N) {
|
||||||
if(r->op == OAS)
|
if(r->op == OAS)
|
||||||
if(inittmp(r->right)) {
|
if(inittmp(r->right)) {
|
||||||
if(initsub(r->left, r->right))
|
initsub(r->left, r->right);
|
||||||
r->op = OEMPTY;
|
|
||||||
}
|
}
|
||||||
r = listnext(&iter);
|
r = listnext(&iter);
|
||||||
}
|
}
|
||||||
|
@ -2382,6 +2382,7 @@ tempname(Node *n, Type *t)
|
|||||||
// give each tmp a different name so that there
|
// give each tmp a different name so that there
|
||||||
// a chance to registerizer them
|
// a chance to registerizer them
|
||||||
snprint(namebuf, sizeof(namebuf), "autotmp_%.4d", statuniqgen);
|
snprint(namebuf, sizeof(namebuf), "autotmp_%.4d", statuniqgen);
|
||||||
|
statuniqgen++;
|
||||||
s = lookup(namebuf);
|
s = lookup(namebuf);
|
||||||
|
|
||||||
memset(n, 0, sizeof(*n));
|
memset(n, 0, sizeof(*n));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user