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