[dev.power64] 6g,9g: formatters for Prog and Addr details

The pretty printers for these make it hard to understand
what's actually in the fields of these structures.  These
"ugly printers" show exactly what's in each field, which can
be useful for understanding and debugging code.

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/175780043
diff --git a/src/cmd/5l/5.out.h b/src/cmd/5l/5.out.h
index 7b16ac4..38a33db 100644
--- a/src/cmd/5l/5.out.h
+++ b/src/cmd/5l/5.out.h
@@ -338,6 +338,8 @@
 	D_STATIC = (D_NONE+4),
 	D_AUTO = (D_NONE+5),
 	D_PARAM = (D_NONE+6),
+
+	D_LAST = (D_NONE+26),
 };
 
 /*
diff --git a/src/cmd/6l/6.out.h b/src/cmd/6l/6.out.h
index af72784..c09ac28 100644
--- a/src/cmd/6l/6.out.h
+++ b/src/cmd/6l/6.out.h
@@ -865,6 +865,8 @@
 
 	D_INDIR,	/* additive */
 
+	D_LAST,
+
 	T_TYPE		= 1<<0,
 	T_INDEX		= 1<<1,
 	T_OFFSET	= 1<<2,
diff --git a/src/cmd/8l/8.out.h b/src/cmd/8l/8.out.h
index ed54f67..596c5f6 100644
--- a/src/cmd/8l/8.out.h
+++ b/src/cmd/8l/8.out.h
@@ -654,6 +654,8 @@
 
 	D_CONST2 = D_INDIR+D_INDIR,
 
+	D_LAST,
+
 	T_TYPE		= 1<<0,
 	T_INDEX		= 1<<1,
 	T_OFFSET	= 1<<2,
diff --git a/src/cmd/9l/9.out.h b/src/cmd/9l/9.out.h
index 08a3393..87917f8 100644
--- a/src/cmd/9l/9.out.h
+++ b/src/cmd/9l/9.out.h
@@ -497,6 +497,8 @@
 	D_DCONST,
 	D_ADDR, // not used, use D_CONST with non-empty sym.
 
+	D_LAST,
+
 /* reg names for 9g OREGISTER */
 	D_R0 = 0, // type is D_REG
 	D_F0 = D_R0+NREG, // type is D_FREG
diff --git a/src/cmd/dist/buildgc.c b/src/cmd/dist/buildgc.c
index 39679fb..64434d5 100644
--- a/src/cmd/dist/buildgc.c
+++ b/src/cmd/dist/buildgc.c
@@ -184,12 +184,14 @@
 				continue;
 
 			p = lines.p[i] + 3;
