148103Sbostic /*-
2*62122Sbostic  * Copyright (c) 1980, 1993
3*62122Sbostic  *	The Regents of the University of California.  All rights reserved.
448103Sbostic  *
548103Sbostic  * %sccs.include.redist.c%
622275Sdist  */
75463Slinton 
822275Sdist #ifndef lint
9*62122Sbostic static char sccsid[] = "@(#)bp.c	8.1 (Berkeley) 06/06/93";
1048103Sbostic #endif /* not lint */
115463Slinton 
125463Slinton /*
135463Slinton  * Direct management of bpinfo structures.
145463Slinton  */
155463Slinton 
165463Slinton #include "defs.h"
175463Slinton #include "breakpoint.h"
185463Slinton #include "tree.h"
195463Slinton #include "sym.h"
205463Slinton #include "main.h"
215463Slinton #include "source.h"
225463Slinton #include "object.h"
235463Slinton #include "bp.rep"
245463Slinton 
255463Slinton unsigned int uniqueid;
265463Slinton 
275463Slinton /*
285463Slinton  * Add a breakpoint to the list, return a pointer to it.
295463Slinton  */
305463Slinton 
newbp(addr,type,block,cond,node,line)315463Slinton BPINFO *newbp(addr, type, block, cond, node, line)
325463Slinton ADDRESS addr;
335463Slinton BPTYPE type;
345463Slinton SYM *block;
355463Slinton NODE *cond;
365463Slinton NODE *node;
375463Slinton LINENO line;
385463Slinton {
395463Slinton 	register BPINFO *p;
405463Slinton 
415463Slinton 	p = alloc(1, BPINFO);
425463Slinton 	p->bpid = ++uniqueid;
435463Slinton 	p->bpaddr = addr;
445463Slinton 	p->bptype = type;
455463Slinton 	p->bpblock = block;
465463Slinton 	p->bpcond = cond;
475463Slinton 	p->bpnode = node;
485463Slinton 	p->bpline = line;
495463Slinton 	p->bpnext = bphead;
505463Slinton 	if (option('b')) {
515463Slinton 		printf("new bp (%d) at %d, type %d\n", p->bpid, p->bpaddr, p->bptype);
525463Slinton 		fflush(stdout);
535463Slinton 	}
545463Slinton 	bphead = p;
555463Slinton 	return(p);
565463Slinton }
575463Slinton 
585463Slinton /*
595463Slinton  * Add a breakpoint, but don't return anything.
605463Slinton  * Just for folks outside of "breakpoint" who don't know that
615463Slinton  * a BPINFO exists.
625463Slinton  */
635463Slinton 
addbp(addr,type,block,cond,node,line)645463Slinton addbp(addr, type, block, cond, node, line)
655463Slinton ADDRESS addr;
665463Slinton BPTYPE type;
675463Slinton SYM *block;
685463Slinton NODE *cond;
695463Slinton NODE *node;
705463Slinton LINENO line;
715463Slinton {
725463Slinton 
7330843Smckusick 	(void) newbp(addr, type, block, cond, node, line);
745463Slinton }
755463Slinton 
765463Slinton /*
775463Slinton  * Delete a breakpoint.
785463Slinton  *
795463Slinton  * Print out a cryptic error message if it can't be found.
805463Slinton  */
815463Slinton 
delbp(id)825463Slinton delbp(id)
835463Slinton unsigned int id;
845463Slinton {
855463Slinton 	register BPINFO *p, *last;
865463Slinton 
875463Slinton 	last = NIL;
885463Slinton 	for (p = bphead; p != NIL; p = p->bpnext) {
895463Slinton 		if (p->bpid == id) {
905463Slinton 			break;
915463Slinton 		}
925463Slinton 		last = p;
935463Slinton 	}
945463Slinton 	if (p == NIL) {
955463Slinton 		error("%d unknown", id);
965463Slinton 	}
975463Slinton 	switch (p->bptype) {
985463Slinton 		case ALL_ON:
995463Slinton 			if (p->bpline >= 0) {
1005463Slinton 				tracing--;
1015463Slinton 			} else {
1025463Slinton 				inst_tracing--;
1035463Slinton 			}
1045463Slinton 			break;
1055463Slinton 
1065463Slinton 		case STOP_ON:
1075463Slinton 			var_tracing--;
1085463Slinton 			break;
1095463Slinton 
1105463Slinton 		default:
1115463Slinton 			/* do nothing */
1125463Slinton 			break;
1135463Slinton 	}
1145463Slinton 	if (last == NIL) {
1155463Slinton 		bphead = p->bpnext;
1165463Slinton 	} else {
1175463Slinton 		last->bpnext = p->bpnext;
1185463Slinton 	}
1195463Slinton 	tfree(p->bpcond);
1205463Slinton 	tfree(p->bpnode);
1215463Slinton 	dispose(p);
1225463Slinton }
1235463Slinton 
1245463Slinton /*
1255463Slinton  * Free all storage in the breakpoint table.
1265463Slinton  */
1275463Slinton 
bpfree()1285463Slinton bpfree()
1295463Slinton {
1305463Slinton 	register BPINFO *p, *next;
1315463Slinton 
1325463Slinton 	fixbps();
1335463Slinton 	for (p = bphead; p != NIL; p = next) {
1345463Slinton 		next = p->bpnext;
1355463Slinton 		tfree(p->bpcond);
1365463Slinton 		tfree(p->bpnode);
1375463Slinton 		dispose(p);
1385463Slinton 	}
1395463Slinton 	bphead = NIL;
1405463Slinton }
141