diff options
author | Russ Cox <rsc@golang.org> | 2009-08-12 13:18:19 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-08-12 13:18:19 -0700 |
commit | a66d62a16800f6628d1372ee87aa67eb1766ec30 (patch) | |
tree | 0df44983afca9b1eeef9b0d8408acbb4dcfa921f /src/cmd/gc/sinit.c | |
parent | 32652606d49e99c4e9555ed0ab0cb8ccaf599780 (diff) | |
download | golang-a66d62a16800f6628d1372ee87aa67eb1766ec30.tar.gz |
whole-package compilation
R=ken
OCL=33063
CL=33095
Diffstat (limited to 'src/cmd/gc/sinit.c')
-rw-r--r-- | src/cmd/gc/sinit.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c index 83db9bff1..4b46f7c7c 100644 --- a/src/cmd/gc/sinit.c +++ b/src/cmd/gc/sinit.c @@ -457,13 +457,85 @@ return; } +static void +init1(Node *n, NodeList **out) +{ + NodeList *l; + + if(n == N) + return; + init1(n->left, out); + init1(n->right, out); + for(l=n->list; l; l=l->next) + init1(l->n, out); + + if(n->op != ONAME) + return; + switch(n->class) { + case PEXTERN: + case PFUNC: + break; + default: + return; + } + + if(n->initorder == 1) + return; + if(n->initorder == 2) + fatal("init loop"); + + // make sure that everything n depends on is initialized. + // n->defn is an assignment to n + n->initorder = 2; + if(n->defn != N) { + switch(n->defn->op) { + case ODCLFUNC: + for(l=n->defn->nbody; l; l=l->next) + init1(l->n, out); + break; + case OAS: + if(n->defn->left != n) { + default: + dump("defn", n->defn); + fatal("bad defn"); + } + init1(n->defn->right, out); + if(debug['j']) + print("%S\n", n->sym); + *out = list(*out, n->defn); + break; + } + } + n->initorder = 1; + return; +} + +static void +initreorder(NodeList *l, NodeList **out) +{ + Node *n; + + for(; l; l=l->next) { + n = l->n; + switch(n->op) { + case ODCLFUNC: + case ODCLCONST: + case ODCLTYPE: + continue; + } + initreorder(n->ninit, out); + n->ninit = nil; + init1(n, out); + } +} + NodeList* initfix(NodeList *l) { Node *r; xxx.list = nil; - initlin(l); + initreorder(l, &xxx.list); if(0) return xxx.list; |