+			if(xstrcmp(p, "LAST") == 0)
+				continue;
 			vadd(&dnames[n], p);
 			j++;
 		}
 	}
 	if(j>0){
-		bwritestr(&out, bprintf(&b, "char*	dnames%c[] = {\n", ch));
+		bwritestr(&out, bprintf(&b, "char*	dnames%c[D_LAST] = {\n", ch));
 		for(i=0; i<nelem(dnames); i++) {
 			if(dnames[i].len == 0)
 				continue;
diff --git a/src/liblink/list6.c b/src/liblink/list6.c
index 0635fdf..d6b91c72 100644
--- a/src/liblink/list6.c
+++ b/src/liblink/list6.c
@@ -82,6 +82,19 @@
 
 	p = va_arg(fp->args, Prog*);
 	bigP = p;
+
+	if(fp->flags & FmtSharp) {
+		char *s = str;
+		s += sprint(s, "%.5lld (%L) %A", p->pc, p->lineno, p->as);
+		if(p->from.type != D_NONE)
+			s += sprint(s, " from={%#D}", &p->from);
+		if(p->reg)
+			s += sprint(s, " reg=%d", p->reg);
+		if(p->to.type != D_NONE)
+			s += sprint(s, " to={%#D}", &p->to);
+		return fmtstrcpy(fp, str);
+	}
+
 	switch(p->as) {
 	case ADATA:
 		sprint(str, "%.5lld (%L)	%A	%D/%d,%D",
@@ -126,6 +139,31 @@
 	a = va_arg(fp->args, Addr*);
 	i = a->type;
 
+	if(fp->flags & FmtSharp) {
+		char *s = str;
+		s += sprint(s, "type=");
+		if(i == D_NONE) {
+			sprint(s, "NONE");
+			goto brk;
+		}
+		if(i >= D_INDIR) {
+			i -= D_INDIR;
+			s += sprint(s, "INDIR+");
+		}
+		if(i >= 0 && i < D_LAST && dnames6[i] != nil)
+			s += sprint(s, "%s ", dnames6[i]);
+		else
+			s += sprint(s, "%d ", i);
+		s += sprint(s, "offset=%ld etype=%E width=%d", a->offset, a->etype, a->width);
+		if(a->class != 0)
+			s += sprint(s, " class=%s", cnames9[a->class]);
+		if(a->sym != nil)
+			s += sprint(s, " sym=%s", a->sym->name);
+		if(a->type == D_BRANCH && a->u.branch != nil)
+			s += sprint(s, " branch=%.5lld", a->u.branch->pc);
+		goto brk;
+	}
+
 	if(fp->flags & FmtLong) {
 		if(i == D_CONST)
 			sprint(str, "$%lld-%lld", a->offset&0xffffffffLL, a->offset>>32);
diff --git a/src/liblink/list9.c b/src/liblink/list9.c
index c9190d8..2bf86d8 100644
--- a/src/liblink/list9.c
+++ b/src/liblink/list9.c
@@ -91,6 +91,21 @@
 	p = va_arg(fp->args, Prog*);
 	bigP = p;
 	a = p->as;
+
+	if(fp->flags & FmtSharp) {
+		s = str;
+		s += sprint(s, "%.5lld (%L) %A", p->pc, p->lineno, a);
+		if(p->from.type != D_NONE)
+			s += sprint(s, " from={%#D}", &p->from);
+		if(p->reg)
+			s += sprint(s, " reg=%d", p->reg);
+		if(p->from3.type != D_NONE)
+			s += sprint(s, " from3={%#D}", &p->from3);
+		if(p->to.type != D_NONE)
+			s += sprint(s, " to={%#D}", &p->to);
+		return fmtstrcpy(fp, str);
+	}
+
 	if(a == ADATA || a == AINIT || a == ADYNT)
 		sprint(str, "%.5lld (%L)	%A	%D/%d,%D", p->pc, p->lineno, a, &p->from, p->reg, &p->to);
 	else if(a == ATEXT) {
@@ -153,6 +168,32 @@
 
 	a = va_arg(fp->args, Addr*);
 
+	if(fp->flags & FmtSharp) {
+		char *s = str;
+		if(a->type == D_NONE) {
+			sprint(s, "type=NONE");
+			goto ret;
+		}
+		if(a->type >= 0 && a->type < D_LAST && dnames9[a->type] != nil)
+			s += sprint(s, "type=%s ", dnames9[a->type]);
+		else
+			s += sprint(s, "type=%d ", a->type);
+		if(a->name >= 0 && a->name < D_LAST && dnames9[a->name] != nil)
+			s += sprint(s, "name=%s ", dnames9[a->name]);
+		else
+			s += sprint(s, "name=%d ", a->name);
+		s += sprint(s, "offset=%ld etype=%E width=%d", a->offset, a->etype, a->width);
+		if(a->class != 0)
+			s += sprint(s, " class=%s", cnames9[a->class]);
+		if(a->reg != NREG)
+			s += sprint(s, " reg=%d", a->reg);
+		if(a->sym != nil)
+			s += sprint(s, " sym=%s", a->sym->name);
+		if(a->type == D_BRANCH && a->u.branch != nil)
+			s += sprint(s, " branch=%.5lld", a->u.branch->pc);
+		goto ret;
+	}
+
 	if(fp->flags & FmtLong) {
 		if(a->type == D_CONST)
 			sprint(str, "$%d-%d", (int32)a->offset, (int32)(a->offset>>32));