From a66d62a16800f6628d1372ee87aa67eb1766ec30 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 12 Aug 2009 13:18:19 -0700 Subject: whole-package compilation R=ken OCL=33063 CL=33095 --- src/cmd/gc/sinit.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'src/cmd/gc/sinit.c') 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; -- cgit v1.2.3