174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "gc.h"
374a4d8c2SCharles.Forsyth
474a4d8c2SCharles.Forsyth void
listinit(void)574a4d8c2SCharles.Forsyth listinit(void)
674a4d8c2SCharles.Forsyth {
774a4d8c2SCharles.Forsyth fmtinstall('A', Aconv);
874a4d8c2SCharles.Forsyth fmtinstall('P', Pconv);
974a4d8c2SCharles.Forsyth fmtinstall('S', Sconv);
1074a4d8c2SCharles.Forsyth fmtinstall('N', Nconv);
1174a4d8c2SCharles.Forsyth fmtinstall('B', Bconv);
1274a4d8c2SCharles.Forsyth fmtinstall('D', Dconv);
1374a4d8c2SCharles.Forsyth }
1474a4d8c2SCharles.Forsyth
1574a4d8c2SCharles.Forsyth int
Bconv(Fmt * fp)1674a4d8c2SCharles.Forsyth Bconv(Fmt *fp)
1774a4d8c2SCharles.Forsyth {
1874a4d8c2SCharles.Forsyth char str[STRINGSZ], ss[STRINGSZ], *s;
1974a4d8c2SCharles.Forsyth Bits bits;
2074a4d8c2SCharles.Forsyth int i;
2174a4d8c2SCharles.Forsyth
2274a4d8c2SCharles.Forsyth str[0] = 0;
2374a4d8c2SCharles.Forsyth bits = va_arg(fp->args, Bits);
2474a4d8c2SCharles.Forsyth while(bany(&bits)) {
2574a4d8c2SCharles.Forsyth i = bnum(bits);
2674a4d8c2SCharles.Forsyth if(str[0])
2774a4d8c2SCharles.Forsyth strcat(str, " ");
2874a4d8c2SCharles.Forsyth if(var[i].sym == S) {
2974a4d8c2SCharles.Forsyth sprint(ss, "$%ld", var[i].offset);
3074a4d8c2SCharles.Forsyth s = ss;
3174a4d8c2SCharles.Forsyth } else
3274a4d8c2SCharles.Forsyth s = var[i].sym->name;
3374a4d8c2SCharles.Forsyth if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
3474a4d8c2SCharles.Forsyth break;
3574a4d8c2SCharles.Forsyth strcat(str, s);
3674a4d8c2SCharles.Forsyth bits.b[i/32] &= ~(1L << (i%32));
3774a4d8c2SCharles.Forsyth }
3874a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
3974a4d8c2SCharles.Forsyth }
4074a4d8c2SCharles.Forsyth
4174a4d8c2SCharles.Forsyth int
Pconv(Fmt * fp)4274a4d8c2SCharles.Forsyth Pconv(Fmt *fp)
4374a4d8c2SCharles.Forsyth {
4474a4d8c2SCharles.Forsyth char str[STRINGSZ];
4574a4d8c2SCharles.Forsyth Prog *p;
4674a4d8c2SCharles.Forsyth int a;
4774a4d8c2SCharles.Forsyth
4874a4d8c2SCharles.Forsyth p = va_arg(fp->args, Prog*);
4974a4d8c2SCharles.Forsyth a = p->as;
5074a4d8c2SCharles.Forsyth if(a == ADATA)
5174a4d8c2SCharles.Forsyth sprint(str, " %A %D/%d,%D", a, &p->from, p->reg, &p->to);
5274a4d8c2SCharles.Forsyth else
5374a4d8c2SCharles.Forsyth if(p->as == ATEXT)
5474a4d8c2SCharles.Forsyth sprint(str, " %A %D,%d,%D", a, &p->from, p->reg, &p->to);
5574a4d8c2SCharles.Forsyth else
5674a4d8c2SCharles.Forsyth if(p->reg == NREG)
5774a4d8c2SCharles.Forsyth sprint(str, " %A %D,%D", a, &p->from, &p->to);
5874a4d8c2SCharles.Forsyth else
5974a4d8c2SCharles.Forsyth if(p->from.type != D_FREG)
6074a4d8c2SCharles.Forsyth sprint(str, " %A %D,R%d,%D", a, &p->from, p->reg, &p->to);
6174a4d8c2SCharles.Forsyth else
6274a4d8c2SCharles.Forsyth sprint(str, " %A %D,F%d,%D", a, &p->from, p->reg, &p->to);
6374a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
6474a4d8c2SCharles.Forsyth }
6574a4d8c2SCharles.Forsyth
6674a4d8c2SCharles.Forsyth int
Aconv(Fmt * fp)6774a4d8c2SCharles.Forsyth Aconv(Fmt *fp)
6874a4d8c2SCharles.Forsyth {
6974a4d8c2SCharles.Forsyth char *s;
7074a4d8c2SCharles.Forsyth int a;
7174a4d8c2SCharles.Forsyth
7274a4d8c2SCharles.Forsyth a = va_arg(fp->args, int);
73*45a20ab7Sforsyth s = "?";
7474a4d8c2SCharles.Forsyth if(a >= AXXX && a < ALAST)
7574a4d8c2SCharles.Forsyth s = anames[a];
7674a4d8c2SCharles.Forsyth return fmtstrcpy(fp, s);
7774a4d8c2SCharles.Forsyth }
7874a4d8c2SCharles.Forsyth
7974a4d8c2SCharles.Forsyth int
Dconv(Fmt * fp)8074a4d8c2SCharles.Forsyth Dconv(Fmt *fp)
8174a4d8c2SCharles.Forsyth {
8274a4d8c2SCharles.Forsyth char str[STRINGSZ];
8374a4d8c2SCharles.Forsyth Adr *a;
8474a4d8c2SCharles.Forsyth
8574a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
8674a4d8c2SCharles.Forsyth switch(a->type) {
8774a4d8c2SCharles.Forsyth
8874a4d8c2SCharles.Forsyth default:
8974a4d8c2SCharles.Forsyth sprint(str, "GOK-type(%d)", a->type);
9074a4d8c2SCharles.Forsyth break;
9174a4d8c2SCharles.Forsyth
9274a4d8c2SCharles.Forsyth case D_NONE:
9374a4d8c2SCharles.Forsyth str[0] = 0;
9474a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->reg != NREG || a->sym != S)
9574a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(NONE)", a, a->reg);
9674a4d8c2SCharles.Forsyth break;
9774a4d8c2SCharles.Forsyth
9874a4d8c2SCharles.Forsyth case D_CONST:
9974a4d8c2SCharles.Forsyth if(a->reg != NREG)
10074a4d8c2SCharles.Forsyth sprint(str, "$%N(R%d)", a, a->reg);
10174a4d8c2SCharles.Forsyth else
10274a4d8c2SCharles.Forsyth sprint(str, "$%N", a);
10374a4d8c2SCharles.Forsyth break;
10474a4d8c2SCharles.Forsyth
10574a4d8c2SCharles.Forsyth case D_OREG:
10674a4d8c2SCharles.Forsyth if(a->reg != NREG)
10774a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)", a, a->reg);
10874a4d8c2SCharles.Forsyth else
10974a4d8c2SCharles.Forsyth sprint(str, "%N", a);
11074a4d8c2SCharles.Forsyth break;
11174a4d8c2SCharles.Forsyth
11274a4d8c2SCharles.Forsyth case D_REG:
11374a4d8c2SCharles.Forsyth sprint(str, "R%d", a->reg);
11474a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
11574a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(REG)", a, a->reg);
11674a4d8c2SCharles.Forsyth break;
11774a4d8c2SCharles.Forsyth
11874a4d8c2SCharles.Forsyth case D_FREG:
11974a4d8c2SCharles.Forsyth sprint(str, "F%d", a->reg);
12074a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
12174a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(REG)", a, a->reg);
12274a4d8c2SCharles.Forsyth break;
12374a4d8c2SCharles.Forsyth
12474a4d8c2SCharles.Forsyth case D_FCREG:
12574a4d8c2SCharles.Forsyth sprint(str, "FCR%d", a->reg);
12674a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
12774a4d8c2SCharles.Forsyth sprint(str, "%N(R%d)(REG)", a, a->reg);
12874a4d8c2SCharles.Forsyth break;
12974a4d8c2SCharles.Forsyth
13074a4d8c2SCharles.Forsyth case D_LO:
13174a4d8c2SCharles.Forsyth sprint(str, "LO");
13274a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
13374a4d8c2SCharles.Forsyth sprint(str, "%N(LO)(REG)", a);
13474a4d8c2SCharles.Forsyth break;
13574a4d8c2SCharles.Forsyth
13674a4d8c2SCharles.Forsyth case D_HI:
13774a4d8c2SCharles.Forsyth sprint(str, "HI");
13874a4d8c2SCharles.Forsyth if(a->name != D_NONE || a->sym != S)
13974a4d8c2SCharles.Forsyth sprint(str, "%N(HI)(REG)", a);
14074a4d8c2SCharles.Forsyth break;
14174a4d8c2SCharles.Forsyth
14274a4d8c2SCharles.Forsyth case D_BRANCH:
14374a4d8c2SCharles.Forsyth sprint(str, "%ld(PC)", a->offset-pc);
14474a4d8c2SCharles.Forsyth break;
14574a4d8c2SCharles.Forsyth
14674a4d8c2SCharles.Forsyth case D_FCONST:
14774a4d8c2SCharles.Forsyth sprint(str, "$%.17e", a->dval);
14874a4d8c2SCharles.Forsyth break;
14974a4d8c2SCharles.Forsyth
15074a4d8c2SCharles.Forsyth case D_SCONST:
15174a4d8c2SCharles.Forsyth sprint(str, "$\"%S\"", a->sval);
15274a4d8c2SCharles.Forsyth break;
15374a4d8c2SCharles.Forsyth }
15474a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
15574a4d8c2SCharles.Forsyth }
15674a4d8c2SCharles.Forsyth
15774a4d8c2SCharles.Forsyth int
Sconv(Fmt * fp)15874a4d8c2SCharles.Forsyth Sconv(Fmt *fp)
15974a4d8c2SCharles.Forsyth {
16074a4d8c2SCharles.Forsyth int i, c;
16174a4d8c2SCharles.Forsyth char str[STRINGSZ], *p, *a;
16274a4d8c2SCharles.Forsyth
16374a4d8c2SCharles.Forsyth a = va_arg(fp->args, char*);
16474a4d8c2SCharles.Forsyth p = str;
16574a4d8c2SCharles.Forsyth for(i=0; i<NSNAME; i++) {
16674a4d8c2SCharles.Forsyth c = a[i] & 0xff;
16774a4d8c2SCharles.Forsyth if(c >= 'a' && c <= 'z' ||
16874a4d8c2SCharles.Forsyth c >= 'A' && c <= 'Z' ||
16974a4d8c2SCharles.Forsyth c >= '0' && c <= '9' ||
17074a4d8c2SCharles.Forsyth c == ' ' || c == '%') {
17174a4d8c2SCharles.Forsyth *p++ = c;
17274a4d8c2SCharles.Forsyth continue;
17374a4d8c2SCharles.Forsyth }
17474a4d8c2SCharles.Forsyth *p++ = '\\';
17574a4d8c2SCharles.Forsyth switch(c) {
17674a4d8c2SCharles.Forsyth case 0:
17774a4d8c2SCharles.Forsyth *p++ = 'z';
17874a4d8c2SCharles.Forsyth continue;
17974a4d8c2SCharles.Forsyth case '\\':
18074a4d8c2SCharles.Forsyth case '"':
18174a4d8c2SCharles.Forsyth *p++ = c;
18274a4d8c2SCharles.Forsyth continue;
18374a4d8c2SCharles.Forsyth case '\n':
18474a4d8c2SCharles.Forsyth *p++ = 'n';
18574a4d8c2SCharles.Forsyth continue;
18674a4d8c2SCharles.Forsyth case '\t':
18774a4d8c2SCharles.Forsyth *p++ = 't';
18874a4d8c2SCharles.Forsyth continue;
18974a4d8c2SCharles.Forsyth case '\r':
19074a4d8c2SCharles.Forsyth *p++ = 'r';
19174a4d8c2SCharles.Forsyth continue;
19274a4d8c2SCharles.Forsyth case '\f':
19374a4d8c2SCharles.Forsyth *p++ = 'f';
19474a4d8c2SCharles.Forsyth continue;
19574a4d8c2SCharles.Forsyth }
19674a4d8c2SCharles.Forsyth *p++ = (c>>6) + '0';
19774a4d8c2SCharles.Forsyth *p++ = ((c>>3) & 7) + '0';
19874a4d8c2SCharles.Forsyth *p++ = (c & 7) + '0';
19974a4d8c2SCharles.Forsyth }
20074a4d8c2SCharles.Forsyth *p = 0;
20174a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
20274a4d8c2SCharles.Forsyth }
20374a4d8c2SCharles.Forsyth
20474a4d8c2SCharles.Forsyth int
Nconv(Fmt * fp)20574a4d8c2SCharles.Forsyth Nconv(Fmt *fp)
20674a4d8c2SCharles.Forsyth {
20774a4d8c2SCharles.Forsyth char str[STRINGSZ];
20874a4d8c2SCharles.Forsyth Adr *a;
20974a4d8c2SCharles.Forsyth Sym *s;
21074a4d8c2SCharles.Forsyth
21174a4d8c2SCharles.Forsyth a = va_arg(fp->args, Adr*);
21274a4d8c2SCharles.Forsyth s = a->sym;
21374a4d8c2SCharles.Forsyth if(s == S) {
21474a4d8c2SCharles.Forsyth sprint(str, "%ld", a->offset);
21574a4d8c2SCharles.Forsyth goto out;
21674a4d8c2SCharles.Forsyth }
21774a4d8c2SCharles.Forsyth switch(a->name) {
21874a4d8c2SCharles.Forsyth default:
21974a4d8c2SCharles.Forsyth sprint(str, "GOK-name(%d)", a->name);
22074a4d8c2SCharles.Forsyth break;
22174a4d8c2SCharles.Forsyth
22274a4d8c2SCharles.Forsyth case D_NONE:
22374a4d8c2SCharles.Forsyth sprint(str, "%ld", a->offset);
22474a4d8c2SCharles.Forsyth break;
22574a4d8c2SCharles.Forsyth
22674a4d8c2SCharles.Forsyth case D_EXTERN:
22774a4d8c2SCharles.Forsyth sprint(str, "%s+%ld(SB)", s->name, a->offset);
22874a4d8c2SCharles.Forsyth break;
22974a4d8c2SCharles.Forsyth
23074a4d8c2SCharles.Forsyth case D_STATIC:
23174a4d8c2SCharles.Forsyth sprint(str, "%s<>+%ld(SB)", s->name, a->offset);
23274a4d8c2SCharles.Forsyth break;
23374a4d8c2SCharles.Forsyth
23474a4d8c2SCharles.Forsyth case D_AUTO:
23574a4d8c2SCharles.Forsyth sprint(str, "%s-%ld(SP)", s->name, -a->offset);
23674a4d8c2SCharles.Forsyth break;
23774a4d8c2SCharles.Forsyth
23874a4d8c2SCharles.Forsyth case D_PARAM:
23974a4d8c2SCharles.Forsyth sprint(str, "%s+%ld(FP)", s->name, a->offset);
24074a4d8c2SCharles.Forsyth break;
24174a4d8c2SCharles.Forsyth }
24274a4d8c2SCharles.Forsyth out:
24374a4d8c2SCharles.Forsyth return fmtstrcpy(fp, str);
24474a4d8c2SCharles.Forsyth }
245