1*5463Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5463Slinton 
3*5463Slinton static char sccsid[] = "@(#)bp.c 1.1 01/18/82";
4*5463Slinton 
5*5463Slinton /*
6*5463Slinton  * Direct management of bpinfo structures.
7*5463Slinton  */
8*5463Slinton 
9*5463Slinton #include "defs.h"
10*5463Slinton #include "breakpoint.h"
11*5463Slinton #include "tree.h"
12*5463Slinton #include "sym.h"
13*5463Slinton #include "main.h"
14*5463Slinton #include "source.h"
15*5463Slinton #include "object.h"
16*5463Slinton #include "bp.rep"
17*5463Slinton 
18*5463Slinton unsigned int uniqueid;
19*5463Slinton 
20*5463Slinton /*
21*5463Slinton  * Add a breakpoint to the list, return a pointer to it.
22*5463Slinton  */
23*5463Slinton 
24*5463Slinton BPINFO *newbp(addr, type, block, cond, node, line)
25*5463Slinton ADDRESS addr;
26*5463Slinton BPTYPE type;
27*5463Slinton SYM *block;
28*5463Slinton NODE *cond;
29*5463Slinton NODE *node;
30*5463Slinton LINENO line;
31*5463Slinton {
32*5463Slinton 	register BPINFO *p;
33*5463Slinton 
34*5463Slinton 	p = alloc(1, BPINFO);
35*5463Slinton 	p->bpid = ++uniqueid;
36*5463Slinton 	p->bpaddr = addr;
37*5463Slinton 	p->bptype = type;
38*5463Slinton 	p->bpblock = block;
39*5463Slinton 	p->bpcond = cond;
40*5463Slinton 	p->bpnode = node;
41*5463Slinton 	p->bpline = line;
42*5463Slinton 	p->bpnext = bphead;
43*5463Slinton 	if (option('b')) {
44*5463Slinton 		printf("new bp (%d) at %d, type %d\n", p->bpid, p->bpaddr, p->bptype);
45*5463Slinton 		fflush(stdout);
46*5463Slinton 	}
47*5463Slinton 	bphead = p;
48*5463Slinton 	return(p);
49*5463Slinton }
50*5463Slinton 
51*5463Slinton /*
52*5463Slinton  * Add a breakpoint, but don't return anything.
53*5463Slinton  * Just for folks outside of "breakpoint" who don't know that
54*5463Slinton  * a BPINFO exists.
55*5463Slinton  */
56*5463Slinton 
57*5463Slinton addbp(addr, type, block, cond, node, line)
58*5463Slinton ADDRESS addr;
59*5463Slinton BPTYPE type;
60*5463Slinton SYM *block;
61*5463Slinton NODE *cond;
62*5463Slinton NODE *node;
63*5463Slinton LINENO line;
64*5463Slinton {
65*5463Slinton 	BPINFO *p;
66*5463Slinton 
67*5463Slinton 	p = newbp(addr, type, block, cond, node, line);
68*5463Slinton }
69*5463Slinton 
70*5463Slinton /*
71*5463Slinton  * Delete a breakpoint.
72*5463Slinton  *
73*5463Slinton  * Print out a cryptic error message if it can't be found.
74*5463Slinton  */
75*5463Slinton 
76*5463Slinton delbp(id)
77*5463Slinton unsigned int id;
78*5463Slinton {
79*5463Slinton 	register BPINFO *p, *last;
80*5463Slinton 
81*5463Slinton 	last = NIL;
82*5463Slinton 	for (p = bphead; p != NIL; p = p->bpnext) {
83*5463Slinton 		if (p->bpid == id) {
84*5463Slinton 			break;
85*5463Slinton 		}
86*5463Slinton 		last = p;
87*5463Slinton 	}
88*5463Slinton 	if (p == NIL) {
89*5463Slinton 		error("%d unknown", id);
90*5463Slinton 	}
91*5463Slinton 	switch (p->bptype) {
92*5463Slinton 		case ALL_ON:
93*5463Slinton 			if (p->bpline >= 0) {
94*5463Slinton 				tracing--;
95*5463Slinton 			} else {
96*5463Slinton 				inst_tracing--;
97*5463Slinton 			}
98*5463Slinton 			break;
99*5463Slinton 
100*5463Slinton 		case STOP_ON:
101*5463Slinton 			var_tracing--;
102*5463Slinton 			break;
103*5463Slinton 
104*5463Slinton 		default:
105*5463Slinton 			/* do nothing */
106*5463Slinton 			break;
107*5463Slinton 	}
108*5463Slinton 	if (last == NIL) {
109*5463Slinton 		bphead = p->bpnext;
110*5463Slinton 	} else {
111*5463Slinton 		last->bpnext = p->bpnext;
112*5463Slinton 	}
113*5463Slinton 	tfree(p->bpcond);
114*5463Slinton 	tfree(p->bpnode);
115*5463Slinton 	dispose(p);
116*5463Slinton }
117*5463Slinton 
118*5463Slinton /*
119*5463Slinton  * Free all storage in the breakpoint table.
120*5463Slinton  */
121*5463Slinton 
122*5463Slinton bpfree()
123*5463Slinton {
124*5463Slinton 	register BPINFO *p, *next;
125*5463Slinton 
126*5463Slinton 	fixbps();
127*5463Slinton 	for (p = bphead; p != NIL; p = next) {
128*5463Slinton 		next = p->bpnext;
129*5463Slinton 		tfree(p->bpcond);
130*5463Slinton 		tfree(p->bpnode);
131*5463Slinton 		dispose(p);
132*5463Slinton 	}
133*5463Slinton 	bphead = NIL;
134*5463Slinton }
135