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