mirror of
https://github.com/golang/go
synced 2024-11-26 07:57:57 -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:
parent
1f0f2e44a9
commit
021abfbd28
@ -16,9 +16,9 @@ HFILES=\
|
||||
OFILES=\
|
||||
../8l/enam.$O\
|
||||
list.$O\
|
||||
align.$O\
|
||||
obj.$O\
|
||||
gen.$O\
|
||||
galign.$O\
|
||||
gobj.$O\
|
||||
ggen.$O\
|
||||
gsubr.$O\
|
||||
cgen.$O\
|
||||
# peep.$O\
|
||||
|
@ -47,7 +47,7 @@ EXTERN Biobuf* bout;
|
||||
EXTERN int32 dynloc;
|
||||
EXTERN uchar reg[D_NONE];
|
||||
EXTERN int32 pcloc; // instruction counter
|
||||
EXTERN String emptystring;
|
||||
EXTERN Strlit emptystring;
|
||||
extern char* anames[];
|
||||
EXTERN Hist* hist;
|
||||
EXTERN Prog zprog;
|
||||
@ -124,6 +124,7 @@ void nodreg(Node*, Type*, int);
|
||||
void nodindreg(Node*, Type*, int);
|
||||
void nodconst(Node*, Type*, vlong);
|
||||
void gconreg(int, vlong, int);
|
||||
void datagostring(Strlit*, Addr*);
|
||||
void buildtxt(void);
|
||||
Plist* newplist(void);
|
||||
int isfat(Type*);
|
||||
|
@ -327,3 +327,8 @@ cgen_bmul(int op, Node *nl, Node *nr, Node *res)
|
||||
fatal("cgen_bmul");
|
||||
}
|
||||
|
||||
int
|
||||
gen_as_init(Node *nr, Node *nl)
|
||||
{
|
||||
return 0;
|
||||
}
|
@ -40,7 +40,7 @@ zname(Biobuf *b, Sym *s, int t)
|
||||
Bputc(b, t); /* type */
|
||||
Bputc(b, s->sym); /* sym */
|
||||
|
||||
for(n=s->opackage; *n; n++)
|
||||
for(n=s->package; *n; n++)
|
||||
Bputc(b, *n);
|
||||
Bputdot(b);
|
||||
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
|
||||
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;
|
||||
Prog *p;
|
||||
Addr ac, ao;
|
||||
static int gen;
|
||||
struct {
|
||||
Strlit lit;
|
||||
char buf[100];
|
||||
} tmp;
|
||||
|
||||
// string
|
||||
memset(&ao, 0, sizeof(ao));
|
||||
ao.type = D_STATIC;
|
||||
ao.index = D_NONE;
|
||||
ao.etype = TINT32;
|
||||
ao.sym = symstringo;
|
||||
ao.offset = 0; // fill in
|
||||
|
||||
// constant
|
||||
@ -280,13 +336,37 @@ datastring(char *s, int len)
|
||||
ac.index = D_NONE;
|
||||
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) {
|
||||
p = pc;
|
||||
gins(ADATA, N, N);
|
||||
|
||||
// .stringo<>+oo, [NSNAME], $"xxx"
|
||||
// DATA s+w, [NSNAME], $"xxx"
|
||||
p->from = ao;
|
||||
p->from.offset = stringo;
|
||||
p->from.offset = w;
|
||||
|
||||
p->from.scale = NSNAME;
|
||||
if(w+8 > len)
|
||||
@ -296,23 +376,29 @@ datastring(char *s, int len)
|
||||
p->to.type = D_SCONST;
|
||||
p->to.offset = len;
|
||||
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
|
||||
dumpstrings(void)
|
||||
datagostring(Strlit *sval, Addr *a)
|
||||
{
|
||||
Pool *l;
|
||||
Prog *p;
|
||||
Addr ac, ao;
|
||||
int32 wi;
|
||||
|
||||
if(poolist == nil)
|
||||
return;
|
||||
Addr ac, ao, ap;
|
||||
int32 wi, wp;
|
||||
static int gen;
|
||||
|
||||
memset(&ac, 0, sizeof(ac));
|
||||
memset(&ao, 0, sizeof(ao));
|
||||
memset(&ap, 0, sizeof(ap));
|
||||
|
||||
// constant
|
||||
ac.type = D_CONST;
|
||||
@ -320,31 +406,61 @@ dumpstrings(void)
|
||||
ac.offset = 0; // fill in
|
||||
|
||||
// string len+ptr
|
||||
ao.type = D_STATIC;
|
||||
ao.type = D_STATIC; // fill in
|
||||
ao.index = D_NONE;
|
||||
ao.etype = TINT32;
|
||||
ao.sym = symstringo;
|
||||
ao.offset = 0; // fill in
|
||||
ao.sym = nil; // 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)
|
||||
for(l=poolist; l!=nil; l=l->link) {
|
||||
wi = types[TUINT32]->width;
|
||||
wp = types[tptr]->width;
|
||||
|
||||
p = pc;
|
||||
gins(ADATA, N, N);
|
||||
|
||||
// .stringo<>+xx, wi, $len
|
||||
stringo = rnd(stringo, wi);
|
||||
p->from = ao;
|
||||
p->from.offset = stringo;
|
||||
p->from.scale = wi;
|
||||
p->to = ac;
|
||||
p->to.offset = l->sval->len;
|
||||
stringo += wi;
|
||||
|
||||
datastring(l->sval->s, l->sval->len);
|
||||
if(ap.index == D_STATIC) {
|
||||
// huge strings are made static to avoid long names
|
||||
snprint(namebuf, sizeof(namebuf), ".gostring.%d", ++gen);
|
||||
ao.sym = lookup(namebuf);
|
||||
ao.type = D_STATIC;
|
||||
} else {
|
||||
// small strings get named by their contents,
|
||||
// so that multiple modules using the same string
|
||||
// can share it.
|
||||
snprint(namebuf, sizeof(namebuf), "\"%Z\"", sval);
|
||||
ao.sym = pkglookup(namebuf, "go.string");
|
||||
ao.type = D_EXTERN;
|
||||
}
|
||||
|
||||
*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
|
||||
@ -359,14 +475,13 @@ dstringptr(Sym *s, int off, char *str)
|
||||
p->from.sym = s;
|
||||
p->from.offset = off;
|
||||
p->from.scale = widthptr;
|
||||
|
||||
datastring(str, strlen(str)+1, &p->to);
|
||||
p->to.index = p->to.type;
|
||||
p->to.type = D_ADDR;
|
||||
p->to.index = D_STATIC;
|
||||
p->to.etype = TINT32;
|
||||
p->to.sym = symstringo;
|
||||
p->to.offset = stringo;
|
||||
off += widthptr;
|
||||
|
||||
datastring(str, strlen(str)+1);
|
||||
return off;
|
||||
}
|
||||
|
@ -229,6 +229,7 @@ struct Node
|
||||
int32 vargen; // unique name for OTYPE/ONAME
|
||||
int32 lineno;
|
||||
vlong xoffset;
|
||||
int32 ostk;
|
||||
};
|
||||
#define N ((Node*)0)
|
||||
|
||||
|
@ -82,7 +82,7 @@ traceback(byte *pc0, byte *sp, G *g)
|
||||
|
||||
// func caller(n int) (pc uint64, file string, line int, ok bool)
|
||||
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;
|
||||
byte *sp;
|
||||
@ -97,7 +97,7 @@ runtime·Caller(int32 n, uint64 retpc, string retfile, int32 retline, bool retbo
|
||||
error:
|
||||
retpc = 0;
|
||||
retline = 0;
|
||||
retfile = nil;
|
||||
retfile = emptystring;
|
||||
retbool = false;
|
||||
FLUSH(&retpc);
|
||||
FLUSH(&retfile);
|
||||
|
Loading…
Reference in New Issue
Block a user