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('B', Bconv); 12 fmtinstall('D', Dconv); 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 < ALAST) 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(R%d)(REG)", a, a->reg); 95 break; 96 97 case D_FCREG: 98 sprint(str, "FCR%d", a->reg); 99 if(a->name != D_NONE || a->sym != S) 100 sprint(str, "%N(R%d)(REG)", a, a->reg); 101 break; 102 103 case D_LO: 104 sprint(str, "LO", a->reg); 105 if(a->name != D_NONE || a->sym != S) 106 sprint(str, "%N(LO)(REG)", a, a->reg); 107 break; 108 109 case D_HI: 110 sprint(str, "HI", a->reg); 111 if(a->name != D_NONE || a->sym != S) 112 sprint(str, "%N(HI)(REG)", a, a->reg); 113 break; 114 115 case D_BRANCH: 116 sprint(str, "%ld(PC)", a->offset-pc); 117 break; 118 119 case D_FCONST: 120 sprint(str, "$%.17e", a->dval); 121 break; 122 123 case D_SCONST: 124 sprint(str, "$\"%S\"", a->sval); 125 break; 126 } 127 strconv(str, fp); 128 return sizeof(a); 129 } 130 131 int 132 Sconv(void *o, Fconv *fp) 133 { 134 int i, c; 135 char str[STRINGSZ], *p, *a; 136 137 a = *(char**)o; 138 p = str; 139 for(i=0; i<NSNAME; i++) { 140 c = a[i] & 0xff; 141 if(c >= 'a' && c <= 'z' || 142 c >= 'A' && c <= 'Z' || 143 c >= '0' && c <= '9' || 144 c == ' ' || c == '%') { 145 *p++ = c; 146 continue; 147 } 148 *p++ = '\\'; 149 switch(c) { 150 case 0: 151 *p++ = 'z'; 152 continue; 153 case '\\': 154 case '"': 155 *p++ = c; 156 continue; 157 case '\n': 158 *p++ = 'n'; 159 continue; 160 case '\t': 161 *p++ = 't'; 162 continue; 163 case '\r': 164 *p++ = 'r'; 165 continue; 166 case '\f': 167 *p++ = 'f'; 168 continue; 169 } 170 *p++ = (c>>6) + '0'; 171 *p++ = ((c>>3) & 7) + '0'; 172 *p++ = (c & 7) + '0'; 173 } 174 *p = 0; 175 strconv(str, fp); 176 return sizeof(a); 177 } 178 179 int 180 Nconv(void *o, Fconv *fp) 181 { 182 char str[STRINGSZ]; 183 Adr *a; 184 Sym *s; 185 186 a = *(Adr**)o; 187 s = a->sym; 188 if(s == S) { 189 sprint(str, "%ld", a->offset); 190 goto out; 191 } 192 switch(a->name) { 193 default: 194 sprint(str, "GOK-name(%d)", a->name); 195 break; 196 197 case D_NONE: 198 sprint(str, "%ld", a->offset); 199 break; 200 201 case D_EXTERN: 202 sprint(str, "%s+%ld(SB)", s->name, a->offset); 203 break; 204 205 case D_STATIC: 206 sprint(str, "%s<>+%ld(SB)", s->name, a->offset); 207 break; 208 209 case D_AUTO: 210 sprint(str, "%s-%ld(SP)", s->name, -a->offset); 211 break; 212 213 case D_PARAM: 214 sprint(str, "%s+%ld(FP)", s->name, a->offset); 215 break; 216 } 217 out: 218 strconv(str, fp); 219 return sizeof(a); 220 } 221