]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] 6g,9g: formatters for Prog and Addr details
authorAustin Clements <austin@google.com>
Fri, 14 Nov 2014 18:58:31 +0000 (13:58 -0500)
committerAustin Clements <austin@google.com>
Fri, 14 Nov 2014 18:58:31 +0000 (13:58 -0500)
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

src/cmd/5l/5.out.h
src/cmd/6l/6.out.h
src/cmd/8l/8.out.h
src/cmd/9l/9.out.h
src/cmd/dist/buildgc.c
src/liblink/list6.c
src/liblink/list9.c

index 7b16ac4468f87e2f9ee414a403626340610d78fe..38a33db6429dd7f3503d7b07fb65ba614bbdc48c 100644 (file)
@@ -338,6 +338,8 @@ enum
        D_STATIC = (D_NONE+4),
        D_AUTO = (D_NONE+5),
        D_PARAM = (D_NONE+6),
+
+       D_LAST = (D_NONE+26),
 };
 
 /*
index af72784e84a13d19447b01ae5ecfe7cbeea33084..c09ac282424d543ca59dcaf91464dc189877e271 100644 (file)
@@ -865,6 +865,8 @@ enum
 
        D_INDIR,        /* additive */
 
+       D_LAST,
+
        T_TYPE          = 1<<0,
        T_INDEX         = 1<<1,
        T_OFFSET        = 1<<2,
index ed54f6744abfa35121b12671dd877d4837214953..596c5f61a8f9a32f15911d4c7b387eefa4d8be7a 100644 (file)
@@ -654,6 +654,8 @@ enum
 
        D_CONST2 = D_INDIR+D_INDIR,
 
+       D_LAST,
+
        T_TYPE          = 1<<0,
        T_INDEX         = 1<<1,
        T_OFFSET        = 1<<2,
index 08a339318de8ce54369b00c93aa4b90fa3fce773..87917f88ac6ac7e6676aa6ba83b892fad5ed0b1b 100644 (file)
@@ -497,6 +497,8 @@ enum
        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
index 39679fb72429e81ad4ddf109d31ac8445cdafb49..64434d51e16852112ee26aa63a503a0b3fa7bdaf 100644 (file)
@@ -184,12 +184,14 @@ mkanames(char *dir, char *file)
                                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;
index 0635fdf1feb55d45c65cabd6f8a639c7e7417225..d6b91c72b0be20b105c5fdbbb9d3bd7e430dd391 100644 (file)
@@ -82,6 +82,19 @@ Pconv(Fmt *fp)
 
        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 @@ Dconv(Fmt *fp)
        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);
index c9190d894020568a950a55305dfe28e41882bff7..2bf86d85bec3dcd57c90f0d31d15c5bbec85d5a9 100644 (file)
@@ -91,6 +91,21 @@ Pconv(Fmt *fp)
        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 @@ Dconv(Fmt *fp)
 
        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));