1
0
mirror of https://github.com/golang/go synced 2024-11-22 18:24:48 -07:00

8g: hello world works again

* string format changed
	* files got renamed
	* new files that i forgot to check in last time
updates are all copy and paste from 6g

R=ken
OCL=29385
CL=29400
This commit is contained in:
Russ Cox 2009-05-26 14:46:06 -07:00
parent 1f0f2e44a9
commit 021abfbd28
7 changed files with 164 additions and 42 deletions

View File

@ -16,9 +16,9 @@ HFILES=\
OFILES=\ OFILES=\
../8l/enam.$O\ ../8l/enam.$O\
list.$O\ list.$O\
align.$O\ galign.$O\
obj.$O\ gobj.$O\
gen.$O\ ggen.$O\
gsubr.$O\ gsubr.$O\
cgen.$O\ cgen.$O\
# peep.$O\ # peep.$O\

View File

@ -47,7 +47,7 @@ EXTERN Biobuf* bout;
EXTERN int32 dynloc; EXTERN int32 dynloc;
EXTERN uchar reg[D_NONE]; EXTERN uchar reg[D_NONE];
EXTERN int32 pcloc; // instruction counter EXTERN int32 pcloc; // instruction counter
EXTERN String emptystring; EXTERN Strlit emptystring;
extern char* anames[]; extern char* anames[];
EXTERN Hist* hist; EXTERN Hist* hist;
EXTERN Prog zprog; EXTERN Prog zprog;
@ -124,6 +124,7 @@ void nodreg(Node*, Type*, int);
void nodindreg(Node*, Type*, int); void nodindreg(Node*, Type*, int);
void nodconst(Node*, Type*, vlong); void nodconst(Node*, Type*, vlong);
void gconreg(int, vlong, int); void gconreg(int, vlong, int);
void datagostring(Strlit*, Addr*);
void buildtxt(void); void buildtxt(void);
Plist* newplist(void); Plist* newplist(void);
int isfat(Type*); int isfat(Type*);

View File

@ -327,3 +327,8 @@ cgen_bmul(int op, Node *nl, Node *nr, Node *res)
fatal("cgen_bmul"); fatal("cgen_bmul");
} }
int
gen_as_init(Node *nr, Node *nl)
{
return 0;
}

View File

