1 #include "gc.h" 2 3 void 4 listinit(void) 5 { 6 7 fmtinstall('A', Aconv); 8 fmtinstall('P', Pconv); 9 fmtinstall('S', Sconv); 10 fmtinstall('N', Nconv); 11 fmtinstall('D', Dconv); 12 fmtinstall('B', Bconv); 13 } 14 15 int 16 Pconv(void *o, Fconv *fp) 17 { 18 char str[STRINGSZ]; 19 Prog *p; 20 int a; 21 22 p = *(Prog**)o; 23 a = p->as; 24 if(a == ADATA) 25 sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to); 26 else 27 if(p->reg == NREG) 28 sprint(str, " %A %D,%D", a, &p->from, &p->to); 29 else 30 if(p->from.type != D_FREG) 31 sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to); 32 else 33 sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to); 34 strconv(str, fp); 35 return sizeof(p); 36 } 37 38 int 39 Aconv(void *o, Fconv *fp) 40 { 41 char *s; 42 int a; 43 44 a = *(int*)o; 45 s = "???"; 46 if(a >= AXXX && a <= AEND) 47 s = anames[a]; 48 strconv(s, fp); 49 return sizeof(a); 50 } 51 52 int 53 Dconv(void *o, Fconv *fp) 54 { 55 char str[STRINGSZ]; 56 Adr *a; 57 58 a = *(Adr**)o; 59 switch(a->type) { 60 61 default: 62 sprint(str, "GOK-type(%d)", a->type); 63 break; 64 65 case D_NONE: 66 str[0] = 0; 67 if(a->name != D_NONE || a->reg != NREG || a->sym != S) 68 sprint(str, "%N(R%d)(NONE)", a, a->reg); 69 break; 70 71 case D_CONST: 72 if(a->reg != NREG) 73 sprint(str, "$%N(R%d)", a, a->reg); 74 else 75 sprint(str, "$%N", a); 76 break; 77 78 case D_OREG: 79 if(a->reg != NREG) 80 sprint(str, "%N(R%d)", a, a->reg); 81 else 82 sprint(str, "%N", a); 83 break; 84 85 case D_REG: 86 sprint(str, "R%d", a->reg); 87 if(a->name != D_NONE || a->sym != S) 88 sprint(str, "%N(R%d)(REG)", a, a->reg); 89 break; 90 91 case D_FREG: 92 sprint(str, "F%d", a->reg); 93 if(a->name != D_NONE || a->sym != S) 94 sprint(str, "%N(F%d)(REG)", a, a->reg); 95 break; 96 97 case D_CREG: 98 sprint(str, "C%d", a->reg); 99 if(a->name != D_NONE || a->sym != S) 100 sprint(str, "%N(C%d)(REG)", a, a->reg); 101 break; 102 103 case D_BRANCH: 104 sprint(str, "%ld(PC)", a->offset-pc); 105 break; 106 107 case D_FCONST: 108 sprint(str, "$%.17e", a->dval); 109 break; 110 111 case D_SCONST: 112 sprint(str, "$\"%S\"", a->sval); 113 break; 114 } 115 strconv(str, fp); 116 return sizeof(a); 117 } 118 119 int 120 Sconv(void *o, Fconv *fp) 121 { 122 int i, c; 123 char str[STRINGSZ], *p, *a; 124 125 a = *(char**)o; 126 p = str; 127 for(i=0; i<NSNAME; i++) { 128 c = a[i] & 0xff; 129 if(c >= 'a' && c <= 'z' || 130 c >= 'A' && c <= 'Z' || 131 c >= '0' && c <= '9' || 132 c == ' ' || c == '%') { 133 *p++ = c; 134 continue; 135 } 136 *p++ = '\\'; 137 switch(c) { 138 case 0: 139 *p++ = 'z'; 140 continue; 141 case '\\': 142 case '"': 143 *p++ = c; 144 continue; 145 case '\n': 146 *p++ = 'n'; 147 continue; 148 case '\t': 149 *p++ = 't'; 150 continue; 151 case '\r': 152 *p++ = 'r'; 153 continue; 154 case '\f': 155 *p++ = 'f'; 156 continue; 157 } 158 *p++ = (c>>6) + '0'; 159 *p++ = ((c>>3) & 7) + '0'; 160 *p++ = (c & 7) + '0'; 161 } 162 *p = 0; 163 strconv(str, fp); 164 return sizeof(a); 165 } 166 167 int 168 Nconv(void *o, Fconv *fp) 169 { 170 char str[STRINGSZ]; 171 Adr *a; 172 Sym *s; 173 174 a = *(Adr**)o; 175 s = a->sym; 176 if(s == S) { 177 sprint(str, "%ld", a->offset); 178 goto out; 179 } 180 switch(a->name) { 181 default: 182 sprint(str, "GOK-name(%d)", a->name); 183 break; 184 185 case D_EXTERN: 186 sprint(str, "%s+%ld(SB)", s->name, a->offset); 187 break; 188 189 case D_STATIC: 190 sprint(str, "%s<>+%ld(SB)", s->name, a->offset); 191 break; 192 193 case D_AUTO: 194 sprint(str, "%s-%ld(SP)", s->name, -a->offset); 195 break; 196 197 case D_PARAM: 198 sprint(str, "%s+%ld(FP)", s->name, a->offset); 199 break; 200 } 201 out: 202 strconv(str, fp); 203 return sizeof(a); 204 } 205