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

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

unix.superglobalmegacorp.com

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