diff options
| author | Russ Cox <rsc@golang.org> | 2009-03-20 16:40:00 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-03-20 16:40:00 -0700 |
| commit | b3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c (patch) | |
| tree | 2f91f407749726e7de5074f35c4927adb6a04910 /src/cmd/8c | |
| parent | aa63fd67d59b14fef1795ee074a45c8e8935a0ee (diff) | |
| download | golang-b3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c.tar.gz | |
update 8a, 8c, 8l to use new object format.
add "extern register" support to 8c.
extern register means allocate in the FS-relative segment.
make 8l generate segmented stack checks.
R=ken
OCL=26600
CL=26606
Diffstat (limited to 'src/cmd/8c')
| -rw-r--r-- | src/cmd/8c/gc.h | 1 | ||||
| -rw-r--r-- | src/cmd/8c/list.c | 4 | ||||
| -rw-r--r-- | src/cmd/8c/sgen.c | 32 | ||||
| -rw-r--r-- | src/cmd/8c/swt.c | 15 | ||||
| -rw-r--r-- | src/cmd/8c/txt.c | 13 |
5 files changed, 64 insertions, 1 deletions
diff --git a/src/cmd/8c/gc.h b/src/cmd/8c/gc.h index c30eb55bc..55a37c42c 100644 --- a/src/cmd/8c/gc.h +++ b/src/cmd/8c/gc.h @@ -66,6 +66,7 @@ EXTERN struct struct Adr { int32 offset; + int32 offset2; double dval; char sval[NSNAME]; diff --git a/src/cmd/8c/list.c b/src/cmd/8c/list.c index d700b63af..ec5ac9d60 100644 --- a/src/cmd/8c/list.c +++ b/src/cmd/8c/list.c @@ -154,6 +154,10 @@ Dconv(Fmt *fp) sprint(str, "$%ld", a->offset); break; + case D_CONST2: + sprint(str, "$%ld-%ld", a->offset, a->offset2); + break; + case D_FCONST: sprint(str, "$(%.17e)", a->dval); break; diff --git a/src/cmd/8c/sgen.c b/src/cmd/8c/sgen.c index 14bd32adb..c4d5665d8 100644 --- a/src/cmd/8c/sgen.c +++ b/src/cmd/8c/sgen.c @@ -30,6 +30,31 @@ #include "gc.h" +int32 +argsize(void) +{ + Type *t; + int32 s; + +//print("t=%T\n", thisfn); + s = 0; + for(t=thisfn->down; t!=T; t=t->down) { + switch(t->etype) { + case TVOID: + break; + case TDOT: + s += 64; + break; + default: + s = align(s, t, Aarg1); + s = align(s, t, Aarg2); + break; + } +//print(" %d %T\n", s, t); + } + return (s+7) & ~7; +} + void codgen(Node *n, Node *nn) { @@ -52,7 +77,10 @@ codgen(Node *n, Node *nn) break; } nearln = nn->lineno; + gpseudo(ATEXT, n1->sym, nodconst(stkoff)); + p->to.type = D_CONST2; + p->to.offset2 = argsize(); /* * isolate first argument @@ -494,6 +522,10 @@ xcom(Node *n) n->addable = 11; break; + case OEXREG: + n->addable = 10; + break; + case OREGISTER: n->addable = 12; break; diff --git a/src/cmd/8c/swt.c b/src/cmd/8c/swt.c index 13e9a51e3..6d693337a 100644 --- a/src/cmd/8c/swt.c +++ b/src/cmd/8c/swt.c @@ -328,7 +328,10 @@ outcode(void) return; } Binit(&b, f, OWRITE); - Bseek(&b, 0L, 2); + + Bprint(&b, "%s\n", thestring); + Bprint(&b, "!\n"); + outhist(&b); for(sym=0; sym<NSYM; sym++) { h[sym].sym = S; @@ -530,6 +533,9 @@ zaddr(Biobuf *b, Adr *a, int s) case D_SCONST: t |= T_SCONST; break; + case D_CONST2: + t |= T_OFFSET|T_OFFSET2; + break; } Bputc(b, t); @@ -544,6 +550,13 @@ zaddr(Biobuf *b, Adr *a, int s) Bputc(b, l>>16); Bputc(b, l>>24); } + if(t & T_OFFSET2) { /* implies offset2 */ + l = a->offset2; + Bputc(b, l); + Bputc(b, l>>8); + Bputc(b, l>>16); + Bputc(b, l>>24); + } if(t & T_SYM) /* implies sym */ Bputc(b, s); if(t & T_FCONST) { diff --git a/src/cmd/8c/txt.c b/src/cmd/8c/txt.c index 4e95f3c7a..5cc43e0e9 100644 --- a/src/cmd/8c/txt.c +++ b/src/cmd/8c/txt.c @@ -449,6 +449,10 @@ naddr(Node *n, Adr *a) a->sym = S; break; + case OEXREG: + a->type = D_INDIR + D_FS; + a->offset = n->reg - 1; + break; case OIND: naddr(n->left, a); @@ -1389,6 +1393,15 @@ sconst(Node *n) int32 exreg(Type *t) { + int32 o; + + if(typechlp[t->etype]){ + if(exregoffset >= 32) + return 0; + o = exregoffset; + exregoffset += 4; + return o+1; // +1 to avoid 0 == failure; naddr case OEXREG will -1. + } USED(t); return 0; |
