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