summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKen Thompson <ken@golang.org>2008-07-08 17:19:17 -0700
committerKen Thompson <ken@golang.org>2008-07-08 17:19:17 -0700
commit16b495b639f3cf34ae6b32de343649785ceb5a06 (patch)
treef01c661bf9b8474ad0bfb57472ffb52bf8af3327 /src
parent64f7f1178b7367c8322be22fc311f0827cce18d2 (diff)
downloadgolang-16b495b639f3cf34ae6b32de343649785ceb5a06.tar.gz
unique import/export names
more on go statement SVN=126421
Diffstat (limited to 'src')
-rw-r--r--src/cmd/6g/gen.c38
-rw-r--r--src/cmd/gc/dcl.c12
-rw-r--r--src/cmd/gc/export.c2
-rw-r--r--src/cmd/gc/go.h2
-rw-r--r--src/cmd/gc/lex.c16
-rw-r--r--src/cmd/gc/walk.c1
-rw-r--r--src/runtime/rt0_amd64.s40
-rw-r--r--src/runtime/rt2_amd64.c14
-rw-r--r--src/runtime/runtime.c13
-rw-r--r--src/runtime/runtime.h23
10 files changed, 136 insertions, 25 deletions
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index 9da3dc608..a7a5dc020 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -566,14 +566,46 @@ genpanic(void)
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(&regax, types[TINT64], D_AX);
- gins(ALEAQ, f, &regax);
+ nodreg(&reg, types[TINT64], D_AX);
+ 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);
return;
}
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 9f0c715cf..54a3fadb0 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -144,7 +144,7 @@ funcnam(Type *t, char *nam)
if(nam == nil) {
vargen++;
- snprint(buf, sizeof(buf), "_f%.3ld", vargen);
+ snprint(buf, sizeof(buf), "_f%s_%.3ld", filename, vargen);
nam = buf;
}
@@ -153,7 +153,7 @@ funcnam(Type *t, char *nam)
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);
@@ -162,7 +162,7 @@ funcnam(Type *t, char *nam)
}
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);
@@ -171,7 +171,7 @@ funcnam(Type *t, char *nam)
}
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);
@@ -451,7 +451,7 @@ loop:
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;
@@ -632,7 +632,7 @@ addvar(Node *n, Type *t, int ctxt)
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);
}
diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c
index 2ec84908e..e2ecf6c37 100644
--- a/src/cmd/gc/export.c
+++ b/src/cmd/gc/export.c
@@ -54,7 +54,7 @@ reexport(Type *t)
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;
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 7f5b3829d..e039db7d6 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -370,6 +370,7 @@ EXTERN Sym* pkgmyname; // my name for package
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];
@@ -422,6 +423,7 @@ int yyparse(void);
* lex.c
*/
int mainlex(int, char*[]);
+void setfilename(char*);
void importfile(Val*);
void cannedimports(void);
void unimportfile();
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index eec8d0feb..20cd642b9 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -57,6 +57,7 @@ mainlex(int argc, char *argv[])
block = 1;
blockgen = 1;
+ setfilename(argv[0]);
infile = argv[0];
linehist(infile, 0);
@@ -109,6 +110,21 @@ usage:
}
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)
{
Biobuf *imp;
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index a92358cc8..242233d20 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1078,7 +1078,6 @@ ascompatte(int op, Type **nl, Node **nr, int fp)
l = structfirst(&savel, nl);
r = listfirst(&saver, nr);
nn = N;
-
loop:
if(l == T || r == N) {
if(l != T || r != N)
diff --git a/src/runtime/rt0_amd64.s b/src/runtime/rt0_amd64.s
index edc40dfe1..13883ebff 100644
--- a/src/runtime/rt0_amd64.s
+++ b/src/runtime/rt0_amd64.s
@@ -14,9 +14,10 @@ TEXT _rt0_amd64(SB),7,$-8
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)
@@ -26,11 +27,11 @@ TEXT _rt0_amd64(SB),7,$-8
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)
@@ -75,7 +76,7 @@ TEXT _rt0_amd64(SB),7,$-8
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
@@ -84,7 +85,7 @@ TEXT _morestack(SB), 7, $0
// 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
@@ -180,9 +181,33 @@ TEXT _endmorestack(SB), 7, $-8
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
@@ -192,4 +217,5 @@ TEXT getu(SB),7,$-8
MOVQ R15, AX
RET
+GLOBL permach<>(SB),$64
GLOBL peruser<>(SB),$64
diff --git a/src/runtime/rt2_amd64.c b/src/runtime/rt2_amd64.c
index 795285d7d..632ca9f15 100644
--- a/src/runtime/rt2_amd64.c
+++ b/src/runtime/rt2_amd64.c
@@ -8,13 +8,13 @@ extern int32 debug;
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 {
diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c
index c4ff5f245..9d79fa531 100644
--- a/src/runtime/runtime.c
+++ b/src/runtime/runtime.c
@@ -570,3 +570,16 @@ check(void)
// 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);
+}
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index 14e8f177b..ff9a4e57b 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -61,6 +61,29 @@ struct Map
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