1*5463Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*5463Slinton 3*5463Slinton static char sccsid[] = "@(#)bp.c 1.1 01/18/82"; 4*5463Slinton 5*5463Slinton /* 6*5463Slinton * Direct management of bpinfo structures. 7*5463Slinton */ 8*5463Slinton 9*5463Slinton #include "defs.h" 10*5463Slinton #include "breakpoint.h" 11*5463Slinton #include "tree.h" 12*5463Slinton #include "sym.h" 13*5463Slinton #include "main.h" 14*5463Slinton #include "source.h" 15*5463Slinton #include "object.h" 16*5463Slinton #include "bp.rep" 17*5463Slinton 18*5463Slinton unsigned int uniqueid; 19*5463Slinton 20*5463Slinton /* 21*5463Slinton * Add a breakpoint to the list, return a pointer to it. 22*5463Slinton */ 23*5463Slinton 24*5463Slinton BPINFO *newbp(addr, type, block, cond, node, line) 25*5463Slinton ADDRESS addr; 26*5463Slinton BPTYPE type; 27*5463Slinton SYM *block; 28*5463Slinton NODE *cond; 29*5463Slinton NODE *node; 30*5463Slinton LINENO line; 31*5463Slinton { 32*5463Slinton register BPINFO *p; 33*5463Slinton 34*5463Slinton p = alloc(1, BPINFO); 35*5463Slinton p->bpid = ++uniqueid; 36*5463Slinton p->bpaddr = addr; 37*5463Slinton p->bptype = type; 38*5463Slinton p->bpblock = block; 39*5463Slinton p->bpcond = cond; 40*5463Slinton p->bpnode = node; 41*5463Slinton p->bpline = line; 42*5463Slinton p->bpnext = bphead; 43*5463Slinton if (option('b')) { 44*5463Slinton printf("new bp (%d) at %d, type %d\n", p->bpid, p->bpaddr, p->bptype); 45*5463Slinton fflush(stdout); 46*5463Slinton } 47*5463Slinton bphead = p; 48*5463Slinton return(p); 49*5463Slinton } 50*5463Slinton 51*5463Slinton /* 52*5463Slinton * Add a breakpoint, but don't return anything. 53*5463Slinton * Just for folks outside of "breakpoint" who don't know that 54*5463Slinton * a BPINFO exists. 55*5463Slinton */ 56*5463Slinton 57*5463Slinton addbp(addr, type, block, cond, node, line) 58*5463Slinton ADDRESS addr; 59*5463Slinton BPTYPE type; 60*5463Slinton SYM *block; 61*5463Slinton NODE *cond; 62*5463Slinton NODE *node; 63*5463Slinton LINENO line; 64*5463Slinton { 65*5463Slinton BPINFO *p; 66*5463Slinton 67*5463Slinton p = newbp(addr, type, block, cond, node, line); 68*5463Slinton } 69*5463Slinton 70*5463Slinton /* 71*5463Slinton * Delete a breakpoint. 72*5463Slinton * 73*5463Slinton * Print out a cryptic error message if it can't be found. 74*5463Slinton */ 75*5463Slinton 76*5463Slinton delbp(id) 77*5463Slinton unsigned int id; 78*5463Slinton { 79*5463Slinton register BPINFO *p, *last; 80*5463Slinton 81*5463Slinton last = NIL; 82*5463Slinton for (p = bphead; p != NIL; p = p->bpnext) { 83*5463Slinton if (p->bpid == id) { 84*5463Slinton break; 85*5463Slinton } 86*5463Slinton last = p; 87*5463Slinton } 88*5463Slinton if (p == NIL) { 89*5463Slinton error("%d unknown", id); 90*5463Slinton } 91*5463Slinton switch (p->bptype) { 92*5463Slinton case ALL_ON: 93*5463Slinton if (p->bpline >= 0) { 94*5463Slinton tracing--; 95*5463Slinton } else { 96*5463Slinton inst_tracing--; 97*5463Slinton } 98*5463Slinton break; 99*5463Slinton 100*5463Slinton case STOP_ON: 101*5463Slinton var_tracing--; 102*5463Slinton break; 103*5463Slinton 104*5463Slinton default: 105*5463Slinton /* do nothing */ 106*5463Slinton break; 107*5463Slinton } 108*5463Slinton if (last == NIL) { 109*5463Slinton bphead = p->bpnext; 110*5463Slinton } else { 111*5463Slinton last->bpnext = p->bpnext; 112*5463Slinton } 113*5463Slinton tfree(p->bpcond); 114*5463Slinton tfree(p->bpnode); 115*5463Slinton dispose(p); 116*5463Slinton } 117*5463Slinton 118*5463Slinton /* 119*5463Slinton * Free all storage in the breakpoint table. 120*5463Slinton */ 121*5463Slinton 122*5463Slinton bpfree() 123*5463Slinton { 124*5463Slinton register BPINFO *p, *next; 125*5463Slinton 126*5463Slinton fixbps(); 127*5463Slinton for (p = bphead; p != NIL; p = next) { 128*5463Slinton next = p->bpnext; 129*5463Slinton tfree(p->bpcond); 130*5463Slinton tfree(p->bpnode); 131*5463Slinton dispose(p); 132*5463Slinton } 133*5463Slinton bphead = NIL; 134*5463Slinton } 135