]> Cypherpunks repositories - gostls13.git/commitdiff
only generate non-trivial signatures in the
authorRuss Cox <rsc@golang.org>
Thu, 11 Dec 2008 19:54:33 +0000 (11:54 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 11 Dec 2008 19:54:33 +0000 (11:54 -0800)
file in which they occur.  avoids duplicate
trampoline generation across multiple files.

R=ken
OCL=20976
CL=20980

src/cmd/6g/obj.c
src/cmd/gc/dcl.c
src/cmd/gc/export.c
src/cmd/gc/go.h
src/cmd/gc/walk.c

index b04a440c0dc71b68933f6f9297a119280a76342d..13a9c9b1ba00da3cbccc1fa4ec865a4e4d099851 100644 (file)
@@ -707,10 +707,12 @@ dumpsigt(Type *t0, Sym *s)
 
        // set DUPOK to allow other .6s to contain
        // the same signature.  only one will be chosen.
+       // should only happen for empty signatures
        p = pc;
        gins(AGLOBL, N, N);
        p->from = at;
-       p->from.scale = DUPOK;
+       if(a == nil)
+               p->from.scale = DUPOK;
        p->to = ac;
        p->to.offset = ot;
 }
@@ -891,17 +893,20 @@ dumpsignatures(void)
                        continue;
                s->siggen = 1;
 
-//print("dosig %T\n", t);
-               // don't emit signatures for *NamedStruct or interface if
-               // they were defined by other packages.
-               // (optimization)
+               // don't emit non-trivial signatures for types defined outside this file.
+               // non-trivial signatures might also drag in generated trampolines,
+               // and ar can't handle duplicates of the trampolines.
                s1 = S;
-               if(isptr[et] && t->type != T)
+               if(isptr[et] && t->type != T) {
                        s1 = t->type->sym;
-               else if(et == TINTER)
+                       if(s1 && !t->type->local)
+                               continue;
+               }
+               else if(et == TINTER) {
                        s1 = t->sym;
-               if(s1 != S && strcmp(s1->opackage, package) != 0)
-                       continue;
+                       if(s1 && !t->local)
+                               continue;
+               }
 
                if(et == TINTER)
                        dumpsigi(t, s);
index 7448b6cc15c3e807f7fdc129939dfcad924bac97..c2754f0da4810a908b40c1a47be66b999024ff53 100644 (file)
@@ -78,7 +78,7 @@ dodcltype(Type *n)
        addtyp(n, dclcontext);
 
 found:
-       n->sym->local = 1;
+       n->local = 1;
        if(dcladj)
                dcladj(n->sym);
        return n;
@@ -118,6 +118,8 @@ updatetype(Type *n, Type *t)
                fatal("updatetype %T / %T", n, t);
        }
 
+       if(n->local)
+               t->local = 1;
        *n = *t;
        n->sym = s;
 
@@ -274,8 +276,8 @@ addmethod(Node *n, Type *t, int local)
        st = pa->sym;
        if(st == S)
                goto bad;
-       if(local && !st->local) {
-               yyerror("method receiver type must be locally defined: %S", st);
+       if(local && !f->local) {
+               yyerror("method receiver type must be locally defined: %T", f);
                return;
        }
 
@@ -558,7 +560,6 @@ dcopy(Sym *a, Sym *b)
        a->vargen = b->vargen;
        a->block = b->block;
        a->lastlineno = b->lastlineno;
-       a->local = b->local;
        a->offset = b->offset;
 }
 
@@ -1233,7 +1234,7 @@ variter(Node *vv, Type *t, Node *ee)
 loop:
        if(v == N && e == N)
                return rev(r);
-       
+
        if(v == N || e == N) {
                yyerror("shape error in var dcl");
                return rev(r);
@@ -1279,7 +1280,7 @@ loop:
                iota += 1;
                return;
        }
-       
+
        if(v == N || c == N) {
                yyerror("shape error in var dcl");
                iota += 1;
index 3d7984bd8e9ad3ed0ca2eca7628ac3989579fe06..de5f9906582d81e3765988e83af1e18a1648640d 100644 (file)
@@ -203,7 +203,7 @@ dumptype(Type *t)
                return;
 
        // no need to dump type if it's not ours (was imported)
-       if(t->sym != S && t->sym->otype == t && !t->sym->local)
+       if(t->sym != S && t->sym->otype == t && !t->local)
                return;
 
        Bprint(bout, "type %#T %l#T\n",  t, t);
index 5dea32c7cfc1b8e2721552e51017d853c2ca66c3..8ab5c24dae393ae284e441b2d8cb5ff7debc684f 100644 (file)
@@ -157,6 +157,7 @@ struct      Type
        uchar   siggen;
        uchar   funarg;
        uchar   copyany;
+       uchar   local;          // created in this file
 
        // TFUNCT
        uchar   thistuple;
@@ -238,7 +239,6 @@ struct      Sym
        uchar   exported;       // exported
        uchar   imported;       // imported
        uchar   sym;            // huffman encoding in object file
-       uchar   local;          // created in this file
        uchar   uniq;           // imbedded field name first found
        uchar   siggen;         // signature generated
 
index 37a690302a92a4e5ff796a58f7b97996f361c9b5..d31b1269a275449058a7b236fc8fb5eea3e42def 100644 (file)
@@ -1465,7 +1465,7 @@ walkselect(Node *sel)
                                res = list(res, oc);
                                break;
 
-                               
+
                        }
                        bod = N;
                        count++;
@@ -1699,6 +1699,7 @@ sigtype(Type *st)
        t = newtype(s);
        t = dodcltype(t);
        updatetype(t, st);
+       t->local = 1;
 
        // record internal type for signature generation
        x = mal(sizeof(*x));