bug generating duplicate interface signatures

R=r
OCL=15119
CL=15119
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index 20654fa..ac807c6 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -322,7 +322,11 @@
 
 	s = t->sym;
 	if(s == S)
-		fatal("nodtypesig: no sym for type");
+		fatal("signame: no sym for type");
+
+	// mark it as used so signature will be generated
+	if(s->local == 1)
+		s->local = 2;
 
 	snprint(namebuf, sizeof(namebuf), "%s_%s", e, s->name);
 	s = pkglookup(namebuf, s->package);
diff --git a/src/cmd/6g/obj.c b/src/cmd/6g/obj.c
index 709ece3..f1f86ee 100644
--- a/src/cmd/6g/obj.c
+++ b/src/cmd/6g/obj.c
@@ -459,7 +459,7 @@
 void
 dumpsignatures(void)
 {
-	Dcl *d;
+	Dcl *d, *x;
 	Type *t, *f;
 	Sym *s1, *s;
 	int et, o, wi, ot;
@@ -468,6 +468,44 @@
 	Prog *p;
 	char *sp;
 
+	// copy externdcl list to signatlist
+	for(d=externdcl; d!=D; d=d->forw) {
+		if(d->op != OTYPE)
+			continue;
+
+		t = d->dtype;
+		if(t == T)
+			continue;
+
+		et = t->etype;
+		if(et != TSTRUCT && et != TINTER)
+			continue;
+
+		s = d->dsym;
+		if(s == S)
+			continue;
+
+		if(s->name[0] == '_')
+			continue;
+
+		// if it was imported
+		if(s->local == 0)
+			continue;
+
+// until i can figure out
+// when/if it is used, do them all
+//		// if not used and not exported
+//		if(s->local == 1 && !s->export)
+//			continue;
+
+		x = mal(sizeof(*d));
+		x->op = OTYPE;
+		x->dsym = s;
+		x->dtype = t;
+		x->forw = signatlist;
+		signatlist = x;
+	}
+
 	/*
 	 * put all the names into a linked
 	 * list so that it may be generated in sorted order.
@@ -505,7 +543,7 @@
 
 	wi = types[TINT32]->width;
 
-	for(d=externdcl; d!=D; d=d->forw) {
+	for(d=signatlist; d!=D; d=d->forw) {
 		if(d->op != OTYPE)
 			continue;
 
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index 54c437d..01b4902 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -52,6 +52,7 @@
 	}
 	if(exportadj)
 		exportsym(n->sym);
+	n->sym->local = 1;
 	addtyp(n, t, dclcontext);
 }
 
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 11d8b56..b7019bc 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -195,8 +195,9 @@
 
 	uchar	undef;		// a diagnostic has been generated
 	uchar	export;		// marked as export
-	uchar	exported;	// has been exported
+	uchar	exported;	// exported
 	uchar	sym;		// huffman encoding in object file
+	uchar	local;		// created in this file
 
 	char*	opackage;	// original package name
 	char*	package;	// package name
@@ -429,6 +430,7 @@
 EXTERN	Dcl*	paramdcl;
 EXTERN	Dcl*	externdcl;
 EXTERN	Dcl*	exportlist;
+EXTERN	Dcl*	signatlist;
 EXTERN	int	dclcontext;	// PEXTERN/PAUTO
 EXTERN	int	importflag;
 EXTERN	int	inimportsys;
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index c317fbd..8612f6d 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -1970,8 +1970,6 @@
 			goto shape;
 
 		// mapassign1(hmap *map[any-1]any-2, key any-3, val any-4);
-
-//dump("assign1", n);
 		if(n->left->op != OINDEX)
 			goto shape;
 
@@ -1999,8 +1997,6 @@
 
 	assign2:
 		// mapassign2(hmap *map[any]any, key any, val any, pres bool);
-
-//dump("assign2", n);
 		if(n->left->op != OINDEX)
 			goto shape;