diff --git a/src/cmd/6l/6.out.h b/src/cmd/6l/6.out.h index 8006826405aaf2fbc132e17bb2faa825c27c2f50..6473bc0bb25c192d5e2e3d8d31f64612687085ff 100644 --- a/src/cmd/6l/6.out.h +++ b/src/cmd/6l/6.out.h @@ -32,6 +32,7 @@ #define NSNAME 8 #define NOPROF (1<<0) #define DUPOK (1<<1) +#define SOFmark (11) /* * amd64 diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 3ae914afe4553bd1946d4e411b1711bf0548ec52..fca576fa6eaa8e5112373c9505e01ac943d6d8b1 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -138,7 +138,8 @@ asmb(void) for(p = firstp; p != P; p = p->link) { if(p->as == ATEXT) curtext = p; - if(p->pc != pc) { + if(p->pc != pc) + if(p->as != ATEXT || p->pc != pc+SOFmark) { 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 bb5c0a850d44c6cfe41ec93971cf403221895ec3..5e437cd3805cd9bec5f397127d1e8e5929fb1550 100644 --- a/src/cmd/6l/l.h +++ b/src/cmd/6l/l.h @@ -217,6 +217,7 @@ enum Zaut_r, Zo_m, Zo_m64, + Ztext, Zpseudo, Zr_m, Zr_m_xm, diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c index fb84209504b4e454406f71787a1712bf6cd77f79..47339fe7e018d073ee336c454c58f721e3b3c722 100644 --- a/src/cmd/6l/obj.c +++ b/src/cmd/6l/obj.c @@ -925,7 +925,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 d99797166254cfc890d737eb31b5cd13dbfb9119..f07eb18df26e06c99e0f1f0ce8ca69bd1729e12e 100644 --- a/src/cmd/6l/optab.c +++ b/src/cmd/6l/optab.c @@ -37,7 +37,7 @@ uchar ynone[] = }; uchar ytext[] = { - Ymb, Yi32, Zpseudo,1, + Ymb, Yi32, Ztext, 1, 0 }; uchar ynop[] = diff --git a/src/cmd/6l/span.c b/src/cmd/6l/span.c index 4b225da8caafdc0600fc4114184f277a584a80ae..4ade9e3d1f9b5518de5cc8a98e113271bbc15bd8 100644 --- a/src/cmd/6l/span.c +++ b/src/cmd/6l/span.c @@ -83,6 +83,8 @@ 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; @@ -113,6 +115,8 @@ loop: } } p->pc = c; + if(p->as == ATEXT) + p->pc += SOFmark; // skip the stack marker c += p->mark; } if(again) { @@ -269,7 +273,7 @@ asmlc(void) Prog *p; long oldlc, v, s; - oldpc = INITTEXT; + oldpc = INITTEXT+SOFmark; oldlc = 0; for(p = firstp; p != P; p = p->link) { if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) { @@ -1120,6 +1124,19 @@ 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<SOFmark-3; v++) + *andptr++ = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe"[v]; + break; + case Zpseudo: break;