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