xref: /csrg-svn/old/sdb/prvar.c (revision 7775)
1*7775Srrh static	char sccsid[] = "@(#)prvar.c 4.3 08/17/82";
21345Sbill #include "head.h"
31345Sbill #include <a.out.h>
41345Sbill #include <stab.h>
51345Sbill #include "cdefs.h"
61345Sbill struct user u;
71345Sbill BKPTR	bkpthead;
81345Sbill STRING	errflg;
91345Sbill 
101345Sbill /*
111345Sbill  *  outvar():
121345Sbill  * Prints named variable, recursing once for each structure member or
131345Sbill  *  subscript.
141345Sbill  * proc:var: variable name
151345Sbill  * fmt: print format
161345Sbill  * metaflag: set iff var contains metacharacters * or ?
171345Sbill  * addr: partial address of variable, initally 0
181345Sbill  * class: type class of variable
191345Sbill  * subflag: number of levels of subscript indirection
201345Sbill  * prnamep: pointer to end of partially formed print name of variable
211345Sbill  * comblk: name of common block containing variable, if any
221345Sbill  * prvar: as in findvar
231345Sbill  *
241345Sbill  * Here and elsewhere we assume that -1 is an invalid address, and
251345Sbill  *	its is used to indicate error.
261345Sbill  */
outvar(proc,var,fmt,metaflag,addr,class,subflag,prnamep,comblk,prvar)271345Sbill outvar(proc, var, fmt, metaflag, addr, class, subflag, prnamep,
281345Sbill 		comblk, prvar)
29*7775Srrh ADDR addr; char *proc, *var, *fmt, *prnamep, *comblk; u_char class; {
301345Sbill 	char *p, *q, *r, *oldpr;
311345Sbill 	register int match;
321345Sbill 	long soffset, goffset;
331345Sbill 	register ADDR newaddr = -1, arrowaddr;
341345Sbill 	register enum {INIT, ARROW, DOT} typeflag;
351345Sbill 
361345Sbill 	switch (var[0]) {
371345Sbill 	case '\0':
381345Sbill 		if (prvar == 0) return(addr);
391345Sbill 		if (metaflag) {
401345Sbill 			if (comblk[0] && !(eqstr(comblk, "*")))
411345Sbill #ifndef FLEXNAMES
421345Sbill 				printf("%.8s:%.8s", comblk, prname);
431345Sbill #else
441345Sbill 				printf("%s:%s", comblk, prname);
451345Sbill #endif
461345Sbill 			else if (proc[0])
471345Sbill #ifndef FLEXNAMES
481345Sbill 				printf("%.8s:%.8s", proc, prname);
491345Sbill #else
501345Sbill 				printf("%s:%s", proc, prname);
511345Sbill #endif
521345Sbill 			else
531345Sbill 				printf("%s", prname);
541345Sbill 		}
551345Sbill 		printit(metaflag, prvar, addr, fmt, class, sl_type,
561345Sbill 			sl_size, subflag, DSP);
571345Sbill 		return(addr);
581345Sbill 
591345Sbill 	case '[':
601345Sbill 		*prnamep++ = *var++;
611345Sbill 		p = var;
621345Sbill 		for (;;) {
631345Sbill 			*prnamep++ = *var;
641345Sbill 			if (*var == '\0' || *var == ']') break;
651345Sbill 			var++;
661345Sbill 		}
671345Sbill 		newaddr = getindir(class, addr, sl_type);
681345Sbill 		newaddr += typetosize(sl_type, sl_size) * readint(&p);
691345Sbill 		return(outvar(proc, var+1, fmt, metaflag, newaddr, N_GSYM,
701345Sbill 			subflag+1, prnamep, comblk, prvar));
711345Sbill 
721345Sbill 	case '-':
731345Sbill 	case '>':
741345Sbill 		typeflag = ARROW;
751345Sbill 		while (eqany(*var, "->"))
761345Sbill 			*prnamep++ = *var++;
771345Sbill 		subflag++;
781345Sbill 		arrowaddr = getindir(class, addr, sl_type);
791345Sbill 		if (errflg) {
801345Sbill 			printf("%s\n", errflg);
811345Sbill 			errflg = 0;
821345Sbill 			return(0);
831345Sbill 		}
841345Sbill 		class = N_GSYM;
851345Sbill 		if (var[0] == '\0') {
861345Sbill 			p = var;
871345Sbill 			newaddr = arrowaddr;
881345Sbill 			goto recurse;
891345Sbill 		}
901345Sbill 		break;
911345Sbill 
921345Sbill 	case '.':
931345Sbill 		typeflag = DOT;
941345Sbill 		if (class == N_RSYM) {
951345Sbill 			error("Not with a register variable");
961345Sbill 			return(0);
971345Sbill 		}
981345Sbill 		*prnamep++ = *var++;
991345Sbill 		subflag = 0;
1001345Sbill 		break;
1011345Sbill 
1021345Sbill 	default:
1031345Sbill 		typeflag = INIT;
1041345Sbill 		break;
1051345Sbill 	}
1061345Sbill 
1071345Sbill 	if (typeflag == INIT) {
1081345Sbill 		soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
1091345Sbill 		goffset = proc[0] ? -1 : findfile(curfile)->stf_offset;
1101345Sbill 	} else {
1111345Sbill 		soffset = proc[0] ? adrtostoffset(callpc-1) : -1;
1121345Sbill 		goffset = findfile(curfile)->stf_offset;
1131345Sbill 	}
1141345Sbill 
1151345Sbill 	p = var;
1161345Sbill 	oldpr = prnamep;
1171345Sbill 	while (!eqany(*p, "->.[") && *p != '\0')
1181345Sbill 		*prnamep++ = *p++;
1191345Sbill 	*prnamep = '\0';
1201345Sbill 
1211345Sbill 	match = 0;
1221345Sbill 	slookinit();
1231345Sbill 
1241345Sbill 	for (;;) {
1251345Sbill 		if (soffset != -1)
1261345Sbill 			if ((soffset = slooknext(var, soffset, typeflag!=INIT,
1271345Sbill 				comblk)) != -1)
1281345Sbill 				goto found;
1291345Sbill 		if (goffset != -1)
1301345Sbill 			if ((goffset = globallookup(var, goffset,
1311345Sbill 				typeflag!=INIT)) != -1)
1321345Sbill 				goto found;
1331345Sbill 		return(newaddr);
1341345Sbill 
1351345Sbill 	found:
1361345Sbill 		r = sl_name;
1371345Sbill 		q = oldpr;
1381345Sbill 		while (*r) *q++ = *r++;
1391345Sbill 		*q ='\0';
1401345Sbill 
1411345Sbill 		switch(typeflag) {
1421345Sbill 		case INIT:
1431345Sbill 			class = sl_class & STABMASK;
1441345Sbill 			if (!varclass(class) || class == N_SSYM)
1451345Sbill 				goto l;
1461345Sbill 			newaddr = (class == N_LSYM) ? -sl_addr : sl_addr;
1471345Sbill 			newaddr = formaddr(class, newaddr);
1481345Sbill 			break;
1491345Sbill 
1501345Sbill 		case ARROW:
1511345Sbill 			class = sl_class & STABMASK;
1521345Sbill 			if (!varclass(class) || class != N_SSYM)
1531345Sbill 				goto l;
1541345Sbill 			newaddr = arrowaddr + sl_addr;
1551345Sbill 			break;
1561345Sbill 
1571345Sbill 		case DOT:
1581345Sbill 			class = sl_class & STABMASK;
1591345Sbill 			if (!varclass(class) || class != N_SSYM)
1601345Sbill 				goto l;
1611345Sbill 			newaddr = addr + sl_addr;
1621345Sbill 			break;
1631345Sbill 		}
1641345Sbill 
1651345Sbill 	recurse:
1661345Sbill 		newaddr = outvar(proc, p, fmt, metaflag, newaddr,
1671345Sbill 			class, subflag, prnamep, comblk, prvar);
1681345Sbill 
1691345Sbill 		if (!metaflag)
1701345Sbill 			return(newaddr);
1711345Sbill l:;	}
1721345Sbill }
1731345Sbill 
1741345Sbill /* Output external variables.  Arguments as in outvar() */
extoutvar(var,fmt,metaflag,prvar)1751345Sbill extoutvar(var, fmt, metaflag, prvar)
1761345Sbill char *var, *fmt; {
1771345Sbill 	long offset;
1781345Sbill 	ADDR addr = -1;
1791345Sbill 
1801345Sbill 	offset = extstart;
1811345Sbill 	sl_addr = -1;
1821345Sbill 
1831345Sbill 	for (;;) {
1841345Sbill 		offset = extlookup(var, offset);
1851345Sbill 		addr = sl_addr;
1861345Sbill 		if (offset == -1)
1871345Sbill 			return(addr);
1881345Sbill 		if (metaflag)
1891345Sbill #ifndef FLEXNAMES
1901345Sbill 			printf("%.7s", sl_name);
1911345Sbill #else
1921345Sbill 			printf("%s", sl_name);
1931345Sbill #endif
1941345Sbill 		printit(metaflag, prvar, addr, fmt[0] ? fmt : "d",
1951345Sbill 			N_GSYM, 0, 0, 0, DSP);
1961345Sbill 		if (!metaflag)
1971345Sbill 			return(addr);
1981345Sbill 	}
1991345Sbill }
2001345Sbill 
prdebug()2011345Sbill prdebug() {
2021345Sbill 	register struct proct *procp;
2031345Sbill 	register struct filet *filep;
2041345Sbill 
2051345Sbill 	printf("dot=%d\n", dot);
2061345Sbill 	printf("extstart = %d\n", extstart);
2071345Sbill 	printf("firstdata = %d\n", firstdata);
2081345Sbill 	for(filep=files;filep->sfilename[0];filep++)
2091345Sbill 		printf("%s offs %d @ %d flag %d addr 0x%x\n", filep->sfilename, filep->stf_offset, filep, filep->lineflag, filep->faddr);
2101345Sbill 	for(procp=procs;procp->pname[0];procp++) {
2111345Sbill #ifndef FLEXNAMES
2121345Sbill 		printf("%s addr 0x%x; offs %d; sfptr %d; line %d",
2131345Sbill #else
2141345Sbill 		printf("%8.8s addr 0x%x; offs %d; sfptr %d; line %d",
2151345Sbill #endif
2161345Sbill 			procp->pname, procp->paddr, procp->st_offset,
2171345Sbill 			procp->sfptr, procp->lineno);
2181345Sbill 		if (procp->entrypt) printf(" entrypoint");
2191345Sbill 		printf("\n");
2201345Sbill 	}
2211345Sbill }
2221345Sbill 
2231345Sbill /*
2241345Sbill  * display addr in data space using format desc or class s
2251345Sbill  *  type == 1 => use addr for value to print
2261345Sbill  */
dispf(addr,desc,class,type,size,subflag,space)2271345Sbill dispf(addr, desc, class, type, size, subflag, space)
228*7775Srrh u_char class;
2291345Sbill char *desc; short type; ADDR addr; {
2301345Sbill 	dispx(addr, desc, class, type, size, subflag, DSP);
2311345Sbill 	printf("\n");
2321345Sbill }
2331345Sbill 
2341345Sbill /* display addr in instruction space using format desc or class s */
2351345Sbill /*  returns -1 if bad address */
dispi(addr,desc,class,type,size,subflag,space)2361345Sbill dispi(addr, desc, class, type, size, subflag, space)
237*7775Srrh u_char class;
2381345Sbill char *desc; short type; ADDR addr; {
2391345Sbill 	register i;
2401345Sbill 	i = dispx(addr, desc, class, type, size, subflag, ISP);
2411345Sbill 	printf("\n");
2421345Sbill 	return(i);
2431345Sbill }
2441345Sbill 
2451345Sbill char	pd[3];
dispx(addr,desc,class,type,size,subflag,space)2461345Sbill dispx(addr, desc, class, type, size, subflag, space)
247*7775Srrh u_char class;
2481345Sbill char *desc; short type; ADDR addr; {
2491345Sbill 	int i, sflag;
2501345Sbill 	char *p;
2511345Sbill 	char dlen, dfmt;
2521345Sbill 	long value;
2531345Sbill 	union {
2541345Sbill 		char c[WORDSIZE];
2551345Sbill 		int w;
2561345Sbill 		float f;
2571345Sbill 	} word;
2581345Sbill 	union {
2591345Sbill 		struct{
2601345Sbill 			int w1, w2;
2611345Sbill 		} ww;
2621345Sbill 		double d;
2631345Sbill 	} dbl;
2641345Sbill 
2651345Sbill 	class &= STABMASK;
2661345Sbill 	if (desc[0]  == '\0') desc = typetodesc(type, subflag);
2671345Sbill 	cpstr(odesc, desc);
2681345Sbill 	otype = type;
2691345Sbill 	oclass = class;
2701345Sbill 	oaddr = addr;
2711345Sbill 	oincr = 0;
2721345Sbill 	if (debug) printf("dispx(addr=%d,desc=%s,class=%d,type=%d,size=%d,subflg=%d,space=%d)\n",
2731345Sbill 		addr, desc, class, type, size, subflag, space);
2741345Sbill 	pd[0] = '%';
2751345Sbill 	pd[1] = dfmt = 'd';
2761345Sbill 	dlen = '\0';
2771345Sbill 	for (p = desc; *p; p++) {
2781345Sbill 		if (*p>= '0' && *p<'9') {
2791345Sbill 			size = readint(&p);
2801345Sbill 			p--;
2811345Sbill 		} else switch (*p) {
2821345Sbill 			case 'l':
2831345Sbill 			case 'h':
2841345Sbill 			case 'b':
2851345Sbill 				dlen = *p;
2861345Sbill 				break;
2871345Sbill 
2881345Sbill 			case 'a':
2891345Sbill 			case 'c':
2901345Sbill 			case 'd':
2911345Sbill 			case 'f':
2921345Sbill 			case 'g':
2931345Sbill 			case 'i':
2941345Sbill 			case 'I':
2951345Sbill 			case 'o':
2961345Sbill 			case 'p':
2971345Sbill 			case 's':
2981345Sbill 			case 'u':
2991345Sbill 			case 'x':
3001345Sbill 				pd[1] = dfmt = *p;
3011345Sbill 				break;
3021345Sbill 
3031345Sbill 			default:
3041345Sbill 				printf("Illegal descriptor: %c\n", *p);
3051345Sbill 				return(1);
3061345Sbill 		}
3071345Sbill 	}
3081345Sbill 
3091345Sbill 	if (type == -1)
3101345Sbill 		value = addr;
3111345Sbill 	else if (class == N_RSYM && addr < 16) {
3121345Sbill 		/* MACHINE DEPENDENT */
3131345Sbill 		if ((addr > 0 && addr < 6) || addr > 11) {
3141345Sbill 			printf("Bad register var %d\n", addr);
3151345Sbill 			return(-1);
3161345Sbill 		}
3171345Sbill 		value = *(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr);
3181345Sbill 	}
3191345Sbill 	else {
3201345Sbill 		value = getval(addr, dfmt == 'g' ? 'd' : dfmt, space);
3211345Sbill 	}
3221345Sbill 
3231345Sbill 	if (errflg) {
3241345Sbill 		printf("%s", errflg);
3251345Sbill 		errflg = 0;
3261345Sbill 		return(-1);
3271345Sbill 	}
3281345Sbill 
3291345Sbill 	switch (dfmt) {
3301345Sbill 	default:
3311345Sbill 		switch (dfmt) {
3321345Sbill 		case 'u':
3331345Sbill 		case 'x':
3341345Sbill 		case 'o':
3351345Sbill 			switch (dlen) {
3361345Sbill 			case 'h':
3371345Sbill 				value = (unsigned short) value;
3381345Sbill 				oincr = 2;
3391345Sbill 				break;
3401345Sbill 			case 'b':
3411345Sbill 				value = (unsigned char) value;
3421345Sbill 				oincr = 1;
3431345Sbill 				break;
3441345Sbill 			case 'l':
3451345Sbill 				value = (unsigned long) value;
3461345Sbill 				oincr = 4;
3471345Sbill 				break;
3481345Sbill 			default:
3491345Sbill 				oincr = WORDSIZE;
3501345Sbill 				break;
3511345Sbill 			}
3521345Sbill 			break;
3531345Sbill 
3541345Sbill 		default:
3551345Sbill 			switch (dlen) {
3561345Sbill 			case 'h':
3571345Sbill 				value = (short) value;
3581345Sbill 				oincr = 2;
3591345Sbill 				break;
3601345Sbill 			case 'b':
3611345Sbill 				value = (char) value;
3621345Sbill 				oincr = 1;
3631345Sbill 				break;
3641345Sbill 			case 'l':
3651345Sbill 				value = (long) value;
3661345Sbill 				oincr = 4;
3671345Sbill 				break;
3681345Sbill 			default:
3691345Sbill 				oincr = WORDSIZE;
3701345Sbill 				break;
3711345Sbill 			}
3721345Sbill 		}
3731345Sbill 		if (dfmt == 'x' && (value > 9 || value < 0))
3741345Sbill 			printf("0x");
3751345Sbill 		else if (dfmt == 'o' && (value > 7 || value < 0))
3761345Sbill 			printf("0");
3771345Sbill 		printf(pd, value);
3781345Sbill 		return(1);
3791345Sbill 
3801345Sbill 	case 'f':
3811345Sbill 		pd[1] = 'g';
3821345Sbill 		word.w = value;
3831345Sbill 		printf(pd, word.f);
3841345Sbill 		return(1);
3851345Sbill 
3861345Sbill 	case 'g':
3871345Sbill 		dbl.ww.w1 = value;
388*7775Srrh 		dbl.ww.w2 = (class == N_RSYM) ?
3891345Sbill 			*(ADDR *)(((ADDR) &u)+R0+(WORDSIZE)*(addr+1)) :
3901345Sbill 			getval(addr+WORDSIZE, 'd', space);
3911345Sbill 		printf("%.13g", dbl.d);
3921345Sbill 		return(1);
3931345Sbill 
3941345Sbill 	case 'p':
3951345Sbill 		printf("%s:%d", adrtoprocp(value)->pname,
3961345Sbill 			adrtolineno(value));
3971345Sbill 		return(1);
3981345Sbill 
3991345Sbill 	case 's':
4001345Sbill 		addr = getindir(class, addr, type);
4011345Sbill 		goto aa;
4021345Sbill 
4031345Sbill 	case 'c':
4041345Sbill 		if (size <= 1) {
4051345Sbill 			oincr = 1;
4061345Sbill 			printchar(value);
4071345Sbill 			return(1);
4081345Sbill 		} else
4091345Sbill 			goto aa;
4101345Sbill 
4111345Sbill 	case 'a':
4121345Sbill 	aa:	sflag = size == 0;
4131345Sbill 		if (sflag)
4141345Sbill 			size = 128;  /* maximum length for s and a */
4151345Sbill 		else
4161345Sbill 			oincr = size;
4171345Sbill 		for (;;) {
4181345Sbill 			word.w = getval(addr, 'd', space);
4191345Sbill 			for (i=0; i<WORDSIZE; i++) {
4201345Sbill 				if (sflag && word.c[i] == 0)
4211345Sbill 					return(1);
4221345Sbill 				if (size-- == 0)
4231345Sbill 					return(1);
4241345Sbill 				printchar(word.c[i]);
4251345Sbill 			}
4261345Sbill 			addr += WORDSIZE;
4271345Sbill 		}
4281345Sbill 		break;
4291345Sbill 
4301345Sbill 	case 'i':
4311345Sbill 	case 'I':
4321345Sbill 		value = chkget(dot, space);
4331345Sbill 		if (errflg) {
4341345Sbill 			printf("%s", errflg);
4351345Sbill 			errflg = 0;
4361345Sbill 			return(-1);
4371345Sbill 		}
4381345Sbill 		printins(dfmt, space, value);
4391345Sbill 		break;
4401345Sbill 
4411345Sbill 	}
4421345Sbill 	return(1);
4431345Sbill }
4441345Sbill 
4451345Sbill /* print variable as in prvar */
printit(metaflag,prvar,addr,desc,class,type,size,subflag,space)4461345Sbill printit(metaflag, prvar, addr, desc, class, type, size, subflag, space)
447*7775Srrh u_char class;
4481345Sbill char *desc; short type; ADDR addr; {
4491345Sbill 	if (prvar == 0)
4501345Sbill 		return;
4511345Sbill 	if (metaflag) {
4521345Sbill 		if (prvar == 1)
4531345Sbill 			printf("/ ");
4541345Sbill 		else
4551345Sbill 			printf("= ");
4561345Sbill 	}
4571345Sbill 	if (prvar == 1)
4581345Sbill 		dispf(addr, desc, class, type, size,
4591345Sbill 			subflag, space);
4601345Sbill 	else
4611345Sbill 		dispf(addr, desc, 0, -1, 0, 0, DSP);
4621345Sbill }
4631345Sbill 
printchar(c)4641345Sbill printchar(c) {
4651345Sbill 	if ((c & 0177) < ' ')
4661345Sbill 		printf("^%c", c + ('A' - 1));
4671345Sbill 	else if ((c & 0177) == 0177)
4681345Sbill 		printf("^?");
4691345Sbill 	else
4701345Sbill 		printf("%c", c);
4711345Sbill }
4721345Sbill 
4731345Sbill INT fcor;
printmap(s,amap)4741345Sbill printmap(s,amap)
4751345Sbill STRING	s; MAP *amap;
4761345Sbill {
4771345Sbill 	int file;
4781345Sbill 	file=amap->ufd;
4791345Sbill 	printf("%s\t`%s'\n",s,(file<0 ? "-" : (file==fcor ? corfil : symfil)));
4801345Sbill 	printf("b1 = 0x%-16x",amap->b1);
4811345Sbill 	printf("e1 = 0x%-16x",amap->e1);
4821345Sbill 	printf("f1 = 0x%-x",amap->f1);
4831345Sbill 	printf("\nb2 = 0x%-16x",amap->b2);
4841345Sbill 	printf("e2 = 0x%-16x",amap->e2);
4851345Sbill 	printf("f2 = 0x%-x",amap->f2);
4861345Sbill 	printf("\n");
4871345Sbill }
4881345Sbill 
4891345Sbill #define NUMREGS 24	/* number of hardware registers */
4901345Sbill REGLIST reglist[];
4911345Sbill 
printregs()4921345Sbill printregs()
4931345Sbill {
4941345Sbill 	REG REGPTR	p;
4951345Sbill 
4961345Sbill 	for (p=reglist; p < &reglist[NUMREGS/2]; p++) {
4971345Sbill 		printf("%4.4s/  ", p->rname);
4981345Sbill 		prhex12(*(ADDR *)(((ADDR)&u)+p->roffs));
4991345Sbill 		printf("      %4.4s/  ",(p+NUMREGS/2)->rname);
5001345Sbill 		prhex(*(ADDR *)(((ADDR)&u)+(p+NUMREGS/2)->roffs));
5011345Sbill 		printf("\n");
5021345Sbill 	}
5031345Sbill 	printpc();
5041345Sbill }
5051345Sbill 
printpc()5061345Sbill printpc()
5071345Sbill {
5081345Sbill 	dot= *(ADDR *)(((ADDR)&u)+PC);
5091345Sbill 	prisploc();
5101345Sbill 	printins('i',ISP,chkget(dot,ISP));
5111345Sbill 	printf("\n");
5121345Sbill }
5131345Sbill 
5141345Sbill /* print register */
5151345Sbill REGLIST reglist[];
regout(name,prvar,fmt)5161345Sbill regout(name, prvar, fmt)
5171345Sbill char *name, *fmt; {
5181345Sbill 	REG REGPTR p;
5191345Sbill 	for (p=reglist; p< &reglist[24]; p++) {
5201345Sbill 		if (eqstr(name, p->rname)) {
5211345Sbill 			printit(0, prvar, *(ADDR *)(((ADDR)&u)+p->roffs),
5221345Sbill 				fmt[0] ? fmt : "d", N_GSYM, -1, 0, 0, DSP);
5231345Sbill 			return(p->roffs);
5241345Sbill 		}
5251345Sbill 	}
5261345Sbill 	error("Unknown register variable");
5271345Sbill 	return(-1);
5281345Sbill }
5291345Sbill /* Print symbolic location of dot */
prisploc()5301345Sbill prisploc() {
5311345Sbill 	struct proct *procp;
5321345Sbill 	int lineno;
5331345Sbill 
5341345Sbill 	printf("0x%x", dot);
5351345Sbill 	procp = adrtoprocp(dot);
5361345Sbill 	if (procp != badproc) {
5371345Sbill 		printf(" (");
5381345Sbill 		prlnoff(procp, dot);
5391345Sbill 		printf("):  \t");
5401345Sbill 	} else
5411345Sbill 		printf(":  \t");
5421345Sbill }
543