|
|
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.