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