112550Scsvaf /* Copyright (c) 1982 Regents of the University of California */ 212550Scsvaf 3*18216Slinton static char sccsid[] = "@(#)debug.c 1.5 (Berkeley) 03/01/85"; 412550Scsvaf 5*18216Slinton static char rcsid[] = "$Header: debug.c,v 1.5 84/12/26 10:39:01 linton Exp $"; 6*18216Slinton 712550Scsvaf /* 812550Scsvaf * Debug routines 912550Scsvaf */ 1012550Scsvaf 1112550Scsvaf #include "defs.h" 1212550Scsvaf #include "tree.h" 1312550Scsvaf #include "operators.h" 1412550Scsvaf #include "eval.h" 1512550Scsvaf #include "events.h" 1612550Scsvaf #include "symbols.h" 1712550Scsvaf #include "scanner.h" 1812550Scsvaf #include "source.h" 1912550Scsvaf #include "object.h" 20*18216Slinton #include "main.h" 2112550Scsvaf #include "mappings.h" 2212550Scsvaf #include "process.h" 2312550Scsvaf #include "machine.h" 24*18216Slinton #include "debug.h" 2512550Scsvaf #include <signal.h> 2612550Scsvaf 27*18216Slinton public boolean tracetree; /* trace building of parse trees */ 28*18216Slinton public boolean traceeval; /* trace tree evaluation */ 2912550Scsvaf 30*18216Slinton /* 31*18216Slinton * Dynamically turn on/off a debug flag, or display some information. 32*18216Slinton */ 3312550Scsvaf 34*18216Slinton public debug (p) 3512550Scsvaf Node p; 3612550Scsvaf { 37*18216Slinton int code; 3812550Scsvaf 39*18216Slinton code = p->value.lcon; 40*18216Slinton switch (code) { 41*18216Slinton case 0: 42*18216Slinton puts("debugging flags:"); 43*18216Slinton puts(" 1 trace scanner return values"); 44*18216Slinton puts(" 2 trace breakpoints"); 45*18216Slinton puts(" 3 trace execution"); 46*18216Slinton puts(" 4 trace tree building"); 47*18216Slinton puts(" 5 trace tree evaluation"); 48*18216Slinton puts(" -[12345] turns off corresponding flag"); 49*18216Slinton puts(" 6 dump function table"); 50*18216Slinton break; 5112550Scsvaf 52*18216Slinton case 1: 53*18216Slinton case -1: 54*18216Slinton # ifdef LEXDEBUG 55*18216Slinton lexdebug = (boolean) (code > 0); 56*18216Slinton # else 57*18216Slinton error("can't debug scanner (not compiled with LEXDEBUG)"); 58*18216Slinton # endif 59*18216Slinton break; 6012550Scsvaf 61*18216Slinton case 2: 62*18216Slinton case -2: 63*18216Slinton tracebpts = (boolean) (code > 0); 64*18216Slinton break; 6512550Scsvaf 66*18216Slinton case 3: 67*18216Slinton case -3: 68*18216Slinton traceexec = (boolean) (code > 0); 69*18216Slinton break; 7012550Scsvaf 71*18216Slinton case 4: 72*18216Slinton case -4: 73*18216Slinton tracetree = (boolean) (code > 0); 74*18216Slinton break; 7512550Scsvaf 76*18216Slinton case 5: 77*18216Slinton case -5: 78*18216Slinton traceeval = (boolean) (code > 0); 79*18216Slinton break; 8012550Scsvaf 81*18216Slinton case 6: 82*18216Slinton dumpfunctab(); 83*18216Slinton break; 84*18216Slinton 85*18216Slinton default: 86*18216Slinton error("unknown debug flag"); 87*18216Slinton break; 88*18216Slinton } 8912550Scsvaf } 9012550Scsvaf 91*18216Slinton private String leafname[] = { 92*18216Slinton "nop", "name", "sym", "lcon", "fcon", "scon", "rval", "index" 93*18216Slinton }; 9412550Scsvaf 95*18216Slinton public String opname (op) 96*18216Slinton Operator op; 9712550Scsvaf { 98*18216Slinton String s; 99*18216Slinton static char buf[100]; 10012550Scsvaf 101*18216Slinton switch (op) { 102*18216Slinton case O_ITOF: 103*18216Slinton s = "itof"; 104*18216Slinton break; 10512550Scsvaf 106*18216Slinton case O_ENDX: 107*18216Slinton s = "endx"; 108*18216Slinton break; 10912550Scsvaf 110*18216Slinton case O_QLINE: 111*18216Slinton s = "qline"; 112*18216Slinton break; 11312550Scsvaf 114*18216Slinton default: 115*18216Slinton if (ord(op) <= ord(O_INDEX)) { 116*18216Slinton s = leafname[ord(op)]; 117*18216Slinton } else { 118*18216Slinton s = opinfo[ord(op)].opstring; 119*18216Slinton if (s == nil) { 120*18216Slinton sprintf(buf, "[op %d]", op); 121*18216Slinton s = buf; 12212550Scsvaf } 123*18216Slinton } 124*18216Slinton break; 12512550Scsvaf } 126*18216Slinton return s; 12712550Scsvaf } 128