xref: /plan9/sys/src/cmd/vc/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('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