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