Annotation of 43BSDReno/pgrm/pascal/pdx/breakpoint/trinfo.c, revision 1.1.1.1

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.2 (Berkeley) 4/7/87";
                      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: #include "process/process.rep"
                     28: #include "process/pxinfo.h"
                     29: 
                     30: /*
                     31:  * When tracing variables we keep a copy of their most recent value
                     32:  * and compare it to the current one each time a breakpoint occurs.
                     33:  * MAXTRSIZE is the maximum size variable we allow.
                     34:  */
                     35: 
                     36: #define MAXTRSIZE 512
                     37: 
                     38: /*
                     39:  * The tracing structure is a list of information about all the
                     40:  * variables that are being traced.
                     41:  */
                     42: 
                     43: typedef struct trinfo {
                     44:     TRTYPE trtype;
                     45:     ADDRESS traddr;
                     46:     SYM *trblock;
                     47:     NODE *trvar;
                     48:     NODE *trcond;
                     49:     char *trvalue;
                     50:     struct trinfo *trnext;
                     51: } TRINFO;
                     52: 
                     53: LOCAL TRINFO *trhead;
                     54: 
                     55: /*
                     56:  * add a variable to be traced
                     57:  */
                     58: 
                     59: addvar(trtype, node, cond)
                     60: TRTYPE trtype;
                     61: NODE *node;
                     62: NODE *cond;
                     63: {
                     64:     register TRINFO *tp;
                     65: 
                     66:     tp = alloc(1, TRINFO);
                     67:     tp->trtype = trtype;
                     68:     tp->traddr = (ADDRESS) -1;
                     69:     tp->trblock = curfunc;
                     70:     tp->trvar = node;
                     71:     tp->trcond = cond;
                     72:     tp->trvalue = NIL;
                     73:     tp->trnext = trhead;
                     74:     trhead = tp;
                     75: }
                     76: 
                     77: /*
                     78:  * remove a variable from the trace list
                     79:  */
                     80: 
                     81: delvar(trtype, node, cond)
                     82: TRTYPE trtype;
                     83: NODE *node;
                     84: NODE *cond;
                     85: {
                     86:     register TRINFO *tp, *last;
                     87: 
                     88:     last = NIL;
                     89:     for (tp = trhead; tp != NIL; tp = tp->trnext) {
                     90:        if (tp->trtype == trtype &&
                     91:            tr_equal(tp->trvar, node) &&
                     92:            tr_equal(tp->trcond, cond)) {
                     93:            break;
                     94:        }
                     95:     }
                     96:     if (tp == NIL) {
                     97:        trerror("can't delete term %t", node);
                     98:     }
                     99:     if (last == NIL) {
                    100:        trhead = tp->trnext;
                    101:     } else {
                    102:        last->trnext = tp->trnext;
                    103:     }
                    104:     if (tp->trvalue != NIL) {
                    105:        free(tp->trvalue);
                    106:     }
                    107:     free(tp);
                    108: }
                    109: 
                    110: /*
                    111:  * Print out any news about variables in the list whose
                    112:  * values have changed.
                    113:  */
                    114: 
                    115: prvarnews()
                    116: {
                    117:     register TRINFO *tp;
                    118:     register NODE *p;
                    119:     register int n;
                    120:     SYM *s;
                    121:     char buff[MAXTRSIZE];
                    122:     static LINENO prevline;
                    123: 
                    124:     for (tp = trhead; tp != NIL; tp = tp->trnext) {
                    125:        if (tp->trcond != NIL && !cond(tp->trcond)) {
                    126:            continue;
                    127:        }
                    128:        s = curfunc;
                    129:        while (s != NIL && s != tp->trblock) {
                    130:            s = container(s);
                    131:        }
                    132:        if (s == NIL) {
                    133:            continue;
                    134:        }
                    135:        p = tp->trvar;
                    136:        if (tp->traddr == (ADDRESS) -1) {
                    137:            tp->traddr = lval(p->left);
                    138:        }
                    139:        n = size(p->nodetype);
                    140:        dread(buff, tp->traddr, n);
                    141:        if (tp->trvalue == NIL) {
                    142:            tp->trvalue = alloc(n, char);
                    143:            mov(buff, tp->trvalue, n);
                    144:            mov(buff, sp, n);
                    145:            sp += n;
                    146: #ifdef tahoe
                    147:            alignstack();
                    148: #endif
                    149:            if (tp->trtype == TRPRINT) {
                    150:                printf("initially (at ");
                    151:                printwhere(curline, srcfilename(pc));
                    152:                printf("):\t");
                    153:                prtree(p);
                    154:                printf(" = ");
                    155:                printval(p->nodetype);
                    156:                putchar('\n');
                    157:            }
                    158:        } else if (cmp(tp->trvalue, buff, n) != 0) {
                    159:            mov(buff, tp->trvalue, n);
                    160:            mov(buff, sp, n);
                    161:            sp += n;
                    162: #ifdef tahoe
                    163:            alignstack();
                    164: #endif
                    165:            printf("after ");
                    166:            printwhere(prevline, srcfilename(pc));
                    167:            printf(":\t");
                    168:            prtree(p);
                    169:            printf(" = ");
                    170:            printval(p->nodetype);
                    171:            putchar('\n');
                    172:            if (tp->trtype == TRSTOP) {
                    173:                isstopped = TRUE;
                    174:                curline = srcline(pc);
                    175:                printstatus();
                    176:            }
                    177:        }
                    178:     }
                    179:     prevline = curline;
                    180: }
                    181: 
                    182: /*
                    183:  * Free the table.  Note that trvar and trcond fields are not freed,
                    184:  * this is because they are the same as in the breakpoint table and
                    185:  * are freed by the bpfree routine.
                    186:  */
                    187: 
                    188: trfree()
                    189: {
                    190:     register TRINFO *tp, *next;
                    191: 
                    192:     for (tp = trhead; tp != NIL; tp = next) {
                    193:        next = tp->trnext;
                    194:        if (tp->trvalue != NIL) {
                    195:            free(tp->trvalue);
                    196:        }
                    197:        free(tp);
                    198:     }
                    199:     trhead = NIL;
                    200: }

unix.superglobalmegacorp.com

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