Annotation of 43BSDTahoe/lib/old_compiler/dbx/check.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 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[] = "@(#)check.c    5.2 (Berkeley) 1/10/86";
                      9: #endif not lint
                     10: 
                     11: static char rcsid[] = "$Header: check.c,v 1.5 84/12/26 10:38:35 linton Exp $";
                     12: 
                     13: /*
                     14:  * Check a tree for semantic correctness.
                     15:  */
                     16: 
                     17: #include "defs.h"
                     18: #include "tree.h"
                     19: #include "operators.h"
                     20: #include "events.h"
                     21: #include "symbols.h"
                     22: #include "scanner.h"
                     23: #include "source.h"
                     24: #include "object.h"
                     25: #include "mappings.h"
                     26: #include "process.h"
                     27: #include <signal.h>
                     28: 
                     29: #ifndef public
                     30: #endif
                     31: 
                     32: /*
                     33:  * Check that the nodes in a tree have the correct arguments
                     34:  * in order to be evaluated.  Basically the error checking here
                     35:  * frees the evaluation routines from worrying about anything
                     36:  * except dynamic errors, e.g. subscript out of range.
                     37:  */
                     38: 
                     39: public check(p)
                     40: register Node p;
                     41: {
                     42:     Node p1, p2;
                     43:     Address addr;
                     44:     Symbol f;
                     45: 
                     46:     checkref(p);
                     47:     switch (p->op) {
                     48:        case O_ASSIGN:
                     49:            p1 = p->value.arg[0];
                     50:            p2 = p->value.arg[1];
                     51:            if (varIsSet("$unsafeassign")) {
                     52:                if (size(p1->nodetype) != size(p2->nodetype)) {
                     53:                    error("incompatible sizes");
                     54:                }
                     55:            } else if (not compatible(p1->nodetype, p2->nodetype)) {
                     56:                error("incompatible types");
                     57:            }
                     58:            break;
                     59: 
                     60:        case O_CATCH:
                     61:        case O_IGNORE:
                     62:            if (p->value.lcon < 0 or p->value.lcon > NSIG) {
                     63:                error("invalid signal number");
                     64:            }
                     65:            break;
                     66: 
                     67:        case O_CONT:
                     68:            if (p->value.lcon != DEFSIG and (
                     69:                p->value.lcon < 0 or p->value.lcon > NSIG)
                     70:            ) {
                     71:                error("invalid signal number");
                     72:            }
                     73:            break;
                     74: 
                     75:        case O_DUMP:
                     76:            if (p->value.arg[0] != nil) {
                     77:                if (p->value.arg[0]->op == O_SYM) {
                     78:                    f = p->value.arg[0]->value.sym;
                     79:                    if (not isblock(f)) {
                     80:                        error("\"%s\" is not a block", symname(f));
                     81:                    }
                     82:                } else {
                     83:                    beginerrmsg();
                     84:                    fprintf(stderr, "expected a symbol, found \"");
                     85:                    prtree(stderr, p->value.arg[0]);
                     86:                    fprintf(stderr, "\"");
                     87:                    enderrmsg();
                     88:                }
                     89:            }
                     90:            break;
                     91: 
                     92:        case O_LIST:
                     93:            if (p->value.arg[0]->op == O_SYM) {
                     94:                f = p->value.arg[0]->value.sym;
                     95:                if (not isblock(f) or ismodule(f)) {
                     96:                    error("\"%s\" is not a procedure or function", symname(f));
                     97:                }
                     98:                addr = firstline(f);
                     99:                if (addr == NOADDR) {
                    100:                    error("\"%s\" is empty", symname(f));
                    101:                }
                    102:            }
                    103:            break;
                    104: 
                    105:        case O_TRACE:
                    106:        case O_TRACEI:
                    107:            chktrace(p);
                    108:            break;
                    109: 
                    110:        case O_STOP:
                    111:        case O_STOPI:
                    112:            chkstop(p);
                    113:            break;
                    114: 
                    115:        case O_CALLPROC:
                    116:        case O_CALL:
                    117:            if (not isroutine(p->value.arg[0]->nodetype)) {
                    118:                beginerrmsg();
                    119:                fprintf(stderr, "\"");
                    120:                prtree(stderr, p->value.arg[0]);
                    121:                fprintf(stderr, "\" not call-able");
                    122:                enderrmsg();
                    123:            }
                    124:            break;
                    125: 
                    126:        case O_WHEREIS:
                    127:            if (p->value.arg[0]->op == O_SYM and
                    128:              p->value.arg[0]->value.sym == nil) {
                    129:                error("symbol not defined");
                    130:            }
                    131:            break;
                    132: 
                    133:        default:
                    134:            break;
                    135:     }
                    136: }
                    137: 
                    138: /*
                    139:  * Check arguments to a trace command.
                    140:  */
                    141: 
                    142: private chktrace(p)
                    143: Node p;
                    144: {
                    145:     Node exp, place, cond;
                    146: 
                    147:     exp = p->value.arg[0];
                    148:     place = p->value.arg[1];
                    149:     cond = p->value.arg[2];
                    150:     if (exp == nil) {
                    151:        chkblock(place);
                    152:     } else if (exp->op == O_LCON or exp->op == O_QLINE) {
                    153:        if (place != nil) {
                    154:            error("unexpected \"at\" or \"in\"");
                    155:        }
                    156:        if (p->op == O_TRACE) {
                    157:            chkline(exp);
                    158:        } else {
                    159:            chkaddr(exp);
                    160:        }
                    161:     } else if (place != nil and (place->op == O_QLINE or place->op == O_LCON)) {
                    162:        if (p->op == O_TRACE) {
                    163:            chkline(place);
                    164:        } else {
                    165:            chkaddr(place);
                    166:        }
                    167:     } else {
                    168:        if (exp->op != O_RVAL and exp->op != O_SYM and exp->op != O_CALL) {
                    169:            error("can't trace expressions");
                    170:        }
                    171:        chkblock(place);
                    172:     }
                    173: }
                    174: 
                    175: /*
                    176:  * Check arguments to a stop command.
                    177:  */
                    178: 
                    179: private chkstop(p)
                    180: Node p;
                    181: {
                    182:     Node exp, place, cond;
                    183: 
                    184:     exp = p->value.arg[0];
                    185:     place = p->value.arg[1];
                    186:     cond = p->value.arg[2];
                    187:     if (exp != nil) {
                    188:        if (exp->op != O_RVAL and exp->op != O_SYM and exp->op != O_LCON) {
                    189:            beginerrmsg();
                    190:            fprintf(stderr, "expected variable, found ");
                    191:            prtree(stderr, exp);
                    192:            enderrmsg();
                    193:        }
                    194:        chkblock(place);
                    195:     } else if (place != nil) {
                    196:        if (place->op == O_SYM) {
                    197:            chkblock(place);
                    198:        } else {
                    199:            if (p->op == O_STOP) {
                    200:                chkline(place);
                    201:            } else {
                    202:                chkaddr(place);
                    203:            }
                    204:        }
                    205:     }
                    206: }
                    207: 
                    208: /*
                    209:  * Check to see that the given node specifies some subprogram.
                    210:  * Nil is ok since that means the entire program.
                    211:  */
                    212: 
                    213: private chkblock(b)
                    214: Node b;
                    215: {
                    216:     Symbol p, outer;
                    217: 
                    218:     if (b != nil) {
                    219:        if (b->op != O_SYM) {
                    220:            beginerrmsg();
                    221:            fprintf(stderr, "expected subprogram, found ");
                    222:            prtree(stderr, b);
                    223:            enderrmsg();
                    224:        } else if (ismodule(b->value.sym)) {
                    225:            outer = b->value.sym;
                    226:            while (outer != nil) {
                    227:                find(p, outer->name) where p->block == outer endfind(p);
                    228:                if (p == nil) {
                    229:                    outer = nil;
                    230:                    error("\"%s\" is not a subprogram", symname(b->value.sym));
                    231:                } else if (ismodule(p)) {
                    232:                    outer = p;
                    233:                } else {
                    234:                    outer = nil;
                    235:                    b->value.sym = p;
                    236:                }
                    237:            }
                    238:        } else if (
                    239:            b->value.sym->class == VAR and
                    240:            b->value.sym->name == b->value.sym->block->name and
                    241:            b->value.sym->block->class == FUNC
                    242:        ) {
                    243:            b->value.sym = b->value.sym->block;
                    244:        } else if (not isblock(b->value.sym)) {
                    245:            error("\"%s\" is not a subprogram", symname(b->value.sym));
                    246:        }
                    247:     }
                    248: }
                    249: 
                    250: /*
                    251:  * Check to make sure a node corresponds to a source line.
                    252:  */
                    253: 
                    254: private chkline(p)
                    255: Node p;
                    256: {
                    257:     if (p == nil) {
                    258:        error("missing line");
                    259:     } else if (p->op != O_QLINE and p->op != O_LCON) {
                    260:        error("expected source line number, found \"%t\"", p);
                    261:     }
                    262: }
                    263: 
                    264: /*
                    265:  * Check to make sure a node corresponds to an address.
                    266:  */
                    267: 
                    268: private chkaddr(p)
                    269: Node p;
                    270: {
                    271:     if (p == nil) {
                    272:        error("missing address");
                    273:     } else if (p->op != O_LCON and p->op != O_QLINE) {
                    274:        beginerrmsg();
                    275:        fprintf(stderr, "expected address, found \"");
                    276:        prtree(stderr, p);
                    277:        fprintf(stderr, "\"");
                    278:        enderrmsg();
                    279:     }
                    280: }

unix.superglobalmegacorp.com

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