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