xref: /plan9-contrib/sys/src/cmd/spin/vars.c (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: vars.c *****/
2219b2ee8SDavid du Colombier 
3*de2caf28SDavid du Colombier /*
4*de2caf28SDavid du Colombier  * This file is part of the public release of Spin. It is subject to the
5*de2caf28SDavid du Colombier  * terms in the LICENSE file that is included in this source directory.
6*de2caf28SDavid du Colombier  * Tool documentation is available at http://spinroot.com
7*de2caf28SDavid du Colombier  */
8219b2ee8SDavid du Colombier 
9219b2ee8SDavid du Colombier #include "spin.h"
10219b2ee8SDavid du Colombier #include "y.tab.h"
11219b2ee8SDavid du Colombier 
12*de2caf28SDavid du Colombier extern char	GBuf[];
13*de2caf28SDavid du Colombier extern int	analyze, jumpsteps, nproc, nstop, columns, old_priority_rules;
14*de2caf28SDavid du Colombier extern int	lineno, depth, verbose, xspin, limited_vis, Pid_nr;
15*de2caf28SDavid du Colombier extern Lextok	*Xu_List;
167dd7cddfSDavid du Colombier extern Ordered	*all_names;
17*de2caf28SDavid du Colombier extern RunList	*X_lst, *LastX;
18*de2caf28SDavid du Colombier extern short	no_arrays, Have_claim, terse;
19219b2ee8SDavid du Colombier extern Symbol	*Fname;
20*de2caf28SDavid du Colombier 
21*de2caf28SDavid du Colombier extern void	sr_buf(int, int, const char *);
22*de2caf28SDavid du Colombier extern void	sr_mesg(FILE *, int, int, const char *);
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier static int	getglobal(Lextok *);
257dd7cddfSDavid du Colombier static int	setglobal(Lextok *, int);
267dd7cddfSDavid du Colombier static int	maxcolnr = 1;
27219b2ee8SDavid du Colombier 
28219b2ee8SDavid du Colombier int
getval(Lextok * sn)29219b2ee8SDavid du Colombier getval(Lextok *sn)
30219b2ee8SDavid du Colombier {	Symbol *s = sn->sym;
31219b2ee8SDavid du Colombier 
327dd7cddfSDavid du Colombier 	if (strcmp(s->name, "_") == 0)
337dd7cddfSDavid du Colombier 	{	non_fatal("attempt to read value of '_'", 0);
347dd7cddfSDavid du Colombier 		return 0;
357dd7cddfSDavid du Colombier 	}
36219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_last") == 0)
37219b2ee8SDavid du Colombier 		return (LastX)?LastX->pid:0;
38219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_p") == 0)
39*de2caf28SDavid du Colombier 		return (X_lst && X_lst->pc)?X_lst->pc->seqno:0;
40219b2ee8SDavid du Colombier 	if (strcmp(s->name, "_pid") == 0)
41*de2caf28SDavid du Colombier 	{	if (!X_lst) return 0;
42*de2caf28SDavid du Colombier 		return X_lst->pid - Have_claim;
43219b2ee8SDavid du Colombier 	}
44*de2caf28SDavid du Colombier 	if (strcmp(s->name, "_priority") == 0)
45*de2caf28SDavid du Colombier 	{	if (!X_lst) return 0;
46*de2caf28SDavid du Colombier 
47*de2caf28SDavid du Colombier 		if (old_priority_rules)
48*de2caf28SDavid du Colombier 		{	non_fatal("cannot refer to _priority with -o6", (char *) 0);
49*de2caf28SDavid du Colombier 			return 1;
50*de2caf28SDavid du Colombier 		}
51*de2caf28SDavid du Colombier 		return X_lst->priority;
52*de2caf28SDavid du Colombier 	}
53*de2caf28SDavid du Colombier 
547dd7cddfSDavid du Colombier 	if (strcmp(s->name, "_nr_pr") == 0)
55*de2caf28SDavid du Colombier 	{	return nproc-nstop;	/* new 3.3.10 */
56*de2caf28SDavid du Colombier 	}
577dd7cddfSDavid du Colombier 
58219b2ee8SDavid du Colombier 	if (s->context && s->type)
59*de2caf28SDavid du Colombier 	{	return getlocal(sn);
60*de2caf28SDavid du Colombier 	}
61219b2ee8SDavid du Colombier 
62219b2ee8SDavid du Colombier 	if (!s->type)	/* not declared locally */
63219b2ee8SDavid du Colombier 	{	s = lookup(s->name); /* try global */
64219b2ee8SDavid du Colombier 		sn->sym = s;	/* fix it */
65219b2ee8SDavid du Colombier 	}
66*de2caf28SDavid du Colombier 
67219b2ee8SDavid du Colombier 	return getglobal(sn);
68219b2ee8SDavid du Colombier }
69219b2ee8SDavid du Colombier 
70219b2ee8SDavid du Colombier int
setval(Lextok * v,int n)71219b2ee8SDavid du Colombier setval(Lextok *v, int n)
72219b2ee8SDavid du Colombier {
73*de2caf28SDavid du Colombier 	if (strcmp(v->sym->name, "_last") == 0
74*de2caf28SDavid du Colombier 	||  strcmp(v->sym->name, "_p") == 0
75*de2caf28SDavid du Colombier 	||  strcmp(v->sym->name, "_pid") == 0
76*de2caf28SDavid du Colombier 	||  strcmp(v->sym->name, "_nr_qs") == 0
77*de2caf28SDavid du Colombier 	||  strcmp(v->sym->name, "_nr_pr") == 0)
78*de2caf28SDavid du Colombier 	{	non_fatal("illegal assignment to %s", v->sym->name);
79*de2caf28SDavid du Colombier 	}
80*de2caf28SDavid du Colombier 	if (strcmp(v->sym->name, "_priority") == 0)
81*de2caf28SDavid du Colombier 	{	if (old_priority_rules)
82*de2caf28SDavid du Colombier 		{	non_fatal("cannot refer to _priority with -o6", (char *) 0);
83*de2caf28SDavid du Colombier 			return 1;
84*de2caf28SDavid du Colombier 		}
85*de2caf28SDavid du Colombier 		if (!X_lst)
86*de2caf28SDavid du Colombier 		{	non_fatal("no context for _priority", (char *) 0);
87*de2caf28SDavid du Colombier 			return 1;
88*de2caf28SDavid du Colombier 		}
89*de2caf28SDavid du Colombier 		X_lst->priority = n;
90*de2caf28SDavid du Colombier 	}
91*de2caf28SDavid du Colombier 
92219b2ee8SDavid du Colombier 	if (v->sym->context && v->sym->type)
93219b2ee8SDavid du Colombier 		return setlocal(v, n);
94219b2ee8SDavid du Colombier 	if (!v->sym->type)
95219b2ee8SDavid du Colombier 		v->sym = lookup(v->sym->name);
96219b2ee8SDavid du Colombier 	return setglobal(v, n);
97219b2ee8SDavid du Colombier }
98219b2ee8SDavid du Colombier 
997dd7cddfSDavid du Colombier void
rm_selfrefs(Symbol * s,Lextok * i)1007dd7cddfSDavid du Colombier rm_selfrefs(Symbol *s, Lextok *i)
1017dd7cddfSDavid du Colombier {
1027dd7cddfSDavid du Colombier 	if (!i) return;
1037dd7cddfSDavid du Colombier 
1047dd7cddfSDavid du Colombier 	if (i->ntyp == NAME
1057dd7cddfSDavid du Colombier 	&&  strcmp(i->sym->name, s->name) == 0
1067dd7cddfSDavid du Colombier 	&& (	(!i->sym->context && !s->context)
1077dd7cddfSDavid du Colombier 	   ||	( i->sym->context &&  s->context
1087dd7cddfSDavid du Colombier 		&& strcmp(i->sym->context->name, s->context->name) == 0)))
1097dd7cddfSDavid du Colombier 	{	lineno  = i->ln;
1107dd7cddfSDavid du Colombier 		Fname   = i->fn;
1117dd7cddfSDavid du Colombier 		non_fatal("self-reference initializing '%s'", s->name);
1127dd7cddfSDavid du Colombier 		i->ntyp = CONST;
1137dd7cddfSDavid du Colombier 		i->val  = 0;
1147dd7cddfSDavid du Colombier 	} else
1157dd7cddfSDavid du Colombier 	{	rm_selfrefs(s, i->lft);
1167dd7cddfSDavid du Colombier 		rm_selfrefs(s, i->rgt);
1177dd7cddfSDavid du Colombier 	}
1187dd7cddfSDavid du Colombier }
1197dd7cddfSDavid du Colombier 
120219b2ee8SDavid du Colombier int
checkvar(Symbol * s,int n)121219b2ee8SDavid du Colombier checkvar(Symbol *s, int n)
1227dd7cddfSDavid du Colombier {	int	i, oln = lineno;	/* calls on eval() change it */
1237dd7cddfSDavid du Colombier 	Symbol	*ofnm = Fname;
124*de2caf28SDavid du Colombier 	Lextok  *z, *y;
125219b2ee8SDavid du Colombier 
126312a1df1SDavid du Colombier 	if (!in_bound(s, n))
127219b2ee8SDavid du Colombier 		return 0;
128312a1df1SDavid du Colombier 
129219b2ee8SDavid du Colombier 	if (s->type == 0)
1307dd7cddfSDavid du Colombier 	{	non_fatal("undecl var %s (assuming int)", s->name);
131219b2ee8SDavid du Colombier 		s->type = INT;
132219b2ee8SDavid du Colombier 	}
1337dd7cddfSDavid du Colombier 	/* not a STRUCT */
134219b2ee8SDavid du Colombier 	if (s->val == (int *) 0)	/* uninitialized */
135219b2ee8SDavid du Colombier 	{	s->val = (int *) emalloc(s->nel*sizeof(int));
136*de2caf28SDavid du Colombier 		z = s->ini;
137219b2ee8SDavid du Colombier 		for (i = 0; i < s->nel; i++)
138*de2caf28SDavid du Colombier 		{	if (z && z->ntyp == ',')
139*de2caf28SDavid du Colombier 			{	y = z->lft;
140*de2caf28SDavid du Colombier 				z = z->rgt;
141*de2caf28SDavid du Colombier 			} else
142*de2caf28SDavid du Colombier 			{	y = z;
143*de2caf28SDavid du Colombier 			}
144*de2caf28SDavid du Colombier 			if (s->type != CHAN)
145*de2caf28SDavid du Colombier 			{	rm_selfrefs(s, y);
146*de2caf28SDavid du Colombier 				s->val[i] = eval(y);
1477dd7cddfSDavid du Colombier 			} else if (!analyze)
148*de2caf28SDavid du Colombier 			{	s->val[i] = qmake(s);
149*de2caf28SDavid du Colombier 	}	}	}
1507dd7cddfSDavid du Colombier 	lineno = oln;
1517dd7cddfSDavid du Colombier 	Fname  = ofnm;
15200d97012SDavid du Colombier 
153219b2ee8SDavid du Colombier 	return 1;
154219b2ee8SDavid du Colombier }
155219b2ee8SDavid du Colombier 
1567dd7cddfSDavid du Colombier static int
getglobal(Lextok * sn)157219b2ee8SDavid du Colombier getglobal(Lextok *sn)
158219b2ee8SDavid du Colombier {	Symbol *s = sn->sym;
1597dd7cddfSDavid du Colombier 	int i, n = eval(sn->lft);
160219b2ee8SDavid du Colombier 
161*de2caf28SDavid du Colombier 	if (s->type == 0 && X_lst && (i = find_lab(s, X_lst->n, 0)))	/* getglobal */
162219b2ee8SDavid du Colombier 	{	printf("findlab through getglobal on %s\n", s->name);
163219b2ee8SDavid du Colombier 		return i;	/* can this happen? */
164219b2ee8SDavid du Colombier 	}
165219b2ee8SDavid du Colombier 	if (s->type == STRUCT)
166*de2caf28SDavid du Colombier 	{	return Rval_struct(sn, s, 1); /* 1 = check init */
167*de2caf28SDavid du Colombier 	}
168219b2ee8SDavid du Colombier 	if (checkvar(s, n))
169*de2caf28SDavid du Colombier 	{	return cast_val(s->type, s->val[n], s->nbits);
170*de2caf28SDavid du Colombier 	}
171219b2ee8SDavid du Colombier 	return 0;
172219b2ee8SDavid du Colombier }
173219b2ee8SDavid du Colombier 
174219b2ee8SDavid du Colombier int
cast_val(int t,int v,int w)1757dd7cddfSDavid du Colombier cast_val(int t, int v, int w)
176312a1df1SDavid du Colombier {	int i=0; short s=0; unsigned int u=0;
177219b2ee8SDavid du Colombier 
178312a1df1SDavid du Colombier 	if (t == PREDEF || t == INT || t == CHAN) i = v;	/* predef means _ */
179219b2ee8SDavid du Colombier 	else if (t == SHORT) s = (short) v;
180219b2ee8SDavid du Colombier 	else if (t == BYTE || t == MTYPE)  u = (unsigned char)v;
181219b2ee8SDavid du Colombier 	else if (t == BIT)   u = (unsigned char)(v&1);
1827dd7cddfSDavid du Colombier 	else if (t == UNSIGNED)
1837dd7cddfSDavid du Colombier 	{	if (w == 0)
1847dd7cddfSDavid du Colombier 			fatal("cannot happen, cast_val", (char *)0);
185312a1df1SDavid du Colombier 	/*	u = (unsigned)(v& ((1<<w)-1));		problem when w=32	*/
186312a1df1SDavid du Colombier 		u = (unsigned)(v& (~0u>>(8*sizeof(unsigned)-w)));	/* doug */
1877dd7cddfSDavid du Colombier 	}
188219b2ee8SDavid du Colombier 
189312a1df1SDavid du Colombier 	if (v != i+s+ (int) u)
190*de2caf28SDavid du Colombier 	{	char buf[64]; sprintf(buf, "%d->%d (%d)", v, i+s+(int)u, t);
191219b2ee8SDavid du Colombier 		non_fatal("value (%s) truncated in assignment", buf);
192219b2ee8SDavid du Colombier 	}
193*de2caf28SDavid du Colombier 	return (int)(i+s+(int)u);
194219b2ee8SDavid du Colombier }
195219b2ee8SDavid du Colombier 
1967dd7cddfSDavid du Colombier static int
setglobal(Lextok * v,int m)197219b2ee8SDavid du Colombier setglobal(Lextok *v, int m)
198219b2ee8SDavid du Colombier {
199219b2ee8SDavid du Colombier 	if (v->sym->type == STRUCT)
200*de2caf28SDavid du Colombier 	{	(void) Lval_struct(v, v->sym, 1, m);
201*de2caf28SDavid du Colombier 	} else
202219b2ee8SDavid du Colombier 	{	int n = eval(v->lft);
203219b2ee8SDavid du Colombier 		if (checkvar(v->sym, n))
20400d97012SDavid du Colombier 		{	int oval = v->sym->val[n];
20500d97012SDavid du Colombier 			int nval = cast_val(v->sym->type, m, v->sym->nbits);
20600d97012SDavid du Colombier 			v->sym->val[n] = nval;
20700d97012SDavid du Colombier 			if (oval != nval)
20800d97012SDavid du Colombier 			{	v->sym->setat = depth;
20900d97012SDavid du Colombier 	}	}	}
210219b2ee8SDavid du Colombier 	return 1;
211219b2ee8SDavid du Colombier }
212219b2ee8SDavid du Colombier 
213219b2ee8SDavid du Colombier void
dumpclaims(FILE * fd,int pid,char * s)214219b2ee8SDavid du Colombier dumpclaims(FILE *fd, int pid, char *s)
215*de2caf28SDavid du Colombier {	Lextok *m; int cnt = 0; int oPid = Pid_nr;
216219b2ee8SDavid du Colombier 
217219b2ee8SDavid du Colombier 	for (m = Xu_List; m; m = m->rgt)
218219b2ee8SDavid du Colombier 		if (strcmp(m->sym->name, s) == 0)
219219b2ee8SDavid du Colombier 		{	cnt=1;
220219b2ee8SDavid du Colombier 			break;
221219b2ee8SDavid du Colombier 		}
222219b2ee8SDavid du Colombier 	if (cnt == 0) return;
223219b2ee8SDavid du Colombier 
224*de2caf28SDavid du Colombier 	Pid_nr = pid;
225219b2ee8SDavid du Colombier 	fprintf(fd, "#ifndef XUSAFE\n");
226219b2ee8SDavid du Colombier 	for (m = Xu_List; m; m = m->rgt)
227219b2ee8SDavid du Colombier 	{	if (strcmp(m->sym->name, s) != 0)
228219b2ee8SDavid du Colombier 			continue;
229219b2ee8SDavid du Colombier 		no_arrays = 1;
230219b2ee8SDavid du Colombier 		putname(fd, "\t\tsetq_claim(", m->lft, 0, "");
231219b2ee8SDavid du Colombier 		no_arrays = 0;
232219b2ee8SDavid du Colombier 		fprintf(fd, ", %d, ", m->val);
233219b2ee8SDavid du Colombier 		terse = 1;
234219b2ee8SDavid du Colombier 		putname(fd, "\"", m->lft, 0, "\", h, ");
235219b2ee8SDavid du Colombier 		terse = 0;
236219b2ee8SDavid du Colombier 		fprintf(fd, "\"%s\");\n", s);
237219b2ee8SDavid du Colombier 	}
238219b2ee8SDavid du Colombier 	fprintf(fd, "#endif\n");
239*de2caf28SDavid du Colombier 	Pid_nr = oPid;
240219b2ee8SDavid du Colombier }
241219b2ee8SDavid du Colombier 
242219b2ee8SDavid du Colombier void
dumpglobals(void)243219b2ee8SDavid du Colombier dumpglobals(void)
2447dd7cddfSDavid du Colombier {	Ordered *walk;
245312a1df1SDavid du Colombier 	static Lextok *dummy = ZN;
246219b2ee8SDavid du Colombier 	Symbol *sp;
2477dd7cddfSDavid du Colombier 	int j;
248219b2ee8SDavid du Colombier 
249312a1df1SDavid du Colombier 	if (!dummy)
250312a1df1SDavid du Colombier 		dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
251312a1df1SDavid du Colombier 
2527dd7cddfSDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
2537dd7cddfSDavid du Colombier 	{	sp = walk->entry;
2547dd7cddfSDavid du Colombier 		if (!sp->type || sp->context || sp->owner
2557dd7cddfSDavid du Colombier 		||  sp->type == PROCTYPE  || sp->type == PREDEF
256312a1df1SDavid du Colombier 		||  sp->type == CODE_FRAG || sp->type == CODE_DECL
2577dd7cddfSDavid du Colombier 		||  (sp->type == MTYPE && ismtype(sp->name)))
258219b2ee8SDavid du Colombier 			continue;
2597dd7cddfSDavid du Colombier 
260219b2ee8SDavid du Colombier 		if (sp->type == STRUCT)
26100d97012SDavid du Colombier 		{	if ((verbose&4) && !(verbose&64)
26200d97012SDavid du Colombier 			&&  (sp->setat < depth
26300d97012SDavid du Colombier 			&&   jumpsteps != depth))
26400d97012SDavid du Colombier 			{	continue;
26500d97012SDavid du Colombier 			}
26600d97012SDavid du Colombier 			dump_struct(sp, sp->name, 0);
2677dd7cddfSDavid du Colombier 			continue;
2687dd7cddfSDavid du Colombier 		}
269219b2ee8SDavid du Colombier 		for (j = 0; j < sp->nel; j++)
2707dd7cddfSDavid du Colombier 		{	int prefetch;
271*de2caf28SDavid du Colombier 			char *s = 0;
2727dd7cddfSDavid du Colombier 			if (sp->type == CHAN)
273219b2ee8SDavid du Colombier 			{	doq(sp, j, 0);
274219b2ee8SDavid du Colombier 				continue;
2757dd7cddfSDavid du Colombier 			}
2767dd7cddfSDavid du Colombier 			if ((verbose&4) && !(verbose&64)
2777dd7cddfSDavid du Colombier 			&&  (sp->setat < depth
2787dd7cddfSDavid du Colombier 			&&   jumpsteps != depth))
27900d97012SDavid du Colombier 			{	continue;
28000d97012SDavid du Colombier 			}
28100d97012SDavid du Colombier 
282219b2ee8SDavid du Colombier 			dummy->sym = sp;
283219b2ee8SDavid du Colombier 			dummy->lft->val = j;
2847dd7cddfSDavid du Colombier 			/* in case of cast_val warnings, do this first: */
2857dd7cddfSDavid du Colombier 			prefetch = getglobal(dummy);
286219b2ee8SDavid du Colombier 			printf("\t\t%s", sp->name);
28700d97012SDavid du Colombier 			if (sp->nel > 1 || sp->isarray) printf("[%d]", j);
2887dd7cddfSDavid du Colombier 			printf(" = ");
289*de2caf28SDavid du Colombier 			if (sp->type == MTYPE
290*de2caf28SDavid du Colombier 			&&  sp->mtype_name)
291*de2caf28SDavid du Colombier 			{	s = sp->mtype_name->name;
292*de2caf28SDavid du Colombier 			}
293*de2caf28SDavid du Colombier 			sr_mesg(stdout, prefetch, sp->type == MTYPE, s);
2947dd7cddfSDavid du Colombier 			printf("\n");
2957dd7cddfSDavid du Colombier 			if (limited_vis && (sp->hidden&2))
2967dd7cddfSDavid du Colombier 			{	int colpos;
297*de2caf28SDavid du Colombier 				GBuf[0] = '\0';
2987dd7cddfSDavid du Colombier 				if (!xspin)
2997dd7cddfSDavid du Colombier 				{	if (columns == 2)
300*de2caf28SDavid du Colombier 						sprintf(GBuf, "~G%s = ", sp->name);
3017dd7cddfSDavid du Colombier 					else
302*de2caf28SDavid du Colombier 						sprintf(GBuf, "%s = ", sp->name);
3037dd7cddfSDavid du Colombier 				}
304*de2caf28SDavid du Colombier 				sr_buf(prefetch, sp->type == MTYPE, s);
3057dd7cddfSDavid du Colombier 				if (sp->colnr == 0)
306*de2caf28SDavid du Colombier 				{	sp->colnr = (unsigned char) maxcolnr;
3077dd7cddfSDavid du Colombier 					maxcolnr = 1+(maxcolnr%10);
3087dd7cddfSDavid du Colombier 				}
3097dd7cddfSDavid du Colombier 				colpos = nproc+sp->colnr-1;
3107dd7cddfSDavid du Colombier 				if (columns == 2)
311*de2caf28SDavid du Colombier 				{	pstext(colpos, GBuf);
3127dd7cddfSDavid du Colombier 					continue;
3137dd7cddfSDavid du Colombier 				}
3147dd7cddfSDavid du Colombier 				if (!xspin)
315*de2caf28SDavid du Colombier 				{	printf("\t\t%s\n", GBuf);
3167dd7cddfSDavid du Colombier 					continue;
3177dd7cddfSDavid du Colombier 				}
318*de2caf28SDavid du Colombier 				printf("MSC: ~G %s %s\n", sp->name, GBuf);
3197dd7cddfSDavid du Colombier 				printf("%3d:\tproc %3d (TRACK) line   1 \"var\" ",
3207dd7cddfSDavid du Colombier 					depth, colpos);
3217dd7cddfSDavid du Colombier 				printf("(state 0)\t[printf('MSC: globvar\\\\n')]\n");
3227dd7cddfSDavid du Colombier 				printf("\t\t%s", sp->name);
32300d97012SDavid du Colombier 				if (sp->nel > 1 || sp->isarray) printf("[%d]", j);
324*de2caf28SDavid du Colombier 				printf(" = %s\n", GBuf);
325219b2ee8SDavid du Colombier 	}	}	}
326219b2ee8SDavid du Colombier }
327219b2ee8SDavid du Colombier 
328219b2ee8SDavid du Colombier void
dumplocal(RunList * r,int final)329*de2caf28SDavid du Colombier dumplocal(RunList *r, int final)
330312a1df1SDavid du Colombier {	static Lextok *dummy = ZN;
331f3793cddSDavid du Colombier 	Symbol *z, *s;
332219b2ee8SDavid du Colombier 	int i;
333219b2ee8SDavid du Colombier 
334f3793cddSDavid du Colombier 	if (!r) return;
335f3793cddSDavid du Colombier 
336f3793cddSDavid du Colombier 	s = r->symtab;
337f3793cddSDavid du Colombier 
338312a1df1SDavid du Colombier 	if (!dummy)
339*de2caf28SDavid du Colombier 	{	dummy = nn(ZN, NAME, nn(ZN,CONST,ZN,ZN), ZN);
340*de2caf28SDavid du Colombier 	}
341312a1df1SDavid du Colombier 
342219b2ee8SDavid du Colombier 	for (z = s; z; z = z->next)
343219b2ee8SDavid du Colombier 	{	if (z->type == STRUCT)
3447dd7cddfSDavid du Colombier 		{	dump_struct(z, z->name, r);
3457dd7cddfSDavid du Colombier 			continue;
3467dd7cddfSDavid du Colombier 		}
347219b2ee8SDavid du Colombier 		for (i = 0; i < z->nel; i++)
348*de2caf28SDavid du Colombier 		{	char *t = 0;
349*de2caf28SDavid du Colombier 			if (z->type == CHAN)
3507dd7cddfSDavid du Colombier 			{	doq(z, i, r);
351219b2ee8SDavid du Colombier 				continue;
3527dd7cddfSDavid du Colombier 			}
353*de2caf28SDavid du Colombier 
3547dd7cddfSDavid du Colombier 			if ((verbose&4) && !(verbose&64)
355*de2caf28SDavid du Colombier 			&&  !final
3567dd7cddfSDavid du Colombier 			&&  (z->setat < depth
3577dd7cddfSDavid du Colombier 			&&   jumpsteps != depth))
358*de2caf28SDavid du Colombier 			{	continue;
359*de2caf28SDavid du Colombier 			}
3607dd7cddfSDavid du Colombier 
361219b2ee8SDavid du Colombier 			dummy->sym = z;
362219b2ee8SDavid du Colombier 			dummy->lft->val = i;
3637dd7cddfSDavid du Colombier 
364219b2ee8SDavid du Colombier 			printf("\t\t%s(%d):%s",
36500d97012SDavid du Colombier 				r->n->name, r->pid - Have_claim, z->name);
36600d97012SDavid du Colombier 			if (z->nel > 1 || z->isarray) printf("[%d]", i);
3677dd7cddfSDavid du Colombier 			printf(" = ");
368*de2caf28SDavid du Colombier 
369*de2caf28SDavid du Colombier 			if (z->type == MTYPE
370*de2caf28SDavid du Colombier 			&&  z->mtype_name)
371*de2caf28SDavid du Colombier 			{	t = z->mtype_name->name;
372*de2caf28SDavid du Colombier 			}
373*de2caf28SDavid du Colombier 			sr_mesg(stdout, getval(dummy), z->type == MTYPE, t);
3747dd7cddfSDavid du Colombier 			printf("\n");
3757dd7cddfSDavid du Colombier 			if (limited_vis && (z->hidden&2))
3767dd7cddfSDavid du Colombier 			{	int colpos;
377*de2caf28SDavid du Colombier 				GBuf[0] = '\0';
3787dd7cddfSDavid du Colombier 				if (!xspin)
3797dd7cddfSDavid du Colombier 				{	if (columns == 2)
380*de2caf28SDavid du Colombier 					sprintf(GBuf, "~G%s(%d):%s = ",
3817dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
3827dd7cddfSDavid du Colombier 					else
383*de2caf28SDavid du Colombier 					sprintf(GBuf, "%s(%d):%s = ",
3847dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
3857dd7cddfSDavid du Colombier 				}
386*de2caf28SDavid du Colombier 				sr_buf(getval(dummy), z->type==MTYPE, t);
3877dd7cddfSDavid du Colombier 				if (z->colnr == 0)
388*de2caf28SDavid du Colombier 				{	z->colnr = (unsigned char) maxcolnr;
3897dd7cddfSDavid du Colombier 					maxcolnr = 1+(maxcolnr%10);
3907dd7cddfSDavid du Colombier 				}
3917dd7cddfSDavid du Colombier 				colpos = nproc+z->colnr-1;
3927dd7cddfSDavid du Colombier 				if (columns == 2)
393*de2caf28SDavid du Colombier 				{	pstext(colpos, GBuf);
3947dd7cddfSDavid du Colombier 					continue;
3957dd7cddfSDavid du Colombier 				}
3967dd7cddfSDavid du Colombier 				if (!xspin)
397*de2caf28SDavid du Colombier 				{	printf("\t\t%s\n", GBuf);
3987dd7cddfSDavid du Colombier 					continue;
3997dd7cddfSDavid du Colombier 				}
4007dd7cddfSDavid du Colombier 				printf("MSC: ~G %s(%d):%s %s\n",
401*de2caf28SDavid du Colombier 					r->n->name, r->pid, z->name, GBuf);
4027dd7cddfSDavid du Colombier 
4037dd7cddfSDavid du Colombier 				printf("%3d:\tproc %3d (TRACK) line   1 \"var\" ",
4047dd7cddfSDavid du Colombier 					depth, colpos);
4057dd7cddfSDavid du Colombier 				printf("(state 0)\t[printf('MSC: locvar\\\\n')]\n");
4067dd7cddfSDavid du Colombier 				printf("\t\t%s(%d):%s",
4077dd7cddfSDavid du Colombier 					r->n->name, r->pid, z->name);
40800d97012SDavid du Colombier 				if (z->nel > 1 || z->isarray) printf("[%d]", i);
409*de2caf28SDavid du Colombier 				printf(" = %s\n", GBuf);
410219b2ee8SDavid du Colombier 	}	}	}
411219b2ee8SDavid du Colombier }
412