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