mirror of
https://github.com/golang/go.git
synced 2024-10-01 15:27:13 +00:00
only generate non-trivial signatures in the
file in which they occur. avoids duplicate trampoline generation across multiple files. R=ken OCL=20976 CL=20980
This commit is contained in:
parent
a9e890d5cf
commit
cb64ec5bb6
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user