rename various magic names.
	sigi and sigt:
	sys·sigi_inter -> sigi·inter
	sys·sigt_int -> sigt·int
	Package·sigt_Type -> sigt·Package.Type

	local type T in file x.go T_x -> T·x
	second one T_x_1 -> T·x·1

	method names M on T  T_M -> T·M

correctly handle local embedded types

init functions are the only place left that use underscores

R=ken
OCL=18377
CL=18377
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index f88d2ab..3fb7710 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -200,8 +200,8 @@
 	return 1;
 }
 
-Node*
-methodname(Node *n, Type *t)
+Sym*
+methodsym(Sym *nsym, Type *t)
 {
 	Sym *s;
 	char buf[NSYMB];
@@ -213,12 +213,24 @@
 	if(s == S)
 		goto bad;
 
-	snprint(buf, sizeof(buf), "%s_%s", s->name, n->sym->name);
-	return newname(pkglookup(buf, s->opackage));
+	snprint(buf, sizeof(buf), "%#hT·%s", t, nsym->name);
+//print("methodname %s\n", buf);
+	return pkglookup(buf, s->opackage);
 
 bad:
 	yyerror("illegal <this> type: %T", t);
-	return n;
+	return S;
+}
+
+Node*
+methodname(Node *n, Type *t)
+{
+	Sym *s;
+	
+	s = methodsym(n->sym, t);
+	if(s == S)
+		return n;
+	return newname(s);
 }
 
 /*
@@ -449,7 +461,6 @@
 {
 	Type *f;
 	Iter save;
-	char buf[100];
 	String *note;
 
 	n = listfirst(&save, &n);
@@ -740,7 +751,6 @@
 {
 	Dcl *r, *d;
 	Sym *s;
-	char *p;
 	static int typgen;
 
 	if(n==T || n->sym == S)
@@ -753,9 +763,7 @@
 	else {
 		r = autodcl;
 		pushdcl(s);
-		p = smprint("%s_%d", s->name, ++typgen);
-		n->xsym = lookup(p);
-		free(p);
+		n->vargen = ++typgen;
 	}
 
 	if(s->tblock == block)
@@ -1168,8 +1176,19 @@
 embedded(Sym *s)
 {
 	Node *n;
+	char *name;
+	
+	// Names sometimes have disambiguation junk
+	// appended after a center dot.  Discard it when
+	// making the name for the embedded struct field.
+	enum { CenterDot = 0xB7 };
+	name = s->name;
+	if(utfrune(s->name, CenterDot)) {
+		name = strdup(s->name);
+		*utfrune(name, CenterDot) = 0;
+	}
 
-	n = newname(lookup(s->name));
+	n = newname(lookup(name));
 	n = nod(ODCLFIELD, n, N);
 	n->embedded = 1;
 	if(s == S)
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 314333f..025edaa 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -135,7 +135,6 @@
 	Type*	method;
 
 	Sym*	sym;
-	Sym*	xsym;		// export sym
 	int32	vargen;		// unique name for OTYPE/ONAME
 
 	Node*	nname;
@@ -190,7 +189,6 @@
 	Val	val;
 
 	Sym*	osym;		// import
-	Sym*	fsym;		// import
 	Sym*	psym;		// import
 	Sym*	sym;		// various
 	int32	vargen;		// unique name for OTYPE/ONAME
@@ -665,6 +663,7 @@
 int	listcount(Node*);
 void	addmethod(Node*, Type*, int);
 Node*	methodname(Node*, Type*);
+Sym*	methodsym(Sym*, Type*);
 Type*	functype(Node*, Node*, Node*);
 char*	thistypenam(Node*);
 void	funcnam(Type*, char*);
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 9da4738..15650c8 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -984,12 +984,17 @@
 		if(t == types[t->etype] || t == types[TSTRING])
 			return fmtprint(fp, "%s", s->name);
 		if(exporting) {
-			if(t->xsym != S)
-				s = t->xsym;
+			if(fp->flags & FmtShort)
+				fmtprint(fp, "%hS", s);
+			else
+				fmtprint(fp, "%lS", s);
 			if(strcmp(s->opackage, package) == 0)
-			if(s->otype != t || !s->export)
-				return fmtprint(fp, "%lS_%s", s, filename);
-			return fmtprint(fp, "%lS", s);
+			if(s->otype != t || !s->export) {
+				fmtprint(fp, "·%s", filename);
+				if(t->vargen)
+					fmtprint(fp, "·%d", t->vargen);
+			}
+			return 0;
 		}
 		return fmtprint(fp, "%S", s);
 	}
@@ -1606,12 +1611,11 @@
 	int et;
 	Sym *s;
 	char buf[NSYMB];
-	char *glob;
+	char *sigx;
 
 	if(t == T)
 		return S;
 
-	glob = "sys";
 	et = t->etype;
 	switch(et) {
 	default:
@@ -1620,7 +1624,8 @@
 	case TINTER:
 	case TDDD:
 		if(isnilinter(t)) {
-			snprint(buf, sizeof(buf), "%s_%s", "sigi", "inter");
+			sigx = "sigi";
+			strcpy(buf, "inter");
 			goto out;
 		}
 		return S;
@@ -1660,10 +1665,11 @@
 		return S;
 	if(strcmp(t->sym->name, types[et]->sym->name) != 0)
 		return S;
-	snprint(buf, sizeof(buf), "%s_%S", "sigt", t->sym);
+	sigx = "sigt";
+	snprint(buf, sizeof(buf), "%#T", t);
 
 out:
-	s = pkglookup(buf, glob);
+	s = pkglookup(buf, sigx);
 	if(s->oname == N) {
 		s->oname = newname(s);
 		s->oname->type = types[TUINT8];
@@ -1709,8 +1715,6 @@
 		block = s->tblock;
 
 	if(block > 1) {
-		snprint(buf, sizeof(buf), "%s_%d%s", e, block, s->name);
-
 		// record internal type for signature generation
 		x = mal(sizeof(*x));
 		x->op = OTYPE;
@@ -1719,10 +1723,9 @@
 		x->forw = signatlist;
 		x->block = block;
 		signatlist = x;
-	} else
-		snprint(buf, sizeof(buf), "%s_%s", e, s->name);
-
-	ss = pkglookup(buf, s->opackage);
+	}
+	snprint(buf, sizeof(buf), "%#T", t);
+	ss = pkglookup(buf, e);
 	if(ss->oname == N) {
 		ss->oname = newname(ss);
 		ss->oname->type = types[TUINT8];
@@ -2494,7 +2497,6 @@
 {
 	Type *t;
 	Sym *s;
-	Node *l;
 	int c, d;
 
 	walktype(n->left, Erv);