Annotation of researchv10no/cmd/adb/11v/mchframe.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * machine-dependent code for
                      3:  * looking in stack frames
                      4:  * vax version
                      5:  */
                      6: 
                      7: #include "defs.h"
                      8: #include "regs.h"
                      9: #include "sym.h"
                     10: #include "space.h"
                     11: 
                     12: int maxargs = 20;
                     13: 
                     14: /*
                     15:  * PDP-11 C stack frame
                     16:  */
                     17: 
                     18: #define        F_FP    0       /* link to next frame */
                     19: #define        F_PC    2       /* return pc */
                     20: 
                     21: #define        EVEN(x) ((x)&~1)
                     22: 
                     23: /*
                     24:  * return an address for a local variable
                     25:  * no register vars, unfortunately, as we can't provide an address
                     26:  * gn is the procedure; ln the local name
                     27:  */
                     28: 
                     29: localaddr(gn, ln)
                     30: char *gn, *ln;
                     31: {
                     32:        WORD fp;
                     33:        extern WORD expv;
                     34:        extern int expsp;
                     35:        ADDR laddr();
                     36: 
                     37:        if (gn) {
                     38:                if (findrtn(gn) == 0)
                     39:                        error("function not found");
                     40:        }
                     41:        else {
                     42:                findsym((WORD)atow(rget(PC)), INSTSP);
                     43:                if (cursym == NULL)
                     44:                        error("function not found");
                     45:        }
                     46:        if (findframe(&fp) == 0)
                     47:                error("stack frame not found");
                     48:        if (ln == NULL) {
                     49:                expsp = 0;
                     50:                expv = fp;
                     51:                return;
                     52:        }
                     53:        while (localsym()) {
                     54:                if (strcmp(ln, cursym->y_name) != 0)
                     55:                        continue;
                     56:                expv = laddr(cursym, fp);
                     57:                if (cursym->y_ltype == S_RSYM)
                     58:                        expsp = REGSP;
                     59:                else
                     60:                        expsp = NOSP;
                     61:                return;
                     62:        }
                     63:        error("bad local variable");
                     64:        /* NOTREACHED */
                     65: }
                     66: 
                     67: /*
                     68:  * print a stack traceback
                     69:  * give locals if possible
                     70:  */
                     71: 
                     72: ctrace(modif)
                     73: char modif;
                     74: {
                     75:        register ADDR fp, callpc;
                     76: 
                     77:        if (adrflg) {
                     78:                fp = EVEN(adrval);
                     79:                callpc = atow(aget(fp + F_PC, CORF|DATASP));
                     80:        } else {
                     81:                fp = (ADDR)EVEN(rtow(rget(R5)));
                     82:                callpc = (ADDR)rtow(rget(PC));
                     83:        }
                     84:        clrraddr();
                     85:        while (cntval--) {
                     86:                chkerr();
                     87:                findsym(callpc, INSTSP);
                     88:                if (cursym == NULL)
                     89:                        printf("?(");
                     90:                else
                     91:                        printf("%s(", cursym->y_name);
                     92:                /* args stuff */
                     93:                printf(") from %R\n", callpc);
                     94:                if (modif == 'C')
                     95:                        locals(fp);
                     96:                callpc = atow(aget(fp + F_PC, CORF|DATASP));
                     97:                setraddr(fp);
                     98:                fp = EVEN(atow(aget(fp + F_FP, CORF|DATASP)));
                     99:                if (fp == 0)
                    100:                        break;
                    101:        }
                    102:        clrraddr();
                    103: }
                    104: 
                    105: static
                    106: locals(fp)
                    107: ADDR fp;
                    108: {
                    109:        WORD val;
                    110:        register int sp;
                    111:        ADDR laddr();
                    112: 
                    113:        while (localsym()) {
                    114:                sp = CORF | DATASP;
                    115:                if (cursym->y_ltype == S_RSYM)
                    116:                        sp = CORF | REGSP;
                    117:                val = ltow(lget(laddr(cursym, fp), sp));
                    118:                if (errflg == 0)
                    119:                        printf("%8t%s/%10t%R\n", cursym->y_name, val);
                    120:                else {
                    121:                        printf("%8t%s/%10t?\n", cursym->y_name);
                    122:                        errflg = 0;
                    123:                }
                    124:        }
                    125: }
                    126: 
                    127: static ADDR
                    128: laddr(sp, fp)
                    129: struct sym *sp;
                    130: ADDR fp;
                    131: {
                    132: 
                    133:        switch (sp->y_ltype) {
                    134:        case S_STSYM:
                    135:                return (sp->y_value);
                    136: 
                    137:        case S_LSYM:
                    138:        case S_PSYM:
                    139:                return (fp + (short)sp->y_value);
                    140: 
                    141:        case S_RSYM:
                    142:                return (sp->y_value * SZREG);
                    143:        }
                    144:        error("bad local symbol");
                    145:        /* NOTREACHED */
                    146: }
                    147: 
                    148: static int
                    149: findframe(fpp)
                    150: ADDR *fpp;
                    151: {
                    152:        register ADDR fp, pc;
                    153:        register int fl;
                    154:        struct sym *svcur;
                    155: 
                    156:        svcur = cursym;
                    157:        fp = EVEN(rtow(rget(R5)));
                    158:        pc = rtow(rget(PC));
                    159:        if (errflg)
                    160:                return (0);
                    161:        clrraddr();
                    162:        for (;;) {
                    163:                findsym(pc, INSTSP);
                    164:                if (cursym == svcur)
                    165:                        break;
                    166:                setraddr(fp);
                    167:                pc = atow(aget(fp + F_PC, CORF|DATASP));
                    168:                fp = EVEN(atow(aget(fp + F_FP, CORF|DATASP)));
                    169:                if (errflg) {
                    170:                        clrraddr();
                    171:                        return (0);
                    172:                }
                    173:        }
                    174:        *fpp = fp;
                    175:        return (1);
                    176: }
                    177: 
                    178: /*
                    179:  * set addresses for saved registers for this frame
                    180:  */
                    181: 
                    182: static
                    183: setraddr(fp)
                    184: register ADDR fp;
                    185: {
                    186:        register int r;
                    187:        register int i;
                    188:        extern ADDR raddr[];
                    189: 
                    190:        /* all wrong */
                    191: }
                    192: 
                    193: static
                    194: clrraddr()
                    195: {
                    196:        register int i;
                    197:        extern ADDR raddr[];
                    198: 
                    199:        for (i = 0; i <= MAXREG - MINREG; i++)
                    200:                raddr[i] = 0;
                    201: }

unix.superglobalmegacorp.com

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