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