From b3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 20 Mar 2009 16:40:00 -0700 Subject: 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 --- src/cmd/8c/gc.h | 1 + src/cmd/8c/list.c | 4 ++++ src/cmd/8c/sgen.c | 32 ++++++++++++++++++++++++++++++++ src/cmd/8c/swt.c | 15 ++++++++++++++- src/cmd/8c/txt.c | 13 +++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) (limited to 'src/cmd/8c') 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>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; -- cgit v1.2.3