1*48103Sbostic /*- 2*48103Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48103Sbostic * All rights reserved. 4*48103Sbostic * 5*48103Sbostic * %sccs.include.redist.c% 622275Sdist */ 75463Slinton 822275Sdist #ifndef lint 9*48103Sbostic static char sccsid[] = "@(#)bp.c 5.3 (Berkeley) 04/16/91"; 10*48103Sbostic #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 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 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 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