|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)bp.c 1.1 1/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.