@ -40,7 +40,7 @@ zname(Biobuf *b, Sym *s, int t)
Bputc(b, t); /* type */ Bputc(b, t); /* type */
Bputc(b, s->sym); /* sym */ Bputc(b, s->sym); /* sym */
for(n=s->opackage; *n; n++) for(n=s->package; *n; n++)
Bputc(b, *n); Bputc(b, *n);
Bputdot(b); Bputdot(b);
for(n=s->name; *n; n++) for(n=s->name; *n; n++)
@ -259,19 +259,75 @@ dumpfuncs(void)
} }
} }
/* deferred DATA output */
static Prog *strdat;
static Prog *estrdat;
static int gflag;
static Prog *savepc;
static void
data(void)
{
gflag = debug['g'];
debug['g'] = 0;
if(estrdat == nil) {
strdat = mal(sizeof(*pc));
clearp(strdat);
estrdat = strdat;
}
if(savepc)
fatal("data phase error");
savepc = pc;
pc = estrdat;
}
static void
text(void)
{
if(!savepc)
fatal("text phase error");
debug['g'] = gflag;
estrdat = pc;
pc = savepc;
savepc = nil;
}
void void
datastring(char *s, int len) dumpdata(void)
{
Prog *p;
if(estrdat == nil)
return;
*pc = *strdat;
if(gflag)
for(p=pc; p!=estrdat; p=p->link)
print("%P\n", p);
pc = estrdat;
}
/*
* make a refer to the data s, s+len
* emitting DATA if needed.
*/
void
datastring(char *s, int len, Addr *a)
{ {
int w; int w;
Prog *p; Prog *p;
Addr ac, ao; Addr ac, ao;
static int gen;
struct {
Strlit lit;
char buf[100];
} tmp;
// string // string
memset(&ao, 0, sizeof(ao)); memset(&ao, 0, sizeof(ao));
ao.type = D_STATIC; ao.type = D_STATIC;
ao.index = D_NONE; ao.index = D_NONE;
ao.etype = TINT32; ao.etype = TINT32;
ao.sym = symstringo;
ao.offset = 0; // fill in ao.offset = 0; // fill in
// constant // constant
@ -280,13 +336,37 @@ datastring(char *s, int len)
ac.index = D_NONE; ac.index = D_NONE;
ac.offset = 0; // fill in ac.offset = 0; // fill in
// huge strings are made static to avoid long names.
if(len > 100) {
snprint(namebuf, sizeof(namebuf), ".string.%d", gen++);
ao.sym = lookup(namebuf);
ao.type = D_STATIC;
} else {
if(len > 0 && s[len-1] == '\0')
len--;
tmp.lit.len = len;
memmove(tmp.lit.s, s, len);
tmp.lit.s[len] = '\0';
len++;
snprint(namebuf, sizeof(namebuf), "\"%Z\"", &tmp.lit);
ao.sym = pkglookup(namebuf, "string");
ao.type = D_EXTERN;
}
*a = ao;
// only generate data the first time.
if(ao.sym->uniq)
return;
ao.sym->uniq = 1;
data();
for(w=0; w<len; w+=8) { for(w=0; w<len; w+=8) {
p = pc; p = pc;
gins(ADATA, N, N); gins(ADATA, N, N);
// .stringo<>+oo, [NSNAME], $"xxx" // DATA s+w, [NSNAME], $"xxx"
p->from = ao; p->from = ao;
p->from.offset = stringo; p->from.offset = w;
p->from.scale = NSNAME; p->from.scale = NSNAME;
if(w+8 > len) if(w+8 > len)
@ -296,23 +376,29 @@ datastring(char *s, int len)
p->to.type = D_SCONST; p->to.type = D_SCONST;
p->to.offset = len; p->to.offset = len;
memmove(p->to.sval, s+w, p->from.scale); memmove(p->to.sval, s+w, p->from.scale);
stringo += p->from.scale;
} }
p = pc;
ggloblsym(ao.sym, len, ao.type == D_EXTERN);
if(ao.type == D_STATIC)
p->from.type = D_STATIC;
text();
} }
/*
* make a refer to the string sval,
* emitting DATA if needed.
*/
void void
dumpstrings(void) datagostring(Strlit *sval, Addr *a)
{ {
Pool *l;
Prog *p; Prog *p;
Addr ac, ao; Addr ac, ao, ap;
int32 wi; int32 wi, wp;
static int gen;
if(poolist == nil)
return;
memset(&ac, 0, sizeof(ac)); memset(&ac, 0, sizeof(ac));
memset(&ao, 0, sizeof(ao)); memset(&ao, 0, sizeof(ao));
memset(&ap, 0, sizeof(ap));
// constant // constant
ac.type = D_CONST; ac.type = D_CONST;
@ -320,31 +406,61 @@ dumpstrings(void)
ac.offset = 0; // fill in ac.offset = 0; // fill in
// string len+ptr // string len+ptr
ao.type = D_STATIC; ao.type = D_STATIC; // fill in
ao.index = D_NONE; ao.index = D_NONE;
ao.etype = TINT32; ao.etype = TINT32;
ao.sym = symstringo; ao.sym = nil; // fill in
ao.offset = 0; // fill in
wi = types[TINT32]->width; // $string len+ptr
datastring(sval->s, sval->len, &ap);
ap.index = ap.type;
ap.type = D_ADDR;
ap.etype = TINT32;
// lay out (count+string) wi = types[TUINT32]->width;
for(l=poolist; l!=nil; l=l->link) { wp = types[tptr]->width;
p = pc; if(ap.index == D_STATIC) {
gins(ADATA, N, N); // huge strings are made static to avoid long names
snprint(namebuf, sizeof(namebuf), ".gostring.%d", ++gen);
// .stringo<>+xx, wi, $len ao.sym = lookup(namebuf);
stringo = rnd(stringo, wi); ao.type = D_STATIC;
p->from = ao; } else {
p->from.offset = stringo; // small strings get named by their contents,
p->from.scale = wi; // so that multiple modules using the same string
p->to = ac; // can share it.
p->to.offset = l->sval->len; snprint(namebuf, sizeof(namebuf), "\"%Z\"", sval);
stringo += wi; ao.sym = pkglookup(namebuf, "go.string");
ao.type = D_EXTERN;
datastring(l->sval->s, l->sval->len);
} }
*a = ao;
if(ao.sym->uniq)
return;
ao.sym->uniq = 1;
data();
// DATA gostring, wp, $cstring
p = pc;
gins(ADATA, N, N);
p->from = ao;
p->from.scale = wp;
p->to = ap;
// DATA gostring+wp, wi, $len
p = pc;
gins(ADATA, N, N);
p->from = ao;
p->from.offset = wp;
p->from.scale = wi;
p->to = ac;
p->to.offset = sval->len;
p = pc;
ggloblsym(ao.sym, types[TSTRING]->width, ao.type == D_EXTERN);
if(ao.type == D_STATIC)
p->from.type = D_STATIC;
text();
} }
int int
@ -359,14 +475,13 @@ dstringptr(Sym *s, int off, char *str)
p->from.sym = s; p->from.sym = s;
p->from.offset = off; p->from.offset = off;
p->from.scale = widthptr; p->from.scale = widthptr;
datastring(str, strlen(str)+1, &p->to);
p->to.index = p->to.type;
p->to.type = D_ADDR; p->to.type = D_ADDR;
p->to.index = D_STATIC;
p->to.etype = TINT32; p->to.etype = TINT32;
p->to.sym = symstringo;
p->to.offset = stringo;
off += widthptr; off += widthptr;
datastring(str, strlen(str)+1);
return off; return off;
} }

View File

@ -229,6 +229,7 @@ struct Node
int32 vargen; // unique name for OTYPE/ONAME int32 vargen; // unique name for OTYPE/ONAME
int32 lineno; int32 lineno;
vlong xoffset; vlong xoffset;
int32 ostk;
}; };
#define N ((Node*)0) #define N ((Node*)0)

View File

@ -82,7 +82,7 @@ traceback(byte *pc0, byte *sp, G *g)
// func caller(n int) (pc uint64, file string, line int, ok bool) // func caller(n int) (pc uint64, file string, line int, ok bool)
void void
runtime·Caller(int32 n, uint64 retpc, string retfile, int32 retline, bool retbool) runtime·Caller(int32 n, uint64 retpc, String retfile, int32 retline, bool retbool)
{ {
uint64 pc; uint64 pc;
byte *sp; byte *sp;
@ -97,7 +97,7 @@ runtime·Caller(int32 n, uint64 retpc, string retfile, int32 retline, bool retbo
error: error:
retpc = 0; retpc = 0;
retline = 0; retline = 0;
retfile = nil; retfile = emptystring;
retbool = false; retbool = false;
FLUSH(&retpc); FLUSH(&retpc);
FLUSH(&retfile); FLUSH(&retfile);