xref: /original-bsd/old/dbx/debug.c (revision 1808f06c)
112d83faeSdist /*
2be26f981Sbostic  * Copyright (c) 1983 The Regents of the University of California.
3be26f981Sbostic  * All rights reserved.
4be26f981Sbostic  *
5*1808f06cSbostic  * %sccs.include.redist.c%
612d83faeSdist  */
7aa4edd84Scsvaf 
812d83faeSdist #ifndef lint
9*1808f06cSbostic static char sccsid[] = "@(#)debug.c	5.3 (Berkeley) 06/01/90";
10be26f981Sbostic #endif /* not lint */
11aa4edd84Scsvaf 
12aa4edd84Scsvaf /*
13aa4edd84Scsvaf  *  Debug routines
14aa4edd84Scsvaf  */
15aa4edd84Scsvaf 
16aa4edd84Scsvaf #include "defs.h"
17aa4edd84Scsvaf #include "tree.h"
18aa4edd84Scsvaf #include "operators.h"
19aa4edd84Scsvaf #include "eval.h"
20aa4edd84Scsvaf #include "events.h"
21aa4edd84Scsvaf #include "symbols.h"
22aa4edd84Scsvaf #include "scanner.h"
23aa4edd84Scsvaf #include "source.h"
24aa4edd84Scsvaf #include "object.h"
25d131616cSlinton #include "main.h"
26aa4edd84Scsvaf #include "mappings.h"
27aa4edd84Scsvaf #include "process.h"
28aa4edd84Scsvaf #include "machine.h"
29d131616cSlinton #include "debug.h"
30aa4edd84Scsvaf #include <signal.h>
31aa4edd84Scsvaf 
32d131616cSlinton public boolean tracetree;	/* trace building of parse trees */
33d131616cSlinton public boolean traceeval;	/* trace tree evaluation */
34aa4edd84Scsvaf 
35d131616cSlinton /*
36d131616cSlinton  * Dynamically turn on/off a debug flag, or display some information.
37d131616cSlinton  */
38aa4edd84Scsvaf 
debug(p)39aa4edd84Scsvaf public debug (p)
40aa4edd84Scsvaf Node p;
41aa4edd84Scsvaf {
42aa4edd84Scsvaf     int code;
43d131616cSlinton 
44aa4edd84Scsvaf     code = p->value.lcon;
45aa4edd84Scsvaf     switch (code) {
46d131616cSlinton 	case 0:
47d131616cSlinton 	    puts("debugging flags:");
48d131616cSlinton 	    puts("    1        trace scanner return values");
49d131616cSlinton 	    puts("    2        trace breakpoints");
50d131616cSlinton 	    puts("    3        trace execution");
51d131616cSlinton 	    puts("    4        trace tree building");
52d131616cSlinton 	    puts("    5        trace tree evaluation");
53d131616cSlinton 	    puts("   -[12345]  turns off corresponding flag");
54d131616cSlinton 	    puts("    6        dump function table");
55aa4edd84Scsvaf 	    break;
56aa4edd84Scsvaf 
57d131616cSlinton 	case 1:
58d131616cSlinton 	case -1:
59d131616cSlinton #           ifdef LEXDEBUG
60d131616cSlinton 		lexdebug = (boolean) (code > 0);
61d131616cSlinton #           else
62d131616cSlinton 		error("can't debug scanner (not compiled with LEXDEBUG)");
63d131616cSlinton #           endif
64aa4edd84Scsvaf 	    break;
65aa4edd84Scsvaf 
66d131616cSlinton 	case 2:
67d131616cSlinton 	case -2:
68d131616cSlinton 	    tracebpts = (boolean) (code > 0);
69aa4edd84Scsvaf 	    break;
70aa4edd84Scsvaf 
71d131616cSlinton 	case 3:
72d131616cSlinton 	case -3:
73d131616cSlinton 	    traceexec = (boolean) (code > 0);
74aa4edd84Scsvaf 	    break;
75aa4edd84Scsvaf 
76d131616cSlinton 	case 4:
77d131616cSlinton 	case -4:
78d131616cSlinton 	    tracetree = (boolean) (code > 0);
79aa4edd84Scsvaf 	    break;
80aa4edd84Scsvaf 
81d131616cSlinton 	case 5:
82d131616cSlinton 	case -5:
83d131616cSlinton 	    traceeval = (boolean) (code > 0);
84d131616cSlinton 	    break;
85d131616cSlinton 
86d131616cSlinton 	case 6:
87d131616cSlinton 	    dumpfunctab();
88d131616cSlinton 	    break;
89d131616cSlinton 
90d131616cSlinton 	default:
91d131616cSlinton 	    error("unknown debug flag");
92aa4edd84Scsvaf 	    break;
93aa4edd84Scsvaf     }
94aa4edd84Scsvaf }
95aa4edd84Scsvaf 
96d131616cSlinton private String leafname[] = {
97d131616cSlinton     "nop", "name", "sym", "lcon", "fcon", "scon", "rval", "index"
98d131616cSlinton };
99d131616cSlinton 
opname(op)100d131616cSlinton public String opname (op)
101aa4edd84Scsvaf Operator op;
102aa4edd84Scsvaf {
103d131616cSlinton     String s;
104d131616cSlinton     static char buf[100];
105aa4edd84Scsvaf 
106aa4edd84Scsvaf     switch (op) {
107d131616cSlinton 	case O_ITOF:
108d131616cSlinton 	    s = "itof";
109aa4edd84Scsvaf 	    break;
110aa4edd84Scsvaf 
111d131616cSlinton 	case O_ENDX:
112d131616cSlinton 	    s = "endx";
113aa4edd84Scsvaf 	    break;
114aa4edd84Scsvaf 
115aa4edd84Scsvaf 	case O_QLINE:
116d131616cSlinton 	    s = "qline";
117aa4edd84Scsvaf 	    break;
118aa4edd84Scsvaf 
119aa4edd84Scsvaf 	default:
120d131616cSlinton 	    if (ord(op) <= ord(O_INDEX)) {
121d131616cSlinton 		s = leafname[ord(op)];
122d131616cSlinton 	    } else {
123d131616cSlinton 		s = opinfo[ord(op)].opstring;
124d131616cSlinton 		if (s == nil) {
125d131616cSlinton 		    sprintf(buf, "[op %d]", op);
126d131616cSlinton 		    s = buf;
127aa4edd84Scsvaf 		}
128aa4edd84Scsvaf 	    }
129aa4edd84Scsvaf 	    break;
130aa4edd84Scsvaf     }
131d131616cSlinton     return s;
132aa4edd84Scsvaf }
133