1*22275Sdist /*
2*22275Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22275Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22275Sdist  * specifies the terms and conditions for redistribution.
5*22275Sdist  */
65463Slinton 
7*22275Sdist #ifndef lint
8*22275Sdist static char sccsid[] = "@(#)bp.c	5.1 (Berkeley) 06/05/85";
9*22275Sdist #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 	BPINFO *p;
725463Slinton 
735463Slinton 	p = 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 
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 
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