p->to.type = D_INDIR+D_AX;
}
+int
+argsize(Type *t)
+{
+ Iter save;
+ Type *fp;
+ int w, x;
+
+ w = 0;
+
+ fp = structfirst(&save, getoutarg(t));
+ while(fp != T) {
+ x = fp->width + fp->type->width;
+ if(x > w)
+ w = x;
+ fp = structnext(&save);
+ }
+
+ fp = funcfirst(&save, t);
+ while(fp != T) {
+ x = fp->width + fp->type->width;
+ if(x > w)
+ w = x;
+ fp = structnext(&save);
+ }
+
+ w = (w+7) & ~7;
+ return w;
+}
+
void
ginscall(Node *f, int proc)
{
- Node regax;
+ Node reg, con;
if(proc) {
- nodreg(®ax, types[TINT64], D_AX);
- gins(ALEAQ, f, ®ax);
+ nodreg(®, types[TINT64], D_AX);
+ gins(ALEAQ, f, ®);
+ nodreg(®, types[TINT64], D_BX);
+ nodconst(&con, types[TINT32], argsize(f->type));
+ gins(AMOVL, &con, ®);
gins(ACALL, N, newproc);
return;
}
if(nam == nil) {
vargen++;
- snprint(buf, sizeof(buf), "_f%.3ld", vargen);
+ snprint(buf, sizeof(buf), "_f%s_%.3ld", filename, vargen);
nam = buf;
}
if(t->thistuple > 0) {
vargen++;
- snprint(namebuf, sizeof(namebuf), "_t%s%.3ld", nam, vargen);
+ snprint(namebuf, sizeof(namebuf), "_t%s_%.3ld", filename, vargen);
s = lookup(namebuf);
addtyp(newtype(s), t->type, PEXTERN);
n = newname(s);
}
if(t->outtuple > 0) {
vargen++;
- snprint(namebuf, sizeof(namebuf), "_o%s%.3ld", nam, vargen);
+ snprint(namebuf, sizeof(namebuf), "_o%s_%.3ld", filename, vargen);
s = lookup(namebuf);
addtyp(newtype(s), t->type->down, PEXTERN);
n = newname(s);
}
if(t->intuple > 0) {
vargen++;
- snprint(namebuf, sizeof(namebuf), "_i%s%.3ld", nam, vargen);
+ snprint(namebuf, sizeof(namebuf), "_i%s_%.3ld", filename, vargen);
s = lookup(namebuf);
addtyp(newtype(s), t->type->down->down, PEXTERN);
n = newname(s);
f->nname = n->left;
} else {
vargen++;
- snprint(namebuf, sizeof(namebuf), "_e%.3ld", vargen);
+ snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, vargen);
f->nname = newname(lookup(namebuf));
}
f->sym = f->nname->sym;
if(ot->etype == TSTRUCT && ot->vargen == 0) {
vargen++;
- snprint(namebuf, sizeof(namebuf), "_s%.3ld", vargen);
+ snprint(namebuf, sizeof(namebuf), "_s%s_%.3ld", filename, vargen);
s = lookup(namebuf);
addtyp(newtype(s), ot, PEXTERN);
}
s = t->sym;
if(s == S/* || s->name[0] == '_'*/) {
exportgen++;
- snprint(namebuf, sizeof(namebuf), "_e%.3ld", exportgen);
+ snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen);
s = lookup(namebuf);
s->lexical = LATYPE;
s->otype = t;
EXTERN Sym* pkgimportname; // package name from imported package
EXTERN int tptr; // either TPTR32 or TPTR64
extern char* sysimport;
+EXTERN char* filename; // name to uniqify names
EXTERN Type* types[NTYPE];
EXTERN uchar isptr[NTYPE];
* lex.c
*/
int mainlex(int, char*[]);
+void setfilename(char*);
void importfile(Val*);
void cannedimports(void);
void unimportfile();
block = 1;
blockgen = 1;
+ setfilename(argv[0]);
infile = argv[0];
linehist(infile, 0);
return 0;
}
+void
+setfilename(char *file)
+{
+ char *p;
+
+ p = strrchr(file, '/');
+ if(p != nil)
+ file = p+1;
+ strncpy(namebuf, file, sizeof(namebuf));
+ p = strchr(namebuf, '.');
+ if(p != nil)
+ *p = 0;
+ filename = strdup(namebuf);
+}
+
void
importfile(Val *f)
{
l = structfirst(&savel, nl);
r = listfirst(&saver, nr);
nn = N;
-
loop:
if(l == T || r == N) {
if(l != T || r != N)
MOVQ AX, 16(SP)
MOVQ BX, 24(SP)
- // allocate the per-user block
+ // allocate the per-user and per-mach blocks
LEAQ peruser<>(SB), R15 // dedicated u. register
+ LEAQ permach<>(SB), R14 // dedicated m. register
LEAQ (-4096+104+4*8)(SP), AX
MOVQ AX, 0(R15) // 0(R15) is stack limit (w 104b guard)
CALL mal(SB)
LEAQ 104(AX), BX
- MOVQ BX, 16(R15) // 16(R15) is limit of istack (w 104b guard)
+ MOVQ BX, 0(R14) // 0(R14) is limit of istack (w 104b guard)
ADDQ 0(SP), AX
LEAQ (-4*8)(AX), BX
- MOVQ BX, 24(R15) // 24(R15) is base of istack (w auto*4)
+ MOVQ BX, 8(R14) // 8(R14) is base of istack (w auto*4)
CALL check(SB)
TEXT _morestack(SB), 7, $0
// save stuff on interrupt stack
- MOVQ 24(R15), BX // istack
+ MOVQ 8(R14), BX // istack
MOVQ SP, 8(BX) // old SP
MOVQ AX, 16(BX) // magic number
MOVQ 0(R15), AX // old limit
// switch and set up new limit
MOVQ BX, SP
- MOVQ 16(R15), AX // istack limit
+ MOVQ 0(R14), AX // istack limit
MOVQ AX, 0(R15)
// allocate a new stack max of request and 4k
RET
// call a subroutine in a new coroutine
-// argument list is on the stack addr of fn is in AX
+// argument list is on the stack
+// addr of fn is in AX
TEXT sys·_newproc(SB), 7, $0
- JMP AX
+ // save stuff on interrupt stack
+
+ MOVQ 8(R14), CX // istack
+ MOVQ AX, 0(CX) // fn pointer
+ MOVQ BX, 8(CX) // arg size
+ MOVQ SP, 16(CX) // old SP
+ MOVQ 0(R15), AX // old limit
+ MOVQ AX, 24(CX)
+
+ // switch and set up new limit
+
+ MOVQ CX, SP
+ MOVQ 0(R14), AX // istack limit
+ MOVQ AX, 0(R15)
+
+ CALL _newproc(SB)
+
+ // restore old SP and limit
+
+ MOVQ 24(SP), AX // old limit
+ MOVQ AX, 0(R15)
+ MOVQ 16(SP), AX // old SP
+ MOVQ AX, SP
+
RET
TEXT FLUSH(SB),7,$-8
MOVQ R15, AX
RET
+GLOBL permach<>(SB),$64
GLOBL peruser<>(SB),$64
static int8 spmark[] = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe";
-typedef struct U U;
-struct U {
- uint8* stackguard;
- uint8* stackbase;
- uint8* istackguard;
- uint8* istackbase;
-};
+//typedef struct U U;
+//struct U {
+// uint8* stackguard;
+// uint8* stackbase;
+// uint8* istackguard;
+// uint8* istackbase;
+//};
typedef struct Stktop Stktop;
struct Stktop {
// prints(1"check ok\n");
initsig();
}
+
+void
+_newproc(byte* fn, int32 siz, byte* args)
+{
+ prints("_newproc fn=");
+ sys·printpointer(fn);
+ prints("; siz=");
+ sys·printint(siz);
+ prints("; args=");
+ sys·printpointer(args);
+ prints("\n");
+ dump(args, 32);
+}
int32 unused;
void (*fun[])(void);
};
+typedef struct U U;
+struct U
+{
+ byte* stackguard; // must not move
+ byte* stackbase; // must not move
+ U* ufor; // dbl ll of all u
+ U* ubak;
+ U* runqfor; // dbl ll of runnable
+ U* runqbak;
+};
+typedef struct M M;
+struct M
+{
+ byte* istackguard; // must not move
+ byte* istackbase; // must not move
+};
+
+/*
+ * global variables
+ */
+U* allu;
+M* allm;
+U* runq;
/*
* defined constants