mirror of
https://github.com/golang/go
synced 2024-11-22 22:10:03 -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=\
|
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\
|
||||||
|
@ -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*);
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user