Annotation of 43BSD/ucb/pascal/pdx/breakpoint/trinfo.c, revision 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.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: }

unix.superglobalmegacorp.com

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