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