aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2010-09-20 14:23:25 -0700
committerKen Thompson <ken@golang.org>2010-09-20 14:23:25 -0700
commit103d75666344725d724eb570da735ef1583000aa (patch)
treed37d522511c452146e6b107b0fe81514cb94a07a
parentd4c8a545793eb5281aab67f19a4dd8fe019986d2 (diff)
downloadgo-103d75666344725d724eb570da735ef1583000aa.tar.gz
go-103d75666344725d724eb570da735ef1583000aa.zip
loader fix
static init redo R=rsc CC=golang-dev https://golang.org/cl/2254041
-rw-r--r--src/cmd/gc/go.h3
-rw-r--r--src/cmd/gc/sinit.c144
-rw-r--r--src/cmd/gc/walk.c4
-rw-r--r--src/cmd/ld/dwarf.c2
4 files changed, 98 insertions, 55 deletions
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index ab6386cb56..06bc573733 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -1023,7 +1023,7 @@ void walkselect(Node *sel);
/*
* sinit.c
*/
-void anylit(Node *n, Node *var, NodeList **init);
+void anylit(int, Node *n, Node *var, NodeList **init);
int gen_as_init(Node *n);
NodeList* initfix(NodeList *l);
int oaslit(Node *n, NodeList **init);
@@ -1116,7 +1116,6 @@ Type* shallow(Type *t);
int simsimtype(Type *t);
void smagic(Magic *m);
Type* sortinter(Type *t);
-Node* staticname(Type *t);
uint32 stringhash(char *p);
Strlit* strlit(char *s);
int structcount(Type *t);
diff --git a/src/cmd/gc/sinit.c b/src/cmd/gc/sinit.c
index 84a3cf1661..19ee3327b4 100644
--- a/src/cmd/gc/sinit.c
+++ b/src/cmd/gc/sinit.c
@@ -179,20 +179,21 @@ initfix(NodeList *l)
* part of the composit literal.
*/
-static void structlit(int pass, Node *n, Node *var, NodeList **init);
-static void arraylit(int pass, Node *n, Node *var, NodeList **init);
-static void slicelit(Node *n, Node *var, NodeList **init);
-static void maplit(Node *n, Node *var, NodeList **init);
+static void structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init);
+static void arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init);
+static void slicelit(int ctxt, Node *n, Node *var, NodeList **init);
+static void maplit(int ctxt, Node *n, Node *var, NodeList **init);
-Node*
-staticname(Type *t)
+static Node*
+staticname(Type *t, int ctxt)
{
Node *n;
snprint(namebuf, sizeof(namebuf), "statictmp_%.4d", statuniqgen);
statuniqgen++;
n = newname(lookup(namebuf));
- n->readonly = 1;
+ if(!ctxt)
+ n->readonly = 1;
addvar(n, t, PEXTERN);
return n;
}
@@ -270,7 +271,7 @@ getdyn(Node *n, int top)
}
static void
-structlit(int pass, Node *n, Node *var, NodeList **init)
+structlit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
{
Node *r, *a;
NodeList *nl;
@@ -286,21 +287,25 @@ structlit(int pass, Node *n, Node *var, NodeList **init)
switch(value->op) {
case OARRAYLIT:
if(value->type->bound < 0) {
- if(pass == 2) {
+ if(pass == 1 && ctxt != 0) {
a = nod(ODOT, var, newname(index->sym));
- slicelit(value, a, init);
+ slicelit(ctxt, value, a, init);
+ } else
+ if(pass == 2 && ctxt == 0) {
+ a = nod(ODOT, var, newname(index->sym));
+ slicelit(ctxt, value, a, init);
} else
if(pass == 3)
break;
continue;
}
a = nod(ODOT, var, newname(index->sym));
- arraylit(pass, value, a, init);
+ arraylit(ctxt, pass, value, a, init);
continue;
case OSTRUCTLIT:
a = nod(ODOT, var, newname(index->sym));
- structlit(pass, value, a, init);
+ structlit(ctxt, pass, value, a, init);
continue;
}
@@ -326,7 +331,7 @@ structlit(int pass, Node *n, Node *var, NodeList **init)
}
static void
-arraylit(int pass, Node *n, Node *var, NodeList **init)
+arraylit(int ctxt, int pass, Node *n, Node *var, NodeList **init)
{
Node *r, *a;
NodeList *l;
@@ -342,21 +347,25 @@ arraylit(int pass, Node *n, Node *var, NodeList **init)
switch(value->op) {
case OARRAYLIT:
if(value->type->bound < 0) {
- if(pass == 2) {
+ if(pass == 1 && ctxt != 0) {
+ a = nod(OINDEX, var, index);
+ slicelit(ctxt, value, a, init);
+ } else
+ if(pass == 2 && ctxt == 0) {
a = nod(OINDEX, var, index);
- slicelit(value, a, init);
+ slicelit(ctxt, value, a, init);
} else
if(pass == 3)
break;
continue;
}
a = nod(OINDEX, var, index);
- arraylit(pass, value, a, init);
+ arraylit(ctxt, pass, value, a, init);
continue;
case OSTRUCTLIT:
a = nod(OINDEX, var, index);
- structlit(pass, value, a, init);
+ structlit(ctxt, pass, value, a, init);
continue;
}
@@ -382,7 +391,7 @@ arraylit(int pass, Node *n, Node *var, NodeList **init)
}
static void
-slicelit(Node *n, Node *var, NodeList **init)
+slicelit(int ctxt, Node *n, Node *var, NodeList **init)
{
Node *r, *a;
NodeList *l;
@@ -398,6 +407,22 @@ slicelit(Node *n, Node *var, NodeList **init)
t->sym = nil;
dowidth(t);
+ if(ctxt != 0) {
+
+ // put everything into static array
+ vstat = staticname(t, ctxt);
+ arraylit(ctxt, 1, n, vstat, init);
+ arraylit(ctxt, 2, n, vstat, init);
+
+ // copy static to slice
+ a = nod(OSLICE, vstat, nod(OKEY, N, N));
+ a = nod(OAS, var, a);
+ typecheck(&a, Etop);
+ a->dodata = 2;
+ *init = list(*init, a);
+ return;
+ }
+
// recipe for var = []t{...}
// 1. make a static array
// var vstat [...]t
@@ -422,8 +447,8 @@ slicelit(Node *n, Node *var, NodeList **init)
vstat = N;
mode = getdyn(n, 1);
if(mode & MODECONST) {
- vstat = staticname(t);
- arraylit(1, n, vstat, init);
+ vstat = staticname(t, ctxt);
+ arraylit(ctxt, 1, n, vstat, init);
}
// make new auto *array (3 declare)
@@ -468,11 +493,11 @@ slicelit(Node *n, Node *var, NodeList **init)
case OARRAYLIT:
if(value->type->bound < 0)
break;
- arraylit(2, value, a, init);
+ arraylit(ctxt, 2, value, a, init);
continue;
case OSTRUCTLIT:
- structlit(2, value, a, init);
+ structlit(ctxt, 2, value, a, init);
continue;
}
@@ -488,7 +513,7 @@ slicelit(Node *n, Node *var, NodeList **init)
}
static void
-maplit(Node *n, Node *var, NodeList **init)
+maplit(int ctxt, Node *n, Node *var, NodeList **init)
{
Node *r, *a;
NodeList *l;
@@ -497,6 +522,8 @@ maplit(Node *n, Node *var, NodeList **init)
Node *vstat, *index, *value;
Sym *syma, *symb;
+ctxt = 0;
+
// make the map var
nerr = nerrors;
@@ -549,7 +576,7 @@ maplit(Node *n, Node *var, NodeList **init)
dowidth(t);
// make and initialize static array
- vstat = staticname(t);
+ vstat = staticname(t, ctxt);
b = 0;
for(l=n->list; l; l=l->next) {
r = l->n;
@@ -640,7 +667,7 @@ maplit(Node *n, Node *var, NodeList **init)
}
void
-anylit(Node *n, Node *var, NodeList **init)
+anylit(int ctxt, Node *n, Node *var, NodeList **init)
{
Type *t;
Node *a, *vstat;
@@ -655,18 +682,24 @@ anylit(Node *n, Node *var, NodeList **init)
fatal("anylit: not struct");
if(simplename(var)) {
- // lay out static data
- vstat = staticname(t);
- structlit(1, n, vstat, init);
- // copy static to var
- a = nod(OAS, var, vstat);
- typecheck(&a, Etop);
- walkexpr(&a, init);
- *init = list(*init, a);
+ if(ctxt == 0) {
+ // lay out static data
+ vstat = staticname(t, ctxt);
+ structlit(1, 1, n, vstat, init);
- // add expressions to automatic
- structlit(2, n, var, init);
+ // copy static to var
+ a = nod(OAS, var, vstat);
+ typecheck(&a, Etop);
+ walkexpr(&a, init);
+ *init = list(*init, a);
+
+ // add expressions to automatic
+ structlit(ctxt, 2, n, var, init);
+ break;
+ }
+ structlit(ctxt, 1, n, var, init);
+ structlit(ctxt, 2, n, var, init);
break;
}
@@ -677,30 +710,36 @@ anylit(Node *n, Node *var, NodeList **init)
walkexpr(&a, init);
*init = list(*init, a);
}
- structlit(3, n, var, init);
+ structlit(ctxt, 3, n, var, init);
break;
case OARRAYLIT:
if(t->etype != TARRAY)
fatal("anylit: not array");
if(t->bound < 0) {
- slicelit(n, var, init);
+ slicelit(ctxt, n, var, init);
break;
}
if(simplename(var)) {
- // lay out static data
- vstat = staticname(t);
- arraylit(1, n, vstat, init);
- // copy static to automatic
- a = nod(OAS, var, vstat);
- typecheck(&a, Etop);
- walkexpr(&a, init);
- *init = list(*init, a);
+ if(ctxt == 0) {
+ // lay out static data
+ vstat = staticname(t, ctxt);
+ arraylit(1, 1, n, vstat, init);
- // add expressions to automatic
- arraylit(2, n, var, init);
+ // copy static to automatic
+ a = nod(OAS, var, vstat);
+ typecheck(&a, Etop);
+ walkexpr(&a, init);
+ *init = list(*init, a);
+
+ // add expressions to automatic
+ arraylit(ctxt, 2, n, var, init);
+ break;
+ }
+ arraylit(ctxt, 1, n, var, init);
+ arraylit(ctxt, 2, n, var, init);
break;
}
@@ -711,13 +750,13 @@ anylit(Node *n, Node *var, NodeList **init)
walkexpr(&a, init);
*init = list(*init, a);
}
- arraylit(3, n, var, init);
+ arraylit(ctxt, 3, n, var, init);
break;
case OMAPLIT:
if(t->etype != TMAP)
fatal("anylit: not map");
- maplit(n, var, init);
+ maplit(ctxt, n, var, init);
break;
}
}
@@ -725,6 +764,8 @@ anylit(Node *n, Node *var, NodeList **init)
int
oaslit(Node *n, NodeList **init)
{
+ int ctxt;
+
if(n->left == N || n->right == N)
goto no;
if(n->left->type == T || n->right->type == T)
@@ -737,6 +778,9 @@ oaslit(Node *n, NodeList **init)
// context is init() function.
// implies generated data executed
// exactly once and not subject to races.
+ ctxt = 0;
+// if(n->dodata == 1)
+// ctxt = 1;
switch(n->right->op) {
default:
@@ -747,7 +791,7 @@ oaslit(Node *n, NodeList **init)
case OMAPLIT:
if(vmatch1(n->left, n->right))
goto no;
- anylit(n->right, n->left, init);
+ anylit(ctxt, n->right, n->left, init);
break;
}
n->op = OEMPTY;
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index db5443ded6..803977482e 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1159,7 +1159,7 @@ walkexpr(Node **np, NodeList **init)
case OMAPLIT:
case OSTRUCTLIT:
nvar = makenewvar(n->type, init, &nstar);
- anylit(n->left, nstar, init);
+ anylit(0, n->left, nstar, init);
n = nvar;
goto ret;
}
@@ -1341,7 +1341,7 @@ walkexpr(Node **np, NodeList **init)
case OSTRUCTLIT:
nvar = nod(OXXX, N, N);
tempname(nvar, n->type);
- anylit(n, nvar, init);
+ anylit(0, n, nvar, init);
n = nvar;
goto ret;
diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c
index 6e440d0465..0c255544de 100644
--- a/src/cmd/ld/dwarf.c
+++ b/src/cmd/ld/dwarf.c
@@ -1030,7 +1030,7 @@ dwarfaddmachoheaders(void)
// have to be page aligned in the file.
fakestart = abbrevo & ~0xfff;
- ms = newMachoSeg("__DWARF", 3);
+ ms = newMachoSeg("__DWARF", 4);
ms->fileoffset = fakestart;
ms->filesize = abbrevo-fakestart + abbrevsize+linesize+framesize+infosize;