Annotation of researchv10no/cmd/adb/cray/mchframe.c, revision 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.