summaryrefslogtreecommitdiff
path: root/src/cmd/8c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-03-20 16:40:00 -0700
committerRuss Cox <rsc@golang.org>2009-03-20 16:40:00 -0700
commitb3e6c9aab3f96ddf2c0be0832b70ab1e504bbb3c (patch)
tree2f91f407749726e7de5074f35c4927adb6a04910 /src/cmd/8c
parentaa63fd67d59b14fef1795ee074a45c8e8935a0ee (diff)
downloadgolang-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.h1
-rw-r--r--src/cmd/8c/list.c4
-rw-r--r--src/cmd/8c/sgen.c32
-rw-r--r--src/cmd/8c/swt.c15
-rw-r--r--src/cmd/8c/txt.c13
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;