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