|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)trinfo.c 5.1 (Berkeley) 6/5/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Trace information management. ! 13: * ! 14: * The trace information is a list of variables that are being ! 15: * traced or whose value changing should cause a stop. ! 16: */ ! 17: ! 18: #include "defs.h" ! 19: #include "breakpoint.h" ! 20: #include "process.h" ! 21: #include "machine.h" ! 22: #include "sym.h" ! 23: #include "tree.h" ! 24: #include "source.h" ! 25: #include "object.h" ! 26: #include "tree/tree.rep" ! 27: ! 28: /* ! 29: * When tracing variables we keep a copy of their most recent value ! 30: * and compare it to the current one each time a breakpoint occurs. ! 31: * MAXTRSIZE is the maximum size variable we allow. ! 32: */ ! 33: ! 34: #define MAXTRSIZE 512 ! 35: ! 36: /* ! 37: * The tracing structure is a list of information about all the ! 38: * variables that are being traced. ! 39: */ ! 40: ! 41: typedef struct trinfo { ! 42: TRTYPE trtype; ! 43: ADDRESS traddr; ! 44: SYM *trblock; ! 45: NODE *trvar; ! 46: NODE *trcond; ! 47: char *trvalue; ! 48: struct trinfo *trnext; ! 49: } TRINFO; ! 50: ! 51: LOCAL TRINFO *trhead; ! 52: ! 53: /* ! 54: * add a variable to be traced ! 55: */ ! 56: ! 57: addvar(trtype, node, cond) ! 58: TRTYPE trtype; ! 59: NODE *node; ! 60: NODE *cond; ! 61: { ! 62: register TRINFO *tp; ! 63: ! 64: tp = alloc(1, TRINFO); ! 65: tp->trtype = trtype; ! 66: tp->traddr = (ADDRESS) -1; ! 67: tp->trblock = curfunc; ! 68: tp->trvar = node; ! 69: tp->trcond = cond; ! 70: tp->trvalue = NIL; ! 71: tp->trnext = trhead; ! 72: trhead = tp; ! 73: } ! 74: ! 75: /* ! 76: * remove a variable from the trace list ! 77: */ ! 78: ! 79: delvar(trtype, node, cond) ! 80: TRTYPE trtype; ! 81: NODE *node; ! 82: NODE *cond; ! 83: { ! 84: register TRINFO *tp, *last; ! 85: ! 86: last = NIL; ! 87: for (tp = trhead; tp != NIL; tp = tp->trnext) { ! 88: if (tp->trtype == trtype && ! 89: tr_equal(tp->trvar, node) && ! 90: tr_equal(tp->trcond, cond)) { ! 91: break; ! 92: } ! 93: } ! 94: if (tp == NIL) { ! 95: trerror("can't delete term %t", node); ! 96: } ! 97: if (last == NIL) { ! 98: trhead = tp->trnext; ! 99: } else { ! 100: last->trnext = tp->trnext; ! 101: } ! 102: if (tp->trvalue != NIL) { ! 103: free(tp->trvalue); ! 104: } ! 105: free(tp); ! 106: } ! 107: ! 108: /* ! 109: * Print out any news about variables in the list whose ! 110: * values have changed. ! 111: */ ! 112: ! 113: prvarnews() ! 114: { ! 115: register TRINFO *tp; ! 116: register NODE *p; ! 117: register int n; ! 118: SYM *s; ! 119: char buff[MAXTRSIZE]; ! 120: static LINENO prevline; ! 121: ! 122: for (tp = trhead; tp != NIL; tp = tp->trnext) { ! 123: if (tp->trcond != NIL && !cond(tp->trcond)) { ! 124: continue; ! 125: } ! 126: s = curfunc; ! 127: while (s != NIL && s != tp->trblock) { ! 128: s = container(s); ! 129: } ! 130: if (s == NIL) { ! 131: continue; ! 132: } ! 133: p = tp->trvar; ! 134: if (tp->traddr == (ADDRESS) -1) { ! 135: tp->traddr = lval(p->left); ! 136: } ! 137: n = size(p->nodetype); ! 138: dread(buff, tp->traddr, n); ! 139: if (tp->trvalue == NIL) { ! 140: tp->trvalue = alloc(n, char); ! 141: mov(buff, tp->trvalue, n); ! 142: mov(buff, sp, n); ! 143: sp += n; ! 144: if (tp->trtype == TRPRINT) { ! 145: printf("initially (at "); ! 146: printwhere(curline, srcfilename(pc)); ! 147: printf("):\t"); ! 148: prtree(p); ! 149: printf(" = "); ! 150: printval(p->nodetype); ! 151: putchar('\n'); ! 152: } ! 153: } else if (cmp(tp->trvalue, buff, n) != 0) { ! 154: mov(buff, tp->trvalue, n); ! 155: mov(buff, sp, n); ! 156: sp += n; ! 157: printf("after "); ! 158: printwhere(prevline, srcfilename(pc)); ! 159: printf(":\t"); ! 160: prtree(p); ! 161: printf(" = "); ! 162: printval(p->nodetype); ! 163: putchar('\n'); ! 164: if (tp->trtype == TRSTOP) { ! 165: isstopped = TRUE; ! 166: curline = srcline(pc); ! 167: printstatus(); ! 168: } ! 169: } ! 170: } ! 171: prevline = curline; ! 172: } ! 173: ! 174: /* ! 175: * Free the table. Note that trvar and trcond fields are not freed, ! 176: * this is because they are the same as in the breakpoint table and ! 177: * are freed by the bpfree routine. ! 178: */ ! 179: ! 180: trfree() ! 181: { ! 182: register TRINFO *tp, *next; ! 183: ! 184: for (tp = trhead; tp != NIL; tp = next) { ! 185: next = tp->trnext; ! 186: if (tp->trvalue != NIL) { ! 187: free(tp->trvalue); ! 188: } ! 189: free(tp); ! 190: } ! 191: trhead = NIL; ! 192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.