|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.