summaryrefslogtreecommitdiff
path: root/src/cmd/gc/sinit.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-08-12 13:18:19 -0700
committerRuss Cox <rsc@golang.org>2009-08-12 13:18:19 -0700
commita66d62a16800f6628d1372ee87aa67eb1766ec30 (patch)
tree0df44983afca9b1eeef9b0d8408acbb4dcfa921f /src/cmd/gc/sinit.c
parent32652606d49e99c4e9555ed0ab0cb8ccaf599780 (diff)
downloadgolang-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.c74
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;