|
|
1.1 ! root 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: /* ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.