1 #define EXTERN 2 #include "gc.h" 3 4 void 5 listinit(void) 6 { 7 8 fmtinstall('A', Aconv); 9 fmtinstall('P', Pconv); 10 fmtinstall('S', Sconv); 11 fmtinstall('N', Nconv); 12 fmtinstall('B', Bconv); 13 fmtinstall('D', Dconv); 14 fmtinstall('R', Rconv); 15 } 16 17 int 18 Bconv(Fmt *fp) 19 { 20 char str[STRINGSZ], ss[STRINGSZ], *s; 21 Bits bits; 22 int i; 23 24 str[0] = 0; 25 bits = va_arg(fp->args, Bits); 26 while(bany(&bits)) { 27 i = bnum(bits); 28 if(str[0]) 29 strcat(str, " "); 30 if(var[i].sym == S) { 31 sprint(ss, "$%ld", var[i].offset); 32 s = ss; 33 } else 34 s = var[i].sym->name; 35 if(strlen(str) + strlen(s) + 1 >= STRINGSZ) 36 break; 37 strcat(str, s); 38 bits.b[i/32] &= ~(1L << (i%32)); 39 } 40 return fmtstrcpy(fp, str); 41 } 42 43 int 44 Pconv(Fmt *fp) 45 { 46 char str[STRINGSZ]; 47 Prog *p; 48 int a; 49 50 p = va_arg(fp->args, Prog*); 51 a = p->as; 52 if(a == AMOVM) { 53 if(p->from.type == D_CONST) 54 sprint(str, " %A %R,%D", a, &p->from, &p->to); 55 else 56 if(p->to.type == D_CONST) 57 sprint(str, " %A %D,%R", a, &p->from, &p->to); 58 else 59 sprint(str, " %A %D,%D", a, &p->from, &p->to); 60 } else 61 if(a == ADATA) 62 sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to); 63 else 64 if(p->reg == NREG) 65 sprint(str, " %A %D,%D", a, &p->from, &p->to); 66 else 67 if(p->from.type != D_FREG) 68 sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to); 69 else 70 sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to); 71 return fmtstrcpy(fp, str); 72 } 73 74 int 75 Aconv(Fmt *fp) 76 { 77 char *s; 78 int a; 79 80 a = va_arg(fp->args, int); 81 s = "???"; 82 if(a >= AXXX && a < ALAST) 83 s = anames[a]; 84 return fmtstrcpy(fp, s); 85 } 86 87 int 88 Dconv(Fmt *fp) 89 { 90 char str[STRINGSZ]; 91 Adr *a; 92 93 a = va_arg(fp->args, Adr*); 94 switch(a->type) { 95 96 default: 97 sprint(str, "GOK-type(%d)", a->type); 98 break; 99 100 case D_EXTERN: 101 case D_STATIC: 102 sprint(str, "%N", a); 103 break; 104 105 case D_NONE: 106 str[0] = 0; 107 if(a->name != D_NONE || a->reg != NREG || a->sym != S) 108 sprint(str, "%N(R%d)(NONE)", a, a->reg); 109 break; 110 111 case D_CONST: 112 if(a->reg != NREG) 113 sprint(str, "$%N(R%d)", a, a->reg); 114 else 115 sprint(str, "$%N", a); 116 break; 117 118 case D_OREG: 119 if(a->reg != NREG) 120 sprint(str, "%N(R%d)", a, a->reg); 121 else 122 sprint(str, "%N", a); 123 break; 124 125 case D_REG: 126 sprint(str, "R%d", a->reg); 127 if(a->name != D_NONE || a->sym != S) 128 sprint(str, "%N(R%d)(REG)", a, a->reg); 129 break; 130 131 case D_FREG: 132 sprint(str, "F%d", a->reg); 133 if(a->name != D_NONE || a->sym != S) 134 sprint(str, "%N(R%d)(REG)", a, a->reg); 135 break; 136 137 case D_PSR: 138 sprint(str, "PSR"); 139 if(a->name != D_NONE || a->sym != S) 140 sprint(str, "%N(PSR)(REG)", a); 141 break; 142 143 case D_BRANCH: 144 sprint(str, "%ld(PC)", a->offset-pc); 145 break; 146 147 case D_FCONST: 148 sprint(str, "$%.17e", a->dval); 149 break; 150 151 case D_SCONST: 152 sprint(str, "$\"%S\"", a->sval); 153 break; 154 } 155 return fmtstrcpy(fp, str); 156 } 157 158 int 159 Rconv(Fmt *fp) 160 { 161 char str[STRINGSZ]; 162 Adr *a; 163 int i, v; 164 165 a = va_arg(fp->args, Adr*); 166 sprint(str, "GOK-reglist"); 167 switch(a->type) { 168 case D_CONST: 169 if(a->reg != NREG) 170 break; 171 if(a->sym != S) 172 break; 173 v = a->offset; 174 strcpy(str, ""); 175 for(i=0; i<NREG; i++) { 176 if(v & (1<<i)) { 177 if(str[0] == 0) 178 strcat(str, "[R"); 179 else 180 strcat(str, ",R"); 181 sprint(strchr(str, 0), "%d", i); 182 } 183 } 184 strcat(str, "]"); 185 } 186 return fmtstrcpy(fp, str); 187 } 188 189 int 190 Sconv(Fmt *fp) 191 { 192 int i, c; 193 char str[STRINGSZ], *p, *a; 194 195 a = va_arg(fp->args, char*); 196 p = str; 197 for(i=0; i<NSNAME; i++) { 198 c = a[i] & 0xff; 199 if(c >= 'a' && c <= 'z' || 200 c >= 'A' && c <= 'Z' || 201 c >= '0' && c <= '9' || 202 c == ' ' || c == '%') { 203 *p++ = c; 204 continue; 205 } 206 *p++ = '\\'; 207 switch(c) { 208 case 0: 209 *p++ = 'z'; 210 continue; 211 case '\\': 212 case '"': 213 *p++ = c; 214 continue; 215 case '\n': 216 *p++ = 'n'; 217 continue; 218 case '\t': 219 *p++ = 't'; 220 continue; 221 case '\r': 222 *p++ = 'r'; 223 continue; 224 case '\f': 225 *p++ = 'f'; 226 continue; 227 } 228 *p++ = (c>>6) + '0'; 229 *p++ = ((c>>3) & 7) + '0'; 230 *p++ = (c & 7) + '0'; 231 } 232 *p = 0; 233 return fmtstrcpy(fp, str); 234 } 235 236 int 237 Nconv(Fmt *fp) 238 { 239 char str[STRINGSZ]; 240 Adr *a; 241 Sym *s; 242 243 a = va_arg(fp->args, Adr*); 244 s = a->sym; 245 if(s == S) { 246 sprint(str, "%ld", a->offset); 247 goto out; 248 } 249 switch(a->name) { 250 default: 251 sprint(str, "GOK-name(%d)", a->name); 252 break; 253 254 case D_NONE: 255 sprint(str, "%ld", a->offset); 256 break; 257 258 case D_EXTERN: 259 sprint(str, "%s+%ld(SB)", s->name, a->offset); 260 break; 261 262 case D_STATIC: 263 sprint(str, "%s<>+%ld(SB)", s->name, a->offset); 264 break; 265 266 case D_AUTO: 267 sprint(str, "%s-%ld(SP)", s->name, -a->offset); 268 break; 269 270 case D_PARAM: 271 sprint(str, "%s+%ld(FP)", s->name, a->offset); 272 break; 273 } 274 out: 275 return fmtstrcpy(fp, str); 276 } 277