Commit 45288543 authored by Ken Thompson's avatar Ken Thompson

unique import/export names

more on go statement

SVN=126421
parent c40be3b1
...@@ -566,14 +566,46 @@ genpanic(void) ...@@ -566,14 +566,46 @@ genpanic(void)
p->to.type = D_INDIR+D_AX; 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 void
ginscall(Node *f, int proc) ginscall(Node *f, int proc)
{ {
Node regax; Node reg, con;
if(proc) { if(proc) {
nodreg(&regax, types[TINT64], D_AX); nodreg(&reg, types[TINT64], D_AX);
gins(ALEAQ, f, &regax); gins(ALEAQ, f, &reg);
nodreg(&reg, types[TINT64], D_BX);
nodconst(&con, types[TINT32], argsize(f->type));
gins(AMOVL, &con, &reg);
gins(ACALL, N, newproc); gins(ACALL, N, newproc);
return; return;
} }
......
...@@ -144,7 +144,7 @@ funcnam(Type *t, char *nam) ...@@ -144,7 +144,7 @@ funcnam(Type *t, char *nam)
if(nam == nil) { if(nam == nil) {
vargen++; vargen++;
snprint(buf, sizeof(buf), "_f%.3ld", vargen); snprint(buf, sizeof(buf), "_f%s_%.3ld", filename, vargen);
nam = buf; nam = buf;
} }
...@@ -153,7 +153,7 @@ funcnam(Type *t, char *nam) ...@@ -153,7 +153,7 @@ funcnam(Type *t, char *nam)
if(t->thistuple > 0) { if(t->thistuple > 0) {
vargen++; vargen++;
snprint(namebuf, sizeof(namebuf), "_t%s%.3ld", nam, vargen); snprint(namebuf, sizeof(namebuf), "_t%s_%.3ld", filename, vargen);
s = lookup(namebuf); s = lookup(namebuf);
addtyp(newtype(s), t->type, PEXTERN); addtyp(newtype(s), t->type, PEXTERN);
n = newname(s); n = newname(s);
...@@ -162,7 +162,7 @@ funcnam(Type *t, char *nam) ...@@ -162,7 +162,7 @@ funcnam(Type *t, char *nam)
} }
if(t->outtuple > 0) { if(t->outtuple > 0) {
vargen++; vargen++;
snprint(namebuf, sizeof(namebuf), "_o%s%.3ld", nam, vargen); snprint(namebuf, sizeof(namebuf), "_o%s_%.3ld", filename, vargen);
s = lookup(namebuf); s = lookup(namebuf);
addtyp(newtype(s), t->type->down, PEXTERN); addtyp(newtype(s), t->type->down, PEXTERN);
n = newname(s); n = newname(s);
...@@ -171,7 +171,7 @@ funcnam(Type *t, char *nam) ...@@ -171,7 +171,7 @@ funcnam(Type *t, char *nam)
} }
if(t->intuple > 0) { if(t->intuple > 0) {
vargen++; vargen++;
snprint(namebuf, sizeof(namebuf), "_i%s%.3ld", nam, vargen); snprint(namebuf, sizeof(namebuf), "_i%s_%.3ld", filename, vargen);
s = lookup(namebuf); s = lookup(namebuf);
addtyp(newtype(s), t->type->down->down, PEXTERN); addtyp(newtype(s), t->type->down->down, PEXTERN);
n = newname(s); n = newname(s);
...@@ -451,7 +451,7 @@ loop: ...@@ -451,7 +451,7 @@ loop:
f->nname = n->left; f->nname = n->left;
} else { } else {
vargen++; vargen++;
snprint(namebuf, sizeof(namebuf), "_e%.3ld", vargen); snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, vargen);
f->nname = newname(lookup(namebuf)); f->nname = newname(lookup(namebuf));
} }
f->sym = f->nname->sym; f->sym = f->nname->sym;
...@@ -632,7 +632,7 @@ addvar(Node *n, Type *t, int ctxt) ...@@ -632,7 +632,7 @@ addvar(Node *n, Type *t, int ctxt)
if(ot->etype == TSTRUCT && ot->vargen == 0) { if(ot->etype == TSTRUCT && ot->vargen == 0) {
vargen++; vargen++;
snprint(namebuf, sizeof(namebuf), "_s%.3ld", vargen); snprint(namebuf, sizeof(namebuf), "_s%s_%.3ld", filename, vargen);
s = lookup(namebuf); s = lookup(namebuf);
addtyp(newtype(s), ot, PEXTERN); addtyp(newtype(s), ot, PEXTERN);
} }
......
...@@ -54,7 +54,7 @@ reexport(Type *t) ...@@ -54,7 +54,7 @@ reexport(Type *t)
s = t->sym; s = t->sym;
if(s == S/* || s->name[0] == '_'*/) { if(s == S/* || s->name[0] == '_'*/) {
exportgen++; exportgen++;
snprint(namebuf, sizeof(namebuf), "_e%.3ld", exportgen); snprint(namebuf, sizeof(namebuf), "_e%s_%.3ld", filename, exportgen);
s = lookup(namebuf); s = lookup(namebuf);
s->lexical = LATYPE; s->lexical = LATYPE;
s->otype = t; s->otype = t;
......
...@@ -370,6 +370,7 @@ EXTERN Sym* pkgmyname; // my name for package ...@@ -370,6 +370,7 @@ EXTERN Sym* pkgmyname; // my name for package
EXTERN Sym* pkgimportname; // package name from imported package EXTERN Sym* pkgimportname; // package name from imported package
EXTERN int tptr; // either TPTR32 or TPTR64 EXTERN int tptr; // either TPTR32 or TPTR64
extern char* sysimport; extern char* sysimport;
EXTERN char* filename; // name to uniqify names
EXTERN Type* types[NTYPE]; EXTERN Type* types[NTYPE];
EXTERN uchar isptr[NTYPE]; EXTERN uchar isptr[NTYPE];
...@@ -422,6 +423,7 @@ int yyparse(void); ...@@ -422,6 +423,7 @@ int yyparse(void);
* lex.c * lex.c
*/ */
int mainlex(int, char*[]); int mainlex(int, char*[]);
void setfilename(char*);
void importfile(Val*); void importfile(Val*);
void cannedimports(void); void cannedimports(void);
void unimportfile(); void unimportfile();
......
...@@ -57,6 +57,7 @@ mainlex(int argc, char *argv[]) ...@@ -57,6 +57,7 @@ mainlex(int argc, char *argv[])
block = 1; block = 1;
blockgen = 1; blockgen = 1;
setfilename(argv[0]);
infile = argv[0]; infile = argv[0];
linehist(infile, 0); linehist(infile, 0);
...@@ -108,6 +109,21 @@ usage: ...@@ -108,6 +109,21 @@ usage:
return 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 void
importfile(Val *f) importfile(Val *f)
{ {
......
...@@ -1078,7 +1078,6 @@ ascompatte(int op, Type **nl, Node **nr, int fp) ...@@ -1078,7 +1078,6 @@ ascompatte(int op, Type **nl, Node **nr, int fp)
l = structfirst(&savel, nl); l = structfirst(&savel, nl);
r = listfirst(&saver, nr); r = listfirst(&saver, nr);
nn = N; nn = N;
loop: loop:
if(l == T || r == N) { if(l == T || r == N) {
if(l != T || r != N) if(l != T || r != N)
......
...@@ -14,9 +14,10 @@ TEXT _rt0_amd64(SB),7,$-8 ...@@ -14,9 +14,10 @@ TEXT _rt0_amd64(SB),7,$-8
MOVQ AX, 16(SP) MOVQ AX, 16(SP)
MOVQ BX, 24(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 peruser<>(SB), R15 // dedicated u. register
LEAQ permach<>(SB), R14 // dedicated m. register
LEAQ (-4096+104+4*8)(SP), AX LEAQ (-4096+104+4*8)(SP), AX
MOVQ AX, 0(R15) // 0(R15) is stack limit (w 104b guard) MOVQ AX, 0(R15) // 0(R15) is stack limit (w 104b guard)
...@@ -26,11 +27,11 @@ TEXT _rt0_amd64(SB),7,$-8 ...@@ -26,11 +27,11 @@ TEXT _rt0_amd64(SB),7,$-8
CALL mal(SB) CALL mal(SB)
LEAQ 104(AX), BX 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 ADDQ 0(SP), AX
LEAQ (-4*8)(AX), BX 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) CALL check(SB)
...@@ -75,7 +76,7 @@ TEXT _rt0_amd64(SB),7,$-8 ...@@ -75,7 +76,7 @@ TEXT _rt0_amd64(SB),7,$-8
TEXT _morestack(SB), 7, $0 TEXT _morestack(SB), 7, $0
// save stuff on interrupt stack // save stuff on interrupt stack
MOVQ 24(R15), BX // istack MOVQ 8(R14), BX // istack
MOVQ SP, 8(BX) // old SP MOVQ SP, 8(BX) // old SP
MOVQ AX, 16(BX) // magic number MOVQ AX, 16(BX) // magic number
MOVQ 0(R15), AX // old limit MOVQ 0(R15), AX // old limit
...@@ -84,7 +85,7 @@ TEXT _morestack(SB), 7, $0 ...@@ -84,7 +85,7 @@ TEXT _morestack(SB), 7, $0
// switch and set up new limit // switch and set up new limit
MOVQ BX, SP MOVQ BX, SP
MOVQ 16(R15), AX // istack limit MOVQ 0(R14), AX // istack limit
MOVQ AX, 0(R15) MOVQ AX, 0(R15)
// allocate a new stack max of request and 4k // allocate a new stack max of request and 4k
...@@ -180,9 +181,33 @@ TEXT _endmorestack(SB), 7, $-8 ...@@ -180,9 +181,33 @@ TEXT _endmorestack(SB), 7, $-8
RET RET
// call a subroutine in a new coroutine // 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 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 RET
TEXT FLUSH(SB),7,$-8 TEXT FLUSH(SB),7,$-8
...@@ -192,4 +217,5 @@ TEXT getu(SB),7,$-8 ...@@ -192,4 +217,5 @@ TEXT getu(SB),7,$-8
MOVQ R15, AX MOVQ R15, AX
RET RET
GLOBL permach<>(SB),$64
GLOBL peruser<>(SB),$64 GLOBL peruser<>(SB),$64
...@@ -8,13 +8,13 @@ extern int32 debug; ...@@ -8,13 +8,13 @@ extern int32 debug;
static int8 spmark[] = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe"; static int8 spmark[] = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe";
typedef struct U U; //typedef struct U U;
struct U { //struct U {
uint8* stackguard; // uint8* stackguard;
uint8* stackbase; // uint8* stackbase;
uint8* istackguard; // uint8* istackguard;
uint8* istackbase; // uint8* istackbase;
}; //};
typedef struct Stktop Stktop; typedef struct Stktop Stktop;
struct Stktop { struct Stktop {
......
...@@ -570,3 +570,16 @@ check(void) ...@@ -570,3 +570,16 @@ check(void)
// prints(1"check ok\n"); // prints(1"check ok\n");
initsig(); 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);
}
...@@ -61,6 +61,29 @@ struct Map ...@@ -61,6 +61,29 @@ struct Map
int32 unused; int32 unused;
void (*fun[])(void); 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 * defined constants
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment