Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_fixcpp/sys/src/cmd/vc/list.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}