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->as == ATEXT) 54 sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to); 55 else 56 if(p->reg == NREG) 57 sprint(str, " %A %D,%D", a, &p->from, &p->to); 58 else 59 if(p->from.type != D_FREG) 60 sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to); 61 else 62 sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to); 63 return fmtstrcpy(fp, str); 64 } 65 66 int 67 Aconv(Fmt *fp) 68 { 69 char *s; 70 int a; 71 72 a = va_arg(fp->args, int); 73 s = "?"; 74 if(a >= AXXX && a < ALAST) 75 s = anames[a]; 76 return fmtstrcpy(fp, s); 77 } 78 79 int 80 Dconv(Fmt *fp) 81 { 82 char str[STRINGSZ]; 83 Adr *a; 84 85 a = va_arg(fp->args, 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 return fmtstrcpy(fp, str); 155 } 156 157 int 158 Sconv(Fmt *fp) 159 { 160 int i, c; 161 char str[STRINGSZ], *p, *a; 162 163 a = va_arg(fp->args, char*); 164 p = str; 165 for(i=0; i<NSNAME; i++) { 166 c = a[i] & 0xff; 167 if(c >= 'a' && c <= 'z' || 168 c >= 'A' && c <= 'Z' || 169 c >= '0' && c <= '9' || 170 c == ' ' || c == '%') { 171 *p++ = c; 172 continue; 173 } 174 *p++ = '\\'; 175 switch(c) { 176 case 0: 177 *p++ = 'z'; 178 continue; 179 case '\\': 180 case '"': 181 *p++ = c; 182 continue; 183 case '\n': 184 *p++ = 'n'; 185 continue; 186 case '\t': 187 *p++ = 't'; 188 continue; 189 case '\r': 190 *p++ = 'r'; 191 continue; 192 case '\f': 193 *p++ = 'f'; 194 continue; 195 } 196 *p++ = (c>>6) + '0'; 197 *p++ = ((c>>3) & 7) + '0'; 198 *p++ = (c & 7) + '0'; 199 } 200 *p = 0; 201 return fmtstrcpy(fp, str); 202 } 203 204 int 205 Nconv(Fmt *fp) 206 { 207 char str[STRINGSZ]; 208 Adr *a; 209 Sym *s; 210 211 a = va_arg(fp->args, Adr*); 212 s = a->sym; 213 if(s == S) { 214 sprint(str, "%ld", a->offset); 215 goto out; 216 } 217 switch(a->name) { 218 default: 219 sprint(str, "GOK-name(%d)", a->name); 220 break; 221 222 case D_NONE: 223 sprint(str, "%ld", a->offset); 224 break; 225 226 case D_EXTERN: 227 sprint(str, "%s+%ld(SB)", s->name, a->offset); 228 break; 229 230 case D_STATIC: 231 sprint(str, "%s<>+%ld(SB)", s->name, a->offset); 232 break; 233 234 case D_AUTO: 235 sprint(str, "%s-%ld(SP)", s->name, -a->offset); 236 break; 237 238 case D_PARAM: 239 sprint(str, "%s+%ld(FP)", s->name, a->offset); 240 break; 241 } 242 out: 243 return fmtstrcpy(fp, str); 244 } 245