From: Ken Thompson Date: Thu, 19 Jun 2008 05:07:09 +0000 (-0700) Subject: stack offset X-Git-Tag: weekly.2009-11-06~3651 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ddba96aed81ab702b9be4cf0efd4d98ca6f2fe4d;p=gostls13.git stack offset SVN=123521 --- diff --git a/src/cmd/6l/6.out.h b/src/cmd/6l/6.out.h index 6473bc0bb2..ae67854a18 100644 --- a/src/cmd/6l/6.out.h +++ b/src/cmd/6l/6.out.h @@ -32,7 +32,7 @@ #define NSNAME 8 #define NOPROF (1<<0) #define DUPOK (1<<1) -#define SOFmark (11) +#define SOFmark "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe" /* * amd64 diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index fca576fa6e..3ae914afe4 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -138,8 +138,7 @@ asmb(void) for(p = firstp; p != P; p = p->link) { if(p->as == ATEXT) curtext = p; - if(p->pc != pc) - if(p->as != ATEXT || p->pc != pc+SOFmark) { + if(p->pc != pc) { if(!debug['a']) print("%P\n", curp); diag("phase error %llux sb %llux in %s", p->pc, pc, TNAME); diff --git a/src/cmd/6l/l.h b/src/cmd/6l/l.h index 5e437cd380..ae1bec5c02 100644 --- a/src/cmd/6l/l.h +++ b/src/cmd/6l/l.h @@ -217,7 +217,6 @@ enum Zaut_r, Zo_m, Zo_m64, - Ztext, Zpseudo, Zr_m, Zr_m_xm, @@ -388,6 +387,7 @@ void export(void); int find1(long, int); int find2(long, int); void follow(void); +void addstachmark(void); void gethunk(void); void histtoauto(void); double ieeedtod(Ieee*); diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c index 47339fe7e0..83fae2e5a0 100644 --- a/src/cmd/6l/obj.c +++ b/src/cmd/6l/obj.c @@ -400,6 +400,7 @@ main(int argc, char *argv[]) doprof1(); else doprof2(); + addstackmark(); span(); doinit(); asmb(); @@ -925,9 +926,9 @@ loop: sig = 1729; if(sig != 0){ if(s->sig != 0 && s->sig != sig) - diag("incompatible type signatures %lux(%s)" - "and %lux(%s) for %s", s->sig, - filen[s->file], sig, pn, s->name); + diag("incompatible type signatures" + "%lux(%s) and %lux(%s) for %s", + s->sig, filen[s->file], sig, pn, s->name); s->sig = sig; s->file = files-1; } diff --git a/src/cmd/6l/optab.c b/src/cmd/6l/optab.c index f07eb18df2..d997971662 100644 --- a/src/cmd/6l/optab.c +++ b/src/cmd/6l/optab.c @@ -37,7 +37,7 @@ uchar ynone[] = }; uchar ytext[] = { - Ymb, Yi32, Ztext, 1, + Ymb, Yi32, Zpseudo,1, 0 }; uchar ynop[] = diff --git a/src/cmd/6l/pass.c b/src/cmd/6l/pass.c index 5884022383..db81bf163e 100644 --- a/src/cmd/6l/pass.c +++ b/src/cmd/6l/pass.c @@ -281,6 +281,112 @@ loop: goto loop; } +Prog* +byteq(int v) +{ + Prog *p; + + p = prg(); + p->as = ABYTE; + p->from.type = D_CONST; + p->from.offset = v&0xff; + return p; +} + +void +markstk(Prog *l) +{ + Prog *p0, *p, *q, *r; + long i, n, line; + Sym *s; + + version++; + s = lookup(l->from.sym->name, version); + s->type = STEXT; + line = l->line; + + // start with fake copy of ATEXT + p0 = prg(); + p = p0; + *p = *l; // note this gets p->pcond and p->line + + p->from.type = D_STATIC; + p->from.sym = s; + p->to.offset = 0; + + // put out magic sequence + n = strlen(SOFmark); + for(i=0; iline = line; + p->link = q; + p = q; + } + + // put out stack offset + n = l->to.offset; + if(n < 0) + n = 0; + for(i=0; i<3; i++) { + q = byteq(n); + q->line = line; + p->link = q; + p = q; + n = n>>8; + } + + // put out null terminated name + for(i=0;; i++) { + n = s->name[i]; + q = byteq(n); + q->line = line; + p->link = q; + p = q; + if(n == 0) + break; + } + + // put out return instruction + q = prg(); + q->as = ARET; + q->line = line; + p->link = q; + p = q; + + r = l->pcond; + l->pcond = p0; + p->link = r; + p0->pcond = r; + + // hard part is linking end of + // the text body to my fake ATEXT + for(p=l;; p=q) { + q = p->link; + if(q == r) { + p->link = p0; + return; + } + } +} + +void +addstackmark(void) +{ + Prog *p; + + if(debug['v']) + Bprint(&bso, "%5.2f stkmark\n", cputime()); + Bflush(&bso); + + for(p=textp; p!=P; p=p->pcond) { + markstk(p); // splice in new body + p = p->pcond; // skip the one we just put in + } + +// for(p=textp; p!=P; p=p->pcond) +// print("%P\n", p); +} + int relinv(int a) { @@ -344,6 +450,7 @@ patch(void) if(debug['v']) Bprint(&bso, "%5.2f patch\n", cputime()); Bflush(&bso); + s = lookup("exit", 0); vexit = s->value; for(p = firstp; p != P; p = p->link) { diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c index 4ade9e3d1f..4b225da8ca 100644 --- a/src/cmd/6l/span.c +++ b/src/cmd/6l/span.c @@ -83,8 +83,6 @@ start: p->pc = c; asmins(p); p->pc = c; - if(p->as == ATEXT) - p->pc += SOFmark; // skip the stack marker m = andptr-and; p->mark = m; c += m; @@ -115,8 +113,6 @@ loop: } } p->pc = c; - if(p->as == ATEXT) - p->pc += SOFmark; // skip the stack marker c += p->mark; } if(again) { @@ -273,7 +269,7 @@ asmlc(void) Prog *p; long oldlc, v, s; - oldpc = INITTEXT+SOFmark; + oldpc = INITTEXT; oldlc = 0; for(p = firstp; p != P; p = p->link) { if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) { @@ -1124,19 +1120,6 @@ found: diag("asmins: unknown z %d %P", t[2], p); return; - case Ztext: - v = p->to.offset; - if(v < 0) - v = 0; - - // eleven bytes of buried stack offset - *andptr++ = v>>3; - *andptr++ = v>>11; - *andptr++ = v>>19; - for(v=0; v