mechanism for putting go types into 6.out symbol table.
no types yet.
R=ken
OCL=33142
CL=33146
diff --git a/src/cmd/6g/gg.h b/src/cmd/6g/gg.h
index ce5f6c8..ca90762 100644
--- a/src/cmd/6g/gg.h
+++ b/src/cmd/6g/gg.h
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-
#include <u.h>
#include <libc.h>
@@ -22,6 +21,7 @@
Prog* branch;
char sval[NSNAME];
+ Sym* gotype;
Sym* sym;
int width;
uchar type;
@@ -107,8 +107,6 @@
vlong convvtox(vlong, int);
void fnparam(Type*, int, int);
Prog* gop(int, Node*, Node*, Node*);
-void setconst(Addr*, vlong);
-void setaddr(Addr*, Node*);
int optoas(int, Type*);
void ginit(void);
void gclean(void);
@@ -141,5 +139,5 @@
int Yconv(Fmt*);
void listinit(void);
-void zaddr(Biobuf*, Addr*, int);
+void zaddr(Biobuf*, Addr*, int, int);
diff --git a/src/cmd/6g/gobj.c b/src/cmd/6g/gobj.c
index 9977b0f..e4f0a55 100644
--- a/src/cmd/6g/gobj.c
+++ b/src/cmd/6g/gobj.c
@@ -71,17 +71,17 @@
Bputc(b, line>>8);
Bputc(b, line>>16);
Bputc(b, line>>24);
- zaddr(b, &zprog.from, 0);
+ zaddr(b, &zprog.from, 0, 0);
a = zprog.to;
if(offset != 0) {
a.offset = offset;
a.type = D_CONST;
}
- zaddr(b, &a, 0);
+ zaddr(b, &a, 0, 0);
}
void
-zaddr(Biobuf *b, Addr *a, int s)
+zaddr(Biobuf *b, Addr *a, int s, int gotype)
{
int32 l;
uint64 e;
@@ -93,6 +93,8 @@
t |= T_INDEX;
if(s != 0)
t |= T_SYM;
+ if(gotype != 0)
+ t |= T_GOTYPE;
switch(a->type) {
@@ -165,22 +167,70 @@
}
if(t & T_TYPE)
Bputc(b, a->type);
+ if(t & T_GOTYPE)
+ Bputc(b, gotype);
+}
+
+static struct {
+ struct { Sym *sym; short type; } h[NSYM];
+ int sym;
+} z;
+
+static void
+zsymreset(void)
+{
+ for(z.sym=0; z.sym<NSYM; z.sym++) {
+ z.h[z.sym].sym = S;
+ z.h[z.sym].type = 0;
+ }
+ z.sym = 1;
+}
+
+static int
+zsym(Sym *s, int t, int *new)
+{
+ int i;
+
+ *new = 0;
+ if(s == S)
+ return 0;
+
+ i = s->sym;
+ if(i < 0 || i >= NSYM)
+ i = 0;
+ if(z.h[i].type == t && z.h[i].sym == s)
+ return i;
+ i = z.sym;
+ s->sym = i;
+ zname(bout, s, t);
+ z.h[i].sym = s;
+ z.h[i].type = t;
+ if(++z.sym >= NSYM)
+ z.sym = 1;
+ *new = 1;
+ return i;
+}
+
+static int
+zsymaddr(Addr *a, int *new)
+{
+ int t;
+
+ t = a->type;
+ if(t == D_ADDR)
+ t = a->index;
+ return zsym(a->sym, t, new);
}
void
dumpfuncs(void)
{
Plist *pl;
- int sf, st, t, sym;
- struct { Sym *sym; short type; } h[NSYM];
+ int sf, st, gf, gt, new;
Sym *s;
Prog *p;
- for(sym=0; sym<NSYM; sym++) {
- h[sym].sym = S;
- h[sym].type = 0;
- }
- sym = 1;
+ zsymreset();
// fix up pc
pcloc = 0;
@@ -205,61 +255,28 @@
}
for(p=pl->firstpc; p!=P; p=p->link) {
- jackpot:
- sf = 0;
- s = p->from.sym;
- while(s != S) {
- sf = s->sym;
- if(sf < 0 || sf >= NSYM)
- sf = 0;
- t = p->from.type;
- if(t == D_ADDR)
- t = p->from.index;
- if(h[sf].type == t)
- if(h[sf].sym == s)
- break;
- s->sym = sym;
- zname(bout, s, t);
- h[sym].sym = s;
- h[sym].type = t;
- sf = sym;
- sym++;
- if(sym >= NSYM)
- sym = 1;
+ for(;;) {
+ sf = zsymaddr(&p->from, &new);
+ gf = zsym(p->from.gotype, D_EXTERN, &new);
+ if(new && sf == gf)
+ continue;
+ st = zsymaddr(&p->to, &new);
+ if(new && (st == sf || st == gf))
+ continue;
+ gt = zsym(p->to.gotype, D_EXTERN, &new);
+ if(new && (gt == sf || gt == gf || gt == st))
+ continue;
break;
}
- st = 0;
- s = p->to.sym;
- while(s != S) {
- st = s->sym;
- if(st < 0 || st >= NSYM)
- st = 0;
- t = p->to.type;
- if(t == D_ADDR)
- t = p->to.index;
- if(h[st].type == t)
- if(h[st].sym == s)
- break;
- s->sym = sym;
- zname(bout, s, t);
- h[sym].sym = s;
- h[sym].type = t;
- st = sym;
- sym++;
- if(sym >= NSYM)
- sym = 1;
- if(st == sf)
- goto jackpot;
- break;
- }
+
Bputc(bout, p->as);
Bputc(bout, p->as>>8);
Bputc(bout, p->lineno);
Bputc(bout, p->lineno>>8);
Bputc(bout, p->lineno>>16);
Bputc(bout, p->lineno>>24);
- zaddr(bout, &p->from, sf);
- zaddr(bout, &p->to, st);
+ zaddr(bout, &p->from, sf, gf);
+ zaddr(bout, &p->to, st, gt);
}
}
}
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index c98642e..434a90a 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -882,6 +882,8 @@
a->scale = 0;
a->index = D_NONE;
a->type = D_NONE;
+ a->gotype = S;
+
if(n == N)
return;
@@ -937,6 +939,7 @@
if(n->type != T) {
a->etype = simtype[n->type->etype];
a->width = n->type->width;
+ // a->gotype = typename(n->type)->left->sym;
}
a->offset = n->xoffset;
a->sym = n->sym;
diff --git a/src/cmd/6l/6.out.h b/src/cmd/6l/6.out.h
index 292abd3..9ea12da 100644
--- a/src/cmd/6l/6.out.h
+++ b/src/cmd/6l/6.out.h
@@ -831,6 +831,7 @@
T_SYM = 1<<4,
T_SCONST = 1<<5,
T_64 = 1<<6,
+ T_GOTYPE = 1<<7,
REGARG = -1,
REGRET = D_AX,
diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h
index 5d0d2a32..3643eee 100644
--- a/src/cmd/6l/l.h
+++ b/src/cmd/6l/l.h
@@ -71,6 +71,7 @@
short type;
char index;
char scale;
+ Sym* gotype;
};
#define offset u0.u0offset
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c
index b6e1a96..f3c12d7 100644
--- a/src/cmd/6l/obj.c
+++ b/src/cmd/6l/obj.c
@@ -607,6 +607,8 @@
}
if(t & T_TYPE)
a->type = Bgetc(f);
+ if(t & T_GOTYPE)
+ a->gotype = h[Bgetc(f)];
s = a->sym;
if(s == S)
return;
@@ -635,7 +637,7 @@
void
addlib(char *src, char *obj)
{
- char name[1024], pname[1024], comp[256], *p, *q;
+ char name[1024], pname[1024], comp[256], *p;
int i, search;
if(histfrogp <= 0)
diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c
index 82a28de..4a36b0e 100644
--- a/src/cmd/6l/span.c
+++ b/src/cmd/6l/span.c
@@ -213,7 +213,7 @@
s = lookup("etext", 0);
if(s->type == STEXT)
- putsymb(s->name, 'T', s->value, s->version, nil);
+ putsymb(s->name, 'T', s->value, s->version, 0);
for(h=0; h<NHASH; h++)
for(s=hash[h]; s!=S; s=s->link)
@@ -231,7 +231,7 @@
continue;
case SFILE:
- putsymb(s->name, 'f', s->value, s->version, nil);
+ putsymb(s->name, 'f', s->value, s->version, 0);
continue;
}
@@ -241,25 +241,25 @@
/* filenames first */
for(a=p->to.autom; a; a=a->link)
if(a->type == D_FILE)
- putsymb(a->asym->name, 'z', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'z', a->aoffset, 0, 0);
else
if(a->type == D_FILE1)
- putsymb(a->asym->name, 'Z', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'Z', a->aoffset, 0, 0);
if(s->type != STEXT)
continue;
putsymb(s->name, 'T', s->value, s->version, gotypefor(s->name));
/* frame, auto and param after */
- putsymb(".frame", 'm', p->to.offset+8, 0, nil);
+ putsymb(".frame", 'm', p->to.offset+8, 0, 0);
/* TODO(rsc): Add types for D_AUTO and D_PARAM */
for(a=p->to.autom; a; a=a->link)
if(a->type == D_AUTO)
- putsymb(a->asym->name, 'a', -a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'a', -a->aoffset, 0, gotypefor(nil));
else
if(a->type == D_PARAM)
- putsymb(a->asym->name, 'p', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'p', a->aoffset, 0, gotypefor(nil));
}
if(debug['v'] || debug['n'])
Bprint(&bso, "symsize = %lud\n", symsize);
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index fddb17e..7440ef8 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-
#define EXTERN
#include "go.h"
#include "y.tab.h"
@@ -85,7 +84,7 @@
curio.infile = infile;
curio.bin = Bopen(infile, OREAD);
if(curio.bin == nil)
- fatal("open%s: %r", infile);
+ fatal("open %s: %r", infile);
curio.peekc = 0;
curio.peekc1 = 0;