]> Cypherpunks repositories - gostls13.git/commitdiff
stack offset
authorKen Thompson <ken@golang.org>
Thu, 19 Jun 2008 05:07:09 +0000 (22:07 -0700)
committerKen Thompson <ken@golang.org>
Thu, 19 Jun 2008 05:07:09 +0000 (22:07 -0700)
SVN=123521

src/cmd/6l/6.out.h
src/cmd/6l/asm.c
src/cmd/6l/l.h
src/cmd/6l/obj.c
src/cmd/6l/optab.c
src/cmd/6l/pass.c
src/cmd/6l/span.c

index 6473bc0bb25c192d5e2e3d8d31f64612687085ff..ae67854a186b21a23e7900648a5541fda0463ca7 100644 (file)
@@ -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
index fca576fa6eaa8e5112373c9505e01ac943d6d8b1..3ae914afe4553bd1946d4e411b1711bf0548ec52 100644 (file)
@@ -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);
index 5e437cd3805cd9bec5f397127d1e8e5929fb1550..ae1bec5c02eec1beda4be36979c6b5815f52ca61 100644 (file)
@@ -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*);
index 47339fe7e018d073ee336c454c58f721e3b3c722..83fae2e5a05d2c10e78d1e1d1798ade324918f2b 100644 (file)
@@ -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;
                }
index f07eb18df26e06c99e0f1f0ce8ca69bd1729e12e..d99797166254cfc890d737eb31b5cd13dbfb9119 100644 (file)
@@ -37,7 +37,7 @@ uchar ynone[] =
 };
 uchar  ytext[] =
 {
-       Ymb,    Yi32,   Ztext,  1,
+       Ymb,    Yi32,   Zpseudo,1,
        0
 };
 uchar  ynop[] =
index 5884022383c9affcd20f896a26c5f19eafabbbcf..db81bf163e811d3210a7f515e68066eb53ff7673 100644 (file)
@@ -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; i<n; i++) {
+               q = byteq(SOFmark[i]);
+               q->line = 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) {
index 4ade9e3d1f9b5518de5cc8a98e113271bbc15bd8..4b225da8caafdc0600fc4114184f277a584a80ae 100644 (file)
@@ -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<SOFmark-3; v++)
-                       *andptr++ = "\xa7\xf1\xd9\x2a\x82\xc8\xd8\xfe"[v];
-               break;
-
        case Zpseudo:
                break;