|
|
1.1 root 1: static char sccsid[] = "@(#)var.c 2.10";
2:
3: #include "macdefs.h"
4: #include "cdb.h"
5:
6: export int vilvMax;
7: int vilvMac;
8: pTYR vrgTyLv; /* allocated at in InitSpc */
9:
10: #ifdef BSD41
11: #define SbCrock(x) ((int)x)
12: #else
13: #define SbCrock(x) x
14: #endif
15:
16: #ifndef M68000
17: TYR vrgTySpc[] = { /* array of register special variables */
18: #ifndef VAX
19: #ifndef TAHOE
20: {
21: SbCrock("$cBad"),stSpc, false, 0, btInt, 0,0,0,0,0,0,(ulong)&vcBadMax }
22: ,
23: #endif
24: #endif
25: {
26: SbCrock("$lang"), stSpc, false, 0, btInt,0,0,0,0,0,0,(ulong)&vlc }
27: ,
28: {
29: SbCrock("$signal"),stSpc, false, 0, btInt, 0,0,0,0,0,0, (ulong)&vsig }
30: ,
31: /* name,st,fConstant,unused,desc,value */
32: {
33: SbCrock("$r0"), stReg, false, 0, btInt, 0,0,0,0,0,0, u0 }
34: ,
35: {
36: SbCrock("$r1"), stReg, false, 0, btInt, 0,0,0,0,0,0, u1 }
37: ,
38: {
39: SbCrock("$r2"), stReg, false, 0, btInt, 0,0,0,0,0,0, u2 }
40: ,
41: {
42: SbCrock("$r3"), stReg, false, 0, btInt, 0,0,0,0,0,0, u3 }
43: ,
44: {
45: SbCrock("$r4"), stReg, false, 0, btInt, 0,0,0,0,0,0, u4 }
46: ,
47: {
48: SbCrock("$r5"), stReg, false, 0, btInt, 0,0,0,0,0,0, u5 }
49: ,
50: {
51: SbCrock("$r6"), stReg, false, 0, btInt, 0,0,0,0,0,0, u6 }
52: ,
53: {
54: SbCrock("$r7"), stReg, false, 0, btInt, 0,0,0,0,0,0, u7 }
55: ,
56: {
57: SbCrock("$r8"), stReg, false, 0, btInt, 0,0,0,0,0,0, u8 }
58: ,
59: {
60: SbCrock("$r9"), stReg, false, 0, btInt, 0,0,0,0,0,0, u9 }
61: ,
62: {
63: SbCrock("$r10"), stReg, false, 0, btInt, 0,0,0,0,0,0, u10 }
64: ,
65: {
66: SbCrock("$r11"), stReg, false, 0, btInt, 0,0,0,0,0,0, u11 }
67: ,
68: {
69: SbCrock("$r12"), stReg, false, 0, btInt, 0,0,0,0,0,0, u12 }
70: ,
71: #ifndef TAHOE
72: {
73: SbCrock("$r13"), stReg, false, 0, btInt, 0,0,0,0,0,0, u13 }
74: ,
75: #endif
76: #ifdef ONYX
77: {
78: SbCrock("$r14"), stReg, false, 0, btInt, 0,0,0,0,0,0, u14 }
79: ,
80: {
81: SbCrock("$r15"), stReg, false, 0, btInt, 0,0,0,0,0,0, u15 }
82: ,
83: {
84: SbCrock("$fcw"), stReg, false, 0, btInt, 0,0,0,0,0,0, ufcw }
85: ,
86: {
87: SbCrock("$long"), stReg, false, 0, btLong,0,0,0,0,0,0, u6 }
88: ,
89: {
90: SbCrock("$short"), stReg, false, 0, btShort,0,0,0,0,0,0,u7 }
91: ,
92: {
93: SbCrock("$result"),stReg, false, 0, btInt, 0,0,0,0,0,0, u7 }
94: ,
95: #endif
96: {
97: SbCrock("$fp"), stReg, false, 0, btInt, 0,0,0,0,0,0, ufp }
98: ,
99: {
100: SbCrock("$sp"), stReg, false, 0, btInt, 0,0,0,0,0,0, usp }
101: ,
102: {
103: SbCrock("$pc"), stReg, false, 0, btInt, 0,0,0,0,0,0, upc }
104: ,
105: #ifdef BSD41
106: #ifndef TAHOE
107: {
108: SbCrock("$ap"), stReg, false, 0, btInt, 0,0,0,0,0,0, uap }
109: ,
110: #endif
111: {
112: SbCrock("$long"), stReg, false, 0, btLong, 0,0,0,0,0,0,u0 }
113: ,
114: {
115: SbCrock("$short"), stReg, false, 0, btShort,0,0,0,0,0,0,u0 }
116: ,
117: {
118: SbCrock("$result"),stReg, false, 0, btInt, 0,0,0,0,0,0, u0 }
119: ,
120: /* following allows us to diddle certain internal variables */
121: #endif
122: };
123: #endif
124:
125: #ifdef M68000
126: TYR vrgTySpc[] = { /* array of register special variables */
127: /* the following allows us to diddle certain internal variables */
128: {
129: SbCrock("$lang"), stSpc,false, 0, 0,0,0,0,0,0,btInt,(ulong)&vlc }
130: ,
131: {
132: SbCrock("$cBad"),stSpc,false,0,0,0,0,0,0,0,btInt,(ulong)&vcBadMax }
133: ,
134: /* and now the registers */
135: {
136: SbCrock("$result"),stReg, false, 0, 0,0,0,0,0,0, btLong, ud0 }
137: ,
138: {
139: SbCrock("$long"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud0 }
140: ,
141: {
142: SbCrock("$short"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud0 }
143: ,
144: {
145: SbCrock("$a0"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua0 }
146: ,
147: {
148: SbCrock("$a1"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua1 }
149: ,
150: {
151: SbCrock("$a2"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua2 }
152: ,
153: {
154: SbCrock("$a3"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua3 }
155: ,
156: {
157: SbCrock("$a4"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua4 }
158: ,
159: {
160: SbCrock("$a5"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua5 }
161: ,
162: {
163: SbCrock("$a6"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua6 }
164: ,
165: {
166: SbCrock("$a7"), stReg, false, 0, 0,0,0,0,0,0, btLong, ua7 }
167: ,
168: {
169: SbCrock("$d0"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud0 }
170: ,
171: {
172: SbCrock("$d1"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud1 }
173: ,
174: {
175: SbCrock("$d2"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud2 }
176: ,
177: {
178: SbCrock("$d3"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud3 }
179: ,
180: {
181: SbCrock("$d4"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud4 }
182: ,
183: {
184: SbCrock("$d5"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud5 }
185: ,
186: {
187: SbCrock("$d6"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud6 }
188: ,
189: {
190: SbCrock("$d7"), stReg, false, 0, 0,0,0,0,0,0, btLong, ud7 }
191: ,
192: {
193: SbCrock("$fp"), stReg, false, 0, 0,0,0,0,0,0, btLong, ufp }
194: ,
195: {
196: SbCrock("$sp"), stReg, false, 0, 0,0,0,0,0,0, btLong, usp }
197: ,
198: {
199: SbCrock("$pc"), stReg, false, 0, 0,0,0,0,0,0, btLong, upc }
200: ,
201: {
202: SbCrock("$ps"), stReg, false, 0, 0,0,0,0,0,0, btLong, ups }
203: ,
204: };
205: #endif
206: int vispcMac = sizeof(vrgTySpc) / cbTYR;
207:
208:
209: /* I N I T S P C */
210:
211: export void InitSpc()
212: {
213: int i;
214: TYR aty;
215:
216: vrgTyLv = (pTYR) malloc((vilvMax+1)*cbTYR); /* KLUDGE!! */
217: vcbTot += vilvMax * cbTYR;
218: aty = *vtyLong; /* they are all basically long */
219: aty.td.st = stSpc;
220: for (i=0; i< vilvMax; i++)
221: CopyTy(vrgTyLv+i, &aty); /* init various fields in the specials */
222: #ifdef BSD41
223: /* this crock is due to string space/pointer problem */
224: for (i=0; i < vispcMac; i++)
225: vrgTySpc[i].sbVar |= bitHigh;
226: #endif
227: } /* InitSpc */
228:
229:
230: /* F A D R F S P E C I A L */
231:
232: export FLAGT FAdrFSpecial(sbSpc, rgTy, padr)
233: char *sbSpc;
234: TYR rgTy[];
235: pADRT padr;
236: {
237: int i;
238:
239: /* first check the predefined specials */
240: for (i=0; i < vispcMac; i++) {
241: if (FSbCmp(SbInCore(vrgTySpc[i].sbVar), sbSpc)) {
242: CopyTy(rgTy, vrgTySpc+i);
243: *padr = vrgTySpc[i].valTy;
244: return(true);
245: } /* if */
246: } /* for */
247:
248: /* next check the user defined specials */
249: for (i=0; i < vilvMac; i++) {
250: if (FSbCmp(SbInCore(vrgTyLv[i].sbVar), sbSpc)) {
251: CopyTy(rgTy, vrgTyLv+i);
252: *padr = (ADRT) &(vrgTyLv[i].valTy);
253: return(true);
254: } /* if */
255: } /* for */
256:
257: /* no luck = try to define a new special with this name */
258: if (vilvMac >= vilvMax)
259: UError("No room to define local - %s", sbSpc);
260: i = vilvMac++;
261: #ifdef SYSIII
262: strncpy(vrgTyLv[i].sbVar, sbSpc, cbVarMax);
263: #endif
264: #ifdef BSD41
265: vrgTyLv[i].sbVar = (int) malloc(strlen(sbSpc)+2);
266: strcpy(vrgTyLv[i].sbVar, sbSpc);
267: vrgTyLv[i].sbVar |= bitHigh;
268: #endif
269:
270: CopyTy(rgTy, vrgTyLv+i);
271: *padr = (ADRT) &(vrgTyLv[i].valTy);
272: return(true);
273: } /* FAdrFSpecial */
274:
275:
276: /* A D R F L O C A L */
277:
278: export ADRT AdrFLocal(ipd, cnt, sbVar, rgTy)
279: int ipd, cnt;
280: char *sbVar;
281: TYR rgTy[];
282: {
283: ADRT fp, ap;
284: ADRT adr;
285:
286: FpApFIpd(&fp, &ap, ipd, cnt);
287: if (fp == 0)
288: return(adrNil);
289:
290: SetNext(vrgPd[ipd].isym+1);
291: if (!FNextLocal(true, true, sbVar)) {
292: return(adrNil);
293: } /* if */
294:
295: #ifdef SYSIII
296: if ((vsymCur->type == N_ABS) AND (vsymCur->value == 1))
297: UError("Compiler wart involving register parameters - sorry");
298: #endif
299: adr = vsymCur->value;
300: TyFLocal(rgTy, sbVar, visym);
301:
302: #ifdef BSD41
303: if (vsymCur->type == stParam)
304: adr = ap + adr;
305: else if (vsymCur->type == stLocal)
306: adr = fp - abs(adr);
307: #endif
308: #ifdef SYSIII
309: adr += fp;
310: #endif
311: /* things of type stReg do NOT get modified - may want to do look up
312: * some day, but this is almost impossible on ONYX
313: */
314: return(adr);
315: } /* AdrFLocal */
316:
317:
318: /* A D R F G L O B A L */
319:
320: export ADRT AdrFGlobal(sbVar, rgTy)
321: char *sbVar;
322: TYR rgTy[];
323: {
324: ADRT adrRet;
325: char sbTemp[cbVarMax+3];
326:
327: adrRet = adrNil;
328: /* first we check for `_foo' */
329: sbTemp[0] = '_';
330: strcpy((sbTemp+1), sbVar);
331: sbTemp[cbVarMax] = chNull;
332: SetNext(visymGlobal);
333: if (FNextSym(N_DATA, N_BSS, 0, sbTemp, FProcCmp)) {
334: adrRet = vsymCur->value;
335: }
336: else {
337: /* no luck, try just plain `foo' */
338: sbVar[cbVarMax] = chNull;
339: SetNext(visymGlobal);
340: if (FNextSym(N_DATA, N_BSS, 0, sbVar, FProcCmp)) {
341: adrRet = vsymCur->value;
342: } /* if */
343: } /* if */
344: if (adrRet != adrNil)
345: TyFGlobal(rgTy, sbVar);
346: return(adrRet);
347: } /* AdrFGlobal */
348:
349:
350: /* A D R F L A B E L */
351:
352: export ADRT AdrFLabel(sbVar)
353: char *sbVar;
354: {
355: char sbTemp[cbVarMax+2];
356:
357: /* first we check for `_foo' */
358: sbTemp[0] = '_';
359: strcpy((sbTemp+1), sbVar);
360: sbTemp[cbVarMax] = chNull;
361: SetNext(visymGlobal);
362: if (FNextSym(N_TEXT, 0, 0, sbTemp, FProcCmp)) {
363: return(vsymCur->value);
364: }
365: else {
366: /* no luck, try just plain `foo' */
367: sbVar[cbVarMax] = chNull;
368: SetNext(visymGlobal);
369: if (FNextSym(N_TEXT, 0, 0, sbVar, FProcCmp))
370: return(vsymCur->value);
371: } /* if */
372: return(adrNil);
373: } /* AdrFLabel */
374:
375:
376: /* C B F L O C A L */
377:
378: export int CbFLocal(isym)
379: long isym;
380: {
381: #ifdef BSD41
382: SYMR rgSym[2];
383:
384: SetSym(isym);
385: rgSym[0] = *vsymCur;
386: SetSym(isym+1); /* second one might not be in core */
387: rgSym[1] = *vsymCur;
388: return(CbFTy(rgSym)); /* sort of a hack, but it IS correct */
389: #endif
390: #ifdef SYSIII
391: int cb, val;
392: long isymSave;
393:
394: /* boy is this section MACHINE DEPENDENT !! */
395: isymSave = isym;
396: SetSym(isym);
397: val = vsymCur->value;
398: if (FOdd(val))
399: cb = 1; /* this assumes that only one byte entities have odd adresses */
400: else if (val > 0) {
401: /* it's a parameter */
402: do {
403: SetSym(++isym); /* we need to look at the next one */
404: }
405: while (vsymCur->type == N_REG);
406: if ((vsymCur->type != N_ABS) OR ((int) (vsymCur->value) < 0))
407: /* this means we don't know size of last param. kludge! */
408: cb = CBINT;
409: else cb = vsymCur->value - val;
410: }
411: else {
412: /* it's a local */
413: SetSym(isym-1); /* we need to look at the previous one */
414: if ((vsymCur->type != N_ABS) OR ((int) (vsymCur->value) >= 0))
415: #ifdef REGULUS
416: cb = 0 - val;
417: #else
418: cb = -12 - val;
419: #endif
420: else cb = vsymCur->value - val;
421: } /* if */
422:
423: SetSym(isymSave);
424: return(cb);
425: #endif
426: } /* CbFLocal */
427:
428:
429: /* F P A P F I P D */
430:
431: export void FpApFIpd(pfp, pap, ipd, cnt)
432: pADRT pfp, pap;
433: int ipd, cnt;
434: {
435: int depth, ipdX;
436: ADRT pc;
437: FLAGT fDontCare;
438:
439: if (fDontCare = (cnt == -1))
440: cnt = 10000;
441:
442: depth = 0;
443: *pfp = vfp;
444: *pap = vap;
445: pc = vpc;
446: while (*pfp != 0) {
447: ipdX = IpdFAdr(pc);
448: if (ipdX == ipd) {
449: if ((fDontCare) OR (cnt == depth))
450: return;
451: } /* if */
452: if (cnt < depth)
453: UError("Procedure '%s' is not at that stack depth",
454: vrgPd[ipd].sbProc);
455: depth++;
456: NextFrame(pfp, pap, &pc);
457: } /* for */
458: return;
459: } /* FpApFIpd */
460:
461:
462: /* N E X T F R A M E */
463:
464: export void NextFrame(pfp, pap, ppc)
465: ADRT *pfp, *pap, *ppc;
466: {
467: /* we either give them the vbalues for the next frame
468: * OR we give them a new fp of 0
469: */
470: #ifdef ONYX
471: *ppc = GetWord(*pfp+CBINT, spaceData);
472: *pfp = GetWord(*pfp, spaceData);
473: *pap = *pfp; /* they are the same for most non-vax systems */
474: #endif
475: #ifdef M68000
476: #ifndef SUN
477: *ppc = GetWord(*pfp+CBLONG, spaceData);
478: *pfp = GetWord(*pfp, spaceData);
479: *pap = *pfp; /* they are the same for most non-vax systems */
480: #endif
481: #endif
482: #ifdef BSD41
483: #ifdef SUN
484: *ppc = GetWord(*pfp+CBLONG, spaceData);
485: *pfp = GetWord(*pfp, spaceData);
486: *pap = *pfp; /* they are the same for most non-vax systems */
487: #endif
488:
489: #ifdef TAHOE
490: *ppc = GetWord(*pfp-8, spaceData);
491: *pap = GetWord(*pfp, spaceData);
492: *pfp = GetWord(*pfp, spaceData) ; /* force to even byte */
493: #endif
494:
495: #ifdef VAX
496: *ppc = GetWord(*pfp+16, spaceData);
497: *pap = GetWord(*pfp+8, spaceData);
498: *pfp = GetWord(*pfp+12, spaceData) & ~1; /* force to even byte */
499: if (*ppc > 0x70000000) {
500: /* it looks like we have some error handler magic here */
501: *ppc = GetWord(*pfp+64, spaceData) - 1; /* back up pc by 1 */
502: *pap = GetWord(*pfp+8, spaceData);
503: *pfp = GetWord(*pfp+12, spaceData) & ~1; /* force to even byte */
504: }
505: #endif
506: if (*pfp & 0xf0000000 != 0x70000000)
507: Panic("Non-kosher frame pointer");
508: /* see if this is the 'start' frame */
509: if (vrgFd[0].adrStart > *ppc) {
510: *pfp = 0;
511: } /* if */
512: if ((vfPascal)
513: AND (*ppc > vadrMain)
514: AND (*ppc < vadrStart)) {
515: *pfp = 0; /* this is pascal's version of the start code */
516: }
517: #endif
518: } /* NextFrame */
519:
520:
521: /* D I S P F R A M E */
522:
523: export void DispFrame(pc, ipd, fp, ap, cnt, fDoLocals, fDoVal)
524: ADRT pc;
525: int ipd, cnt;
526: ADRT fp, ap;
527: FLAGT fDoLocals, fDoVal;
528: {
529: int ifd, ln, slop, i;
530: char sbName[50];
531: long val, isymSave, isym, adrLong;
532: TYR rgTy[cTyMax];
533:
534: printf("%s(", vrgPd[ipd].sbProc);
535: SetNext(vrgPd[ipd].isym+1);
536: i = 0;
537: while (FNextLocal(false, true, sbNil)) {
538: isymSave = visym;
539: val = vsymCur->value;
540: TyFLocal(rgTy, SbInCore(vsymCur->sbSym+vcbVarHdr), visym);
541: if (i++)
542: printf(", ");
543: if (fDoVal) {
544: #ifdef BSD41
545: printf("%s=", SbInCore(rgTy[0].sbVar));
546: #else
547: printf("%.8s=", SbInCore(rgTy[0].sbVar));
548: #endif
549: adrLong = val + ap;
550: DispVal(adrLong, rgTy, modeNil, false, true, false);
551: }
552: else {
553: /* they just want to know what the args are */
554: PxTy(rgTy);
555: } /* if */
556: visym = isymSave;
557: } /* while */
558: printf(")");
559: if (pc != adrNil) {
560: isymSave = visym;
561: isym = vrgPd[ipd].isym;
562: IfdLnFAdr(pc, isym, &ifd, &ln, &slop);
563: printf(" [%s:%d]", vrgFd[ifd].sbFile, ln);
564: visym = isymSave;
565: } /* if */
566: if (fDoLocals) {
567: SetNext(visym);
568: vcNest++; /* in case we have structure to indent */
569: while (FNextLocal(true, false, sbNil)) {
570: strcpy(sbName, SbInCore(vsymCur->sbSym+vcbVarHdr));
571: isym = visym;
572: adrLong = AdrFLocal(ipd, cnt, sbName, rgTy);
573: printf("\n ");
574: DispVal(adrLong, rgTy, modeNil, true, true, true);
575: SetSym(isym);
576: } /* while */
577: vcNest--;
578: } /* if */
579: printf("\n");
580: } /* DispFrame */
581:
582:
583: /* D I S P U N K N O W N */
584:
585: export void DispUnknown(pc, fp, ap)
586: ADRT pc, fp, ap;
587: {
588: int i;
589: #ifdef TAHOE
590: int real_no_args;
591: #endif
592:
593: LabelFAdr(pc); /* sets vsymCur to nearest label */
594: printf("%s", SbInCore(vsymCur->sbSym));
595: if (vsymCur->value != pc)
596: printf("+%s",SbFAdr(lengthen(pc-vsymCur->value), true));
597: /* we print what LOOK like the first N parameters */
598: printf("(");
599: #ifdef ONYX
600: ap += 4;
601: #endif
602: #ifdef TAHOE
603: real_no_args = ( (GetWord(fp-4, spaceData) & 0xffff) -4) /4;
604: #endif
605: #ifdef VAX
606: ap += 4;
607: #endif
608: #ifdef M68000
609: ap += 4;
610: #endif
611: #define cArgsMax 5
612:
613: #ifdef TAHOE
614: for (i=0; i<real_no_args; i++) {
615: #else
616: for (i=0; i<cArgsMax; i++) {
617: #endif
618: printf("%d%s", GetWord(ap, spaceData), (i<cArgsMax-1) ? ", " : "");
619: ap += CBINT;
620: }
621: printf(")\n");
622: } /* DispUnknown */
623:
624:
625: /* S T A C K T R A C E */
626:
627: export void StackTrace(cnt, fDoLocals)
628: int cnt;
629: FLAGT fDoLocals;
630: {
631: int ipd, i;
632: ADRT pc, fp, ap;
633:
634: fp = vfp;
635: pc = vpc;
636: ap = vap;
637: for (i=0; ((i < cnt) AND (fp != 0)); i++) {
638: ipd = IpdFAdr(pc);
639: if (ipd == ipdNil) {
640: printf("%2d ", i);
641: DispUnknown(pc, fp, ap);
642: }
643: else {
644: printf("%2d ", i);
645: DispFrame(pc, ipd, fp, ap, i, fDoLocals, true);
646: } /* if */
647: NextFrame(&fp, &ap, &pc);
648: } /* for */
649: } /* StackTrace */
650:
651:
652: /* L I S T R E G S */
653:
654: export void ListRegs(sbRegs)
655: char *sbRegs;
656: {
657: int i;
658: long adr;
659: TYR ty;
660:
661: /* first check the predefined specials */
662: for (i=0; i < vispcMac; i++) {
663: if ((vrgTySpc[i].td.st != stReg)
664: OR (sbRegs != sbNil)
665: AND (!FHdrCmp(sbRegs, SbInCore(vrgTySpc[i].sbVar))))
666: continue; /* not interesting */
667: ty = vrgTySpc[i];
668: adr = vrgTySpc[i].valTy;
669: DispVal(adr, &ty, modeNil, true, true, true);
670: printf("\n");
671: } /* for */
672: } /* ListRegs */
673:
674:
675: /* L I S T S P E C I A L */
676:
677: export void ListSpecial(sbSpecial)
678: char *sbSpecial;
679: {
680: int i;
681: long adr;
682: TYR ty;
683:
684: /* first check the predefined specials */
685: for (i=0; i < vispcMac; i++) {
686: if ((vrgTySpc[i].td.st == stReg)
687: OR (sbSpecial != sbNil)
688: AND (!FHdrCmp(sbSpecial, SbInCore(vrgTySpc[i].sbVar))))
689: continue; /* not interesting */
690: ty = vrgTySpc[i];
691: adr = vrgTySpc[i].valTy;
692: DispVal(adr, &ty, modeNil, true, true, true);
693: printf("\n");
694: } /* for */
695:
696: /* next do user defined stuff */
697: for (i=0; i<vilvMac ; i++) {
698: if ((sbSpecial != sbNil)
699: AND (!FHdrCmp(sbSpecial, SbInCore(vrgTyLv[i].sbVar))))
700: continue; /* not interesting */
701: adr = (long) &(vrgTyLv[i].valTy);
702: DispVal(adr, vrgTyLv+i, modeNil, true, true, true);
703: printf("\n");
704: } /* for */
705: } /* ListSpecial */
706:
707:
708: /* L A B E L F A D R */
709:
710: export void LabelFAdr(adr)
711: ADRT adr;
712: {
713: long isymNearest;
714: ADRT adrLabel, adrNearest;
715: /* returns isym of nearest TEXT Label <= adr */
716:
717: adrNearest = 0;
718: SetNext(visymGlobal);
719: while (FNextSym(N_TEXT, 0, 0, sbNil, nil)) {
720: if ((vsymCur->type & N_EXT) == 0)
721: continue;
722: adrLabel = vsymCur->value;
723: if ( (adrLabel <= adr)
724: AND (adrLabel >= adrNearest) ) {
725: isymNearest = visym;
726: adrNearest = adrLabel;
727: } /* if */
728: } /* while */
729: SetSym(isymNearest);
730: } /* LabelFAdr */
731:
732:
733: /* O P E N S T A C K */
734:
735: export void OpenStack(cnt)
736: int cnt;
737: {
738: int cntIn;
739: ADRT pc, fp, ap;
740:
741: cntIn = cnt;
742: fp = vfp;
743: ap = vap;
744: pc = vpc;
745: while (cnt-- AND fp)
746: NextFrame(&fp, &ap, &pc);
747: if (fp == 0)
748: UError("Stack isn't that deep!");
749:
750: #ifdef VAX
751: if (cntIn != 0)
752: pc -= 1;
753: #endif
754: PrintPos(pc, fmtFile+fmtProc+fmtLn+fmtPrint);
755: } /* OpenStack */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.