port to tahoe by Nir peleg of CCI
[unix-history] / usr / src / usr.bin / pascal / pdx / breakpoint / trinfo.c
CommitLineData
d8be300a
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
d7c044cc 6
d8be300a 7#ifndef lint
82d3cd01 8static char sccsid[] = "@(#)trinfo.c 5.2 (Berkeley) %G%";
d8be300a 9#endif not lint
d7c044cc
ML
10
11/*
12 * Trace information management.
13 *
14 * The trace information is a list of variables that are being
15 * traced or whose value changing should cause a stop.
16 */
17
18#include "defs.h"
19#include "breakpoint.h"
20#include "process.h"
21#include "machine.h"
22#include "sym.h"
23#include "tree.h"
24#include "source.h"
25#include "object.h"
26#include "tree/tree.rep"
82d3cd01
KM
27#include "process/process.rep"
28#include "process/pxinfo.h"
d7c044cc
ML
29
30/*
31 * When tracing variables we keep a copy of their most recent value
32 * and compare it to the current one each time a breakpoint occurs.
33 * MAXTRSIZE is the maximum size variable we allow.
34 */
35
36#define MAXTRSIZE 512
37
38/*
39 * The tracing structure is a list of information about all the
40 * variables that are being traced.
41 */
42
43typedef struct trinfo {
e0ce5d75
ML
44 TRTYPE trtype;
45 ADDRESS traddr;
46 SYM *trblock;
47 NODE *trvar;
48 NODE *trcond;
49 char *trvalue;
50 struct trinfo *trnext;
d7c044cc
ML
51} TRINFO;
52
53LOCAL TRINFO *trhead;
54
55/*
56 * add a variable to be traced
57 */
58
59addvar(trtype, node, cond)
60TRTYPE trtype;
61NODE *node;
62NODE *cond;
63{
e0ce5d75
ML
64 register TRINFO *tp;
65
66 tp = alloc(1, TRINFO);
67 tp->trtype = trtype;
68 tp->traddr = (ADDRESS) -1;
69 tp->trblock = curfunc;
70 tp->trvar = node;
71 tp->trcond = cond;
72 tp->trvalue = NIL;
73 tp->trnext = trhead;
74 trhead = tp;
d7c044cc
ML
75}
76
77/*
78 * remove a variable from the trace list
79 */
80
81delvar(trtype, node, cond)
82TRTYPE trtype;
83NODE *node;
84NODE *cond;
85{
e0ce5d75
ML
86 register TRINFO *tp, *last;
87
88 last = NIL;
89 for (tp = trhead; tp != NIL; tp = tp->trnext) {
90 if (tp->trtype == trtype &&
91 tr_equal(tp->trvar, node) &&
92 tr_equal(tp->trcond, cond)) {
93 break;
d7c044cc 94 }
e0ce5d75
ML
95 }
96 if (tp == NIL) {
97 trerror("can't delete term %t", node);
98 }
99 if (last == NIL) {
100 trhead = tp->trnext;
101 } else {
102 last->trnext = tp->trnext;
103 }
104 if (tp->trvalue != NIL) {
105 free(tp->trvalue);
106 }
107 free(tp);
d7c044cc
ML
108}
109
110/*
111 * Print out any news about variables in the list whose
112 * values have changed.
113 */
114
115prvarnews()
116{
e0ce5d75
ML
117 register TRINFO *tp;
118 register NODE *p;
119 register int n;
120 SYM *s;
121 char buff[MAXTRSIZE];
122 static LINENO prevline;
123
124 for (tp = trhead; tp != NIL; tp = tp->trnext) {
125 if (tp->trcond != NIL && !cond(tp->trcond)) {
126 continue;
127 }
128 s = curfunc;
129 while (s != NIL && s != tp->trblock) {
130 s = container(s);
d7c044cc 131 }
e0ce5d75
ML
132 if (s == NIL) {
133 continue;
134 }
135 p = tp->trvar;
136 if (tp->traddr == (ADDRESS) -1) {
137 tp->traddr = lval(p->left);
138 }
139 n = size(p->nodetype);
140 dread(buff, tp->traddr, n);
141 if (tp->trvalue == NIL) {
142 tp->trvalue = alloc(n, char);
143 mov(buff, tp->trvalue, n);
144 mov(buff, sp, n);
145 sp += n;
82d3cd01
KM
146#ifdef tahoe
147 alignstack();
148#endif
e0ce5d75
ML
149 if (tp->trtype == TRPRINT) {
150 printf("initially (at ");
151 printwhere(curline, srcfilename(pc));
152 printf("):\t");
153 prtree(p);
154 printf(" = ");
155 printval(p->nodetype);
156 putchar('\n');
157 }
158 } else if (cmp(tp->trvalue, buff, n) != 0) {
159 mov(buff, tp->trvalue, n);
160 mov(buff, sp, n);
161 sp += n;
82d3cd01
KM
162#ifdef tahoe
163 alignstack();
164#endif
e0ce5d75
ML
165 printf("after ");
166 printwhere(prevline, srcfilename(pc));
167 printf(":\t");
168 prtree(p);
169 printf(" = ");
170 printval(p->nodetype);
171 putchar('\n');
172 if (tp->trtype == TRSTOP) {
173 isstopped = TRUE;
174 curline = srcline(pc);
175 printstatus();
176 }
177 }
178 }
179 prevline = curline;
d7c044cc
ML
180}
181
182/*
183 * Free the table. Note that trvar and trcond fields are not freed,
184 * this is because they are the same as in the breakpoint table and
185 * are freed by the bpfree routine.
186 */
187
188trfree()
189{
e0ce5d75
ML
190 register TRINFO *tp, *next;
191
192 for (tp = trhead; tp != NIL; tp = next) {
193 next = tp->trnext;
194 if (tp->trvalue != NIL) {
195 free(tp->trvalue);
d7c044cc 196 }
e0ce5d75
ML
197 free(tp);
198 }
199 trhead = NIL;
d7c044cc 200}