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