Annotation of 42BSD/ucb/pascal/pdx/breakpoint/trinfo.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.