xref: /csrg-svn/old/dbx/debug.c (revision 12550)
1*12550Scsvaf 
2*12550Scsvaf /* Copyright (c) 1982 Regents of the University of California */
3*12550Scsvaf 
4*12550Scsvaf static char sccsid[] = "@(#)debug.c 1.6 4/8/83";
5*12550Scsvaf 
6*12550Scsvaf /*
7*12550Scsvaf  *  Debug routines
8*12550Scsvaf  */
9*12550Scsvaf 
10*12550Scsvaf #include "defs.h"
11*12550Scsvaf #include "tree.h"
12*12550Scsvaf #include "operators.h"
13*12550Scsvaf #include "eval.h"
14*12550Scsvaf #include "events.h"
15*12550Scsvaf #include "symbols.h"
16*12550Scsvaf #include "scanner.h"
17*12550Scsvaf #include "source.h"
18*12550Scsvaf #include "object.h"
19*12550Scsvaf #include "mappings.h"
20*12550Scsvaf #include "process.h"
21*12550Scsvaf #include "machine.h"
22*12550Scsvaf #include <signal.h>
23*12550Scsvaf 
24*12550Scsvaf 
25*12550Scsvaf public int debug_flag[20];
26*12550Scsvaf 
27*12550Scsvaf public debug(p)
28*12550Scsvaf Node p;
29*12550Scsvaf {
30*12550Scsvaf    int code;
31*12550Scsvaf    code = p->value.lcon;
32*12550Scsvaf 
33*12550Scsvaf    if ( (code >= 0) and (code < 10) ) {
34*12550Scsvaf    	switch(code)  {
35*12550Scsvaf 	case 2:   if(debug_flag[2])  debug_flag[2]=0;
36*12550Scsvaf 		  else debug_flag[2] =1;
37*12550Scsvaf                   printf(" flag 2 is %d \n",debug_flag[2]);
38*12550Scsvaf 	          break;
39*12550Scsvaf 
40*12550Scsvaf 	case 3:   if(debug_flag[3])  debug_flag[3]=0;
41*12550Scsvaf 		  else debug_flag[3] =1;
42*12550Scsvaf                   printf(" flag 3 is %d \n",debug_flag[3]);
43*12550Scsvaf 	          break;
44*12550Scsvaf 
45*12550Scsvaf 	case 4:   if(debug_flag[4])  debug_flag[4]=0;
46*12550Scsvaf 		  else debug_flag[4] =1;
47*12550Scsvaf                   printf(" flag 4 is %d \n",debug_flag[4]);
48*12550Scsvaf 	          break;
49*12550Scsvaf 
50*12550Scsvaf 	case 5:   if(debug_flag[5])  debug_flag[5]=0;
51*12550Scsvaf 		  else debug_flag[5] =1;
52*12550Scsvaf                   printf(" flag 5 is %d \n",debug_flag[5]);
53*12550Scsvaf 	          break;
54*12550Scsvaf 
55*12550Scsvaf 	case 6:   dumpfunctab();
56*12550Scsvaf 	          break;
57*12550Scsvaf 
58*12550Scsvaf 	default:  printf(" unknown debug code %ld \n",p->value.lcon);
59*12550Scsvaf                   break;
60*12550Scsvaf         }
61*12550Scsvaf    }
62*12550Scsvaf    else if (debug_flag[3]) symbol_dump(code);
63*12550Scsvaf    else if (debug_flag[4]) psym(code);
64*12550Scsvaf }
65*12550Scsvaf 
66*12550Scsvaf public char *showoperator(op)
67*12550Scsvaf Operator op;
68*12550Scsvaf {
69*12550Scsvaf static char *operator_str[] = {
70*12550Scsvaf "O_NOP", "O_NAME", "O_SYM", "O_LCON", "O_FCON", "O_SCON", "O_RVAL", "O_INDEX",
71*12550Scsvaf "O_INDIR", "O_DOT", "O_COMMA", "O_ITOF", "O_ADD", "O_ADDF", "O_SUB", "O_SUBF",
72*12550Scsvaf "O_NEG", "O_NEGF", "O_MUL", "O_MULF", "O_DIVF", "O_DIV", "O_MOD", "O_AND",
73*12550Scsvaf "O_OR", "O_LT", "O_LTF", "O_LE", "O_LEF", "O_GT", "O_GTF", "O_GE", "O_GEF",
74*12550Scsvaf "O_EQ", "O_EQF", "O_NE", "O_NEF", "O_ALIAS", "O_ASSIGN", "O_CALL", "O_CATCH",
75*12550Scsvaf "O_CHFILE", "O_CONT", "O_DEBUG", "O_DELETE", "O_DUMP", "O_EDIT", "O_FUNC",
76*12550Scsvaf "O_GRIPE", "O_HELP", "O_IGNORE", "O_LIST", "O_PRINT", "O_PSYM", "O_RUN",
77*12550Scsvaf "O_SKIP", "O_SOURCE", "O_STATUS", "O_STEP", "O_STOP", "O_STOPI", "O_TRACE",
78*12550Scsvaf "O_TRACEI", "O_WHATIS", "O_WHERE", "O_WHEREIS", "O_WHICH", "O_EXAMINE",
79*12550Scsvaf "O_ADDEVENT", "O_ENDX", "O_IF", "O_ONCE", "O_PRINTCALL", "O_PRINTIFCHANGED",
80*12550Scsvaf "O_PRINTRTN", "O_PRINTSRCPOS", "O_PROCRTN", "O_QLINE", "O_STOPIFCHANGED",
81*12550Scsvaf "O_STOPX", "O_TRACEON", "O_TRACEOFF", "O_TYPERENAME", "O_LASTOP" };
82*12550Scsvaf return( operator_str[ord(op)] );
83*12550Scsvaf }
84*12550Scsvaf 
85*12550Scsvaf /*
86*12550Scsvaf  * Dump a tree recursively
87*12550Scsvaf  */
88*12550Scsvaf 
89*12550Scsvaf public dumptree(f, p)
90*12550Scsvaf File f;
91*12550Scsvaf register Node p;
92*12550Scsvaf {
93*12550Scsvaf     register Node q;
94*12550Scsvaf     Operator op;
95*12550Scsvaf     static recurse  =0;
96*12550Scsvaf     ++recurse;
97*12550Scsvaf 
98*12550Scsvaf     if (p != nil) {
99*12550Scsvaf 	op = p->op;
100*12550Scsvaf 	if (ord(op) > ord(O_LASTOP)) {
101*12550Scsvaf 	    panic("bad op %d in dumptree", p->op);
102*12550Scsvaf 	}
103*12550Scsvaf         { int n_args;
104*12550Scsvaf 	  fprintf(f, "\n level %d op %s node %ld ",recurse,showoperator(op), p);
105*12550Scsvaf           for(n_args=0;n_args < nargs(op); n_args++)
106*12550Scsvaf             fprintf(f," arg%d %ld ",n_args,p->value.arg[n_args]);
107*12550Scsvaf           fprintf(f,"\n");
108*12550Scsvaf         }
109*12550Scsvaf         if(p->nodetype) {fprintf(f,"nodetype: "); psym(p->nodetype);}
110*12550Scsvaf 	switch (op) {
111*12550Scsvaf 	    case O_NAME:
112*12550Scsvaf 		fprintf(f, "%s", ident(p->value.name));
113*12550Scsvaf 		break;
114*12550Scsvaf 
115*12550Scsvaf 	    case O_SYM:
116*12550Scsvaf 		printname(f, p->value.sym);
117*12550Scsvaf 		break;
118*12550Scsvaf 
119*12550Scsvaf 	    case O_QLINE:
120*12550Scsvaf 		if (nlhdr.nfiles > 1) {
121*12550Scsvaf 		    dumptree(f, p->value.arg[0]);
122*12550Scsvaf 		    fprintf(f, ":");
123*12550Scsvaf 		}
124*12550Scsvaf 		dumptree(f, p->value.arg[1]);
125*12550Scsvaf 		break;
126*12550Scsvaf 
127*12550Scsvaf 	    case O_LCON:
128*12550Scsvaf 		if (compatible(p->nodetype, t_char)) {
129*12550Scsvaf 		    fprintf(f, "'%c'", p->value.lcon);
130*12550Scsvaf 		} else {
131*12550Scsvaf 		    fprintf(f, "%d", p->value.lcon);
132*12550Scsvaf 		}
133*12550Scsvaf 		break;
134*12550Scsvaf 
135*12550Scsvaf 	    case O_FCON:
136*12550Scsvaf 		fprintf(f, "%g", p->value.fcon);
137*12550Scsvaf 		break;
138*12550Scsvaf 
139*12550Scsvaf 	    case O_SCON:
140*12550Scsvaf 		fprintf(f, "\"%s\"", p->value.scon);
141*12550Scsvaf 		break;
142*12550Scsvaf 
143*12550Scsvaf 	    case O_INDEX:
144*12550Scsvaf 		dumptree(f, p->value.arg[0]);
145*12550Scsvaf 		fprintf(f, "[");
146*12550Scsvaf 		dumptree(f, p->value.arg[1]);
147*12550Scsvaf 		fprintf(f, "]");
148*12550Scsvaf 		break;
149*12550Scsvaf 
150*12550Scsvaf 	    case O_COMMA:
151*12550Scsvaf 		dumptree(f, p->value.arg[0]);
152*12550Scsvaf 		if (p->value.arg[1] != nil) {
153*12550Scsvaf 		    fprintf(f, ", ");
154*12550Scsvaf 		    dumptree(f, p->value.arg[1]);
155*12550Scsvaf 		}
156*12550Scsvaf 		break;
157*12550Scsvaf 
158*12550Scsvaf 	    case O_RVAL:
159*12550Scsvaf 		if (p->value.arg[0]->op == O_SYM) {
160*12550Scsvaf 		    printname(f, p->value.arg[0]->value.sym);
161*12550Scsvaf 		} else {
162*12550Scsvaf 		    dumptree(f, p->value.arg[0]);
163*12550Scsvaf 		}
164*12550Scsvaf 		break;
165*12550Scsvaf 
166*12550Scsvaf 	    case O_ITOF:
167*12550Scsvaf 		dumptree(f, p->value.arg[0]);
168*12550Scsvaf 		break;
169*12550Scsvaf 
170*12550Scsvaf 	    case O_CALL:
171*12550Scsvaf 		dumptree(f, p->value.arg[0]);
172*12550Scsvaf 		if (p->value.arg[1]!= nil) {
173*12550Scsvaf 		    fprintf(f, "(");
174*12550Scsvaf 		    dumptree(f, p->value.arg[1]);
175*12550Scsvaf 		    fprintf(f, ")");
176*12550Scsvaf 		}
177*12550Scsvaf 		break;
178*12550Scsvaf 
179*12550Scsvaf 	    case O_INDIR:
180*12550Scsvaf 		q = p->value.arg[0];
181*12550Scsvaf 		if (isvarparam(q->nodetype)) {
182*12550Scsvaf 		    dumptree(f, q);
183*12550Scsvaf 		} else {
184*12550Scsvaf 		    if (q->op == O_SYM or q->op == O_LCON or q->op == O_DOT) {
185*12550Scsvaf 			dumptree(f, q);
186*12550Scsvaf 			fprintf(f, "^");
187*12550Scsvaf 		    } else {
188*12550Scsvaf 			fprintf(f, "*(");
189*12550Scsvaf 			dumptree(f, q);
190*12550Scsvaf 			fprintf(f, ")");
191*12550Scsvaf 		    }
192*12550Scsvaf 		}
193*12550Scsvaf 		break;
194*12550Scsvaf 
195*12550Scsvaf 	    case O_DOT:
196*12550Scsvaf 		q = p->value.arg[0];
197*12550Scsvaf 		if (q->op == O_INDIR) {
198*12550Scsvaf 		    dumptree(f, q->value.arg[0]);
199*12550Scsvaf 		} else {
200*12550Scsvaf 		    dumptree(f, q);
201*12550Scsvaf 		}
202*12550Scsvaf 		fprintf(f, ".%s", symname(p->value.arg[1]->value.sym));
203*12550Scsvaf 		break;
204*12550Scsvaf 
205*12550Scsvaf 	    default:
206*12550Scsvaf 		switch (degree(op)) {
207*12550Scsvaf 		    case BINARY:
208*12550Scsvaf 			dumptree(f, p->value.arg[0]);
209*12550Scsvaf 			fprintf(f, "%s", opinfo[ord(op)].opstring);
210*12550Scsvaf 			dumptree(f, p->value.arg[1]);
211*12550Scsvaf 			break;
212*12550Scsvaf 
213*12550Scsvaf 		    case UNARY:
214*12550Scsvaf 			fprintf(f, "%s", opinfo[ord(op)].opstring);
215*12550Scsvaf 			dumptree(f, p->value.arg[0]);
216*12550Scsvaf 			break;
217*12550Scsvaf 
218*12550Scsvaf 		    default:
219*12550Scsvaf                         if(degree(op) < ord(O_LASTOP) )
220*12550Scsvaf                         {      int i;
221*12550Scsvaf                                if( nargs(op)  != 0)
222*12550Scsvaf                                  for(i=0;i<nargs(op);i++)
223*12550Scsvaf                                   dumptree(f, p->value.arg[i]);
224*12550Scsvaf 			}
225*12550Scsvaf 			else
226*12550Scsvaf                           error("internal error: bad op %d in dumptree", op);
227*12550Scsvaf 		}
228*12550Scsvaf 		break;
229*12550Scsvaf 	}
230*12550Scsvaf     }
231*12550Scsvaf    recurse--;
232*12550Scsvaf    fflush(f);
233*12550Scsvaf }
234