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