|
|
1.1 root 1: #ifndef lint
2: static char *sccsid ="@(#)stab.c 1.12 (Berkeley) 3/27/86";
3: #endif
4: /*
5: * Symbolic debugging info interface.
6: *
7: * Here we generate pseudo-ops that cause the assembler to put
8: * symbolic debugging information into the object file.
9: */
10:
11: #include "pass1.h"
12:
13: #include <sys/types.h>
14: #include <a.out.h>
15: #include <stab.h>
16:
17: #define private static
18: #define and &&
19: #define or ||
20: #define not !
21: #define div /
22: #define mod %
23: #define nil 0
24:
25: #define bytes(bits) ((bits) / SZCHAR)
26: #define bsize(p) bytes(dimtab[p->sizoff]) /* size in bytes of a symbol */
27:
28: #define NILINDEX -1
29: #define FORWARD -2
30:
31: typedef int Boolean;
32:
33: #define false 0
34: #define true 1
35:
36: extern int ddebug;
37: extern int gdebug;
38: extern char *malloc();
39:
40: int stabLCSYM;
41:
42: /*
43: * Flag for producing either sdb or dbx symbol information.
44: */
45: int oldway = false;
46:
47: /*
48: * Generate debugging info for a parameter.
49: * The offset isn't known when it is first entered into the symbol table
50: * since the types are read later.
51: */
52:
53: fixarg(p)
54: struct symtab *p;
55: {
56: if (oldway) {
57: old_fixarg(p);
58: } else if (gdebug) {
59: printf("\t.stabs\t\"%s:p", p->sname);
60: gentype(p);
61: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
62: }
63: }
64:
65: /*
66: * Determine if the given symbol is a global array with dimension 0,
67: * which only makes sense if it's dimension is to be given later.
68: * We therefore currently do not generate symbol information for
69: * such entries.
70: */
71:
72: #define isglobal(class) ( \
73: class == EXTDEF or class == EXTERN or class == STATIC \
74: )
75:
76: private Boolean zero_length_array(p)
77: register struct symtab *p;
78: {
79: Boolean b;
80: int t;
81:
82: if (not isglobal(p->sclass)) {
83: b = false;
84: } else {
85: t = p->stype;
86: if (ISFTN(t)) {
87: t = DECREF(t);
88: }
89: b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0);
90: }
91: return b;
92: }
93:
94: /*
95: * Generate debugging info for a given symbol.
96: */
97:
98: outstab(sym)
99: struct symtab *sym;
100: {
101: register struct symtab *p;
102: char *classname;
103: int offset;
104: Boolean ignore;
105: static Boolean firsttime = true;
106:
107: if (oldway) {
108: old_outstab(sym);
109: } else if (gdebug and not zero_length_array(sym)) {
110: if (firsttime) {
111: firsttime = false;
112: inittypes();
113: }
114: ignore = false;
115: p = sym;
116: offset = bytes(p->offset);
117: switch (p->sclass) {
118: case REGISTER:
119: classname = "r";
120: offset = p->offset;
121: break;
122:
123: /*
124: * Locals are the default class.
125: */
126: case AUTO:
127: classname = "";
128: break;
129:
130: case STATIC:
131: if (ISFTN(p->stype)) {
132: ignore = true;
133: } else if (p->slevel <= 1) {
134: classname = "S";
135: } else {
136: classname = "V";
137: }
138: break;
139:
140: case EXTDEF:
141: case EXTERN:
142: if (ISFTN(p->stype)) {
143: ignore = true;
144: } else {
145: classname = "G";
146: }
147: break;
148:
149: case TYPEDEF:
150: classname = "t";
151: break;
152:
153: case PARAM:
154: case MOS:
155: case MOU:
156: case MOE:
157: ignore = true;
158: break;
159:
160: case ENAME:
161: case UNAME:
162: case STNAME:
163: entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
164: ignore = true;
165: break;
166:
167: default:
168: if ((p->sclass&FIELD) == 0) {
169: printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
170: }
171: ignore = true;
172: break;
173: }
174: if (not ignore) {
175: printf("\t.stabs\t\"%s:%s", p->sname, classname);
176: gentype(p);
177: geninfo(p);
178: }
179: }
180: }
181:
182: /*
183: * Since type names are lost in the travels and because C has
184: * structural type equivalence we keep a table of type words that
185: * we've already seen. The first time we see a type, it is assigned
186: * (inline) a number and future references just list that number.
187: * Structures, unions, enums, and arrays must be handled carefully
188: * since not all the necessary information is in the type word.
189: */
190:
191: typedef struct Typeid *Typeid;
192:
193: struct Typeid {
194: TWORD tword;
195: int tarray;
196: int tstruct;
197: int tstrtag;
198: int tnum;
199: Typeid chain;
200: };
201:
202: #define TABLESIZE 2003
203:
204: private int tcount = 1;
205: private int t_int, t_char;
206: private Typeid typetable[TABLESIZE];
207:
208: /*
209: * Look for the given type word in the type table.
210: */
211:
212: private Typeid typelookup(type, arrindex, strindex, strtag)
213: TWORD type;
214: int arrindex;
215: int strindex;
216: int strtag;
217: {
218: register TWORD tword;
219: register int i1, i2;
220: Typeid t;
221:
222: t = typetable[type mod TABLESIZE];
223: while (t != nil) {
224: if (t->tword == type and
225: strindex == t->tstruct and strtag == t->tstrtag) {
226: if (arrindex == NILINDEX) {
227: break;
228: } else {
229: tword = type;
230: i1 = arrindex;
231: i2 = t->tarray;
232: while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
233: ++i1;
234: ++i2;
235: tword >>= TSHIFT;
236: }
237: if (!ISARY(tword)) {
238: break;
239: }
240: }
241: }
242: t = t->chain;
243: }
244: return t;
245: }
246:
247: /*
248: * Enter a type word and associated symtab indices into the type table.
249: */
250:
251: private int entertype(type, arrindex, strindex, strtag)
252: TWORD type;
253: int arrindex;
254: int strindex;
255: int strtag;
256: {
257: register Typeid t;
258: register int i;
259:
260: t = (Typeid) malloc(sizeof(struct Typeid));
261: t->tword = type;
262: t->tarray = arrindex;
263: t->tstruct = strindex;
264: t->tstrtag = strtag;
265: t->tnum = tcount;
266: ++tcount;
267: i = type mod TABLESIZE;
268: t->chain = typetable[i];
269: typetable[i] = t;
270: return t->tnum;
271: }
272:
273: /*
274: * Change the information associated with a type table entry.
275: * Since I'm lazy this just creates a new entry with the number
276: * as the old one.
277: */
278:
279: private reentertype(typeid, type, arrindex, strindex, strtag)
280: Typeid typeid;
281: TWORD type;
282: int arrindex;
283: int strindex;
284: int strtag;
285: {
286: register Typeid t;
287: register int i;
288:
289: t = (Typeid) malloc(sizeof(struct Typeid));
290: t->tword = type;
291: t->tarray = arrindex;
292: t->tstruct = strindex;
293: t->tstrtag = strtag;
294: t->tnum = typeid->tnum;
295: i = type mod TABLESIZE;
296: t->chain = typetable[i];
297: typetable[i] = t;
298: }
299:
300: /*
301: * Initialize type table with predefined types.
302: */
303:
304: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
305:
306: private inittypes()
307: {
308: int t;
309:
310: t_int = builtintype(INT);
311: t_char = builtintype(CHAR);
312: maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
313: maketype("char", t_char, t_char, 0L, 127L);
314: maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
315: maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
316: maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
317: maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
318: maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
319: maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
320: maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
321: maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
322: t = builtintype(UNDEF);
323: printf("\t.stabs\t\"void:t%d=%d", t, t);
324: geninfo(nil);
325: t = builtintype(FARG);
326: printf("\t.stabs\t\"???:t%d=%d", t, t_int);
327: geninfo(nil);
328: }
329:
330: /*
331: * Generate info for a new range type.
332: */
333:
334: private maketype(name, tnum, eqtnum, lower, upper)
335: char *name;
336: int tnum, eqtnum;
337: long lower, upper;
338: {
339: printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
340: geninfo(nil);
341: }
342:
343: /*
344: * Generate debugging information for the given type of the given symbol.
345: */
346:
347: private gentype(sym)
348: struct symtab *sym;
349: {
350: register struct symtab *p;
351: register TWORD t;
352: register TWORD basictype;
353: register Typeid typeid;
354: int i, arrindex, strindex, strtag;
355:
356: p = sym;
357: t = p->stype;
358: if (ISFTN(t)) {
359: t = DECREF(t);
360: }
361: basictype = BTYPE(t);
362: if (ISARY(t)) {
363: arrindex = p->dimoff;
364: } else {
365: arrindex = NILINDEX;
366: }
367: if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
368: strindex = dimtab[p->sizoff + 1];
369: if (strindex == -1) {
370: strindex = FORWARD;
371: strtag = dimtab[p->sizoff + 3];
372: } else {
373: strtag = NILINDEX;
374: }
375: } else {
376: strindex = NILINDEX;
377: strtag = NILINDEX;
378: }
379: i = arrindex;
380: typeid = typelookup(t, arrindex, strindex, strtag);
381: while (t != basictype and typeid == nil) {
382: printf("%d=", entertype(t, i, strindex, strtag));
383: switch (t&TMASK) {
384: case PTR:
385: printf("*");
386: break;
387:
388: case FTN:
389: printf("f");
390: break;
391:
392: case ARY:
393: printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
394: break;
395: }
396: t = DECREF(t);
397: if (i == NILINDEX && ISARY(t)) {
398: i = p->dimoff;
399: }
400: if (t == basictype) {
401: typeid = typelookup(t, NILINDEX, strindex, strtag);
402: } else {
403: typeid = typelookup(t, i, strindex, strtag);
404: }
405: }
406: if (typeid == nil) {
407: if (strindex == FORWARD) {
408: typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
409: if (typeid == nil) {
410: cerror("unbelievable forward reference");
411: }
412: printf("%d", typeid->tnum);
413: } else {
414: genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
415: }
416: } else {
417: printf("%d", typeid->tnum);
418: }
419: }
420:
421: /*
422: * Generate type information for structures, unions, and enumerations.
423: */
424:
425: private genstruct(t, structid, index, name, size)
426: TWORD t;
427: int structid;
428: int index;
429: char *name;
430: int size;
431: {
432: register int i;
433: register struct symtab *field;
434: int id;
435:
436: if (structid == NILINDEX) {
437: id = entertype(t, NILINDEX, index, NILINDEX);
438: } else {
439: id = structid;
440: }
441: switch (t) {
442: case STRTY:
443: case UNIONTY:
444: printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
445: i = index;
446: while (dimtab[i] != -1) {
447: field = &stab[dimtab[i]];
448: printf("%s:", field->sname);
449: gentype(field);
450: if (field->sclass > FIELD) {
451: printf(",%d,%d;", field->offset, field->sclass - FIELD);
452: } else {
453: printf(",%d,%d;", field->offset,
454: tsize(field->stype, field->dimoff, field->sizoff));
455: }
456: ++i;
457: }
458: putchar(';');
459: break;
460:
461: case ENUMTY:
462: printf("%d=e", id);
463: i = index;
464: while (dimtab[i] != -1) {
465: field = &stab[dimtab[i]];
466: printf("%s:%d,", field->sname, field->offset);
467: i++;
468: }
469: putchar(';');
470: break;
471:
472: default:
473: cerror("couldn't find basic type %d for %s\n", t, name);
474: break;
475: }
476: }
477:
478: /*
479: * Generate offset and size info.
480: */
481:
482: private geninfo(p)
483: register struct symtab *p;
484: {
485: int stabtype;
486:
487: if (p == nil) {
488: printf("\",0x%x,0,0,0\n", N_LSYM);
489: } else {
490: switch (p->sclass) {
491: case EXTERN:
492: case EXTDEF:
493: if (ISFTN(p->stype)) {
494: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
495: } else {
496: printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p));
497: }
498: break;
499:
500: case STATIC:
501: stabtype = stabLCSYM ? N_LCSYM : N_STSYM;
502: if (ISFTN(p->stype)) {
503: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
504: } else if (p->slevel > 1) {
505: printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset);
506: } else {
507: printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname);
508: }
509: break;
510:
511: case REGISTER:
512: printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
513: break;
514:
515: case PARAM:
516: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
517: break;
518:
519: default:
520: printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
521: break;
522: }
523: }
524: }
525:
526: /*
527: * Generate information for a newly-defined structure.
528: */
529:
530: outstruct(szindex, paramindex)
531: int szindex, paramindex;
532: {
533: register Typeid typeid;
534: register struct symtab *p;
535: register int i, t, strindex;
536:
537: if (oldway) {
538: /* do nothing */;
539: } else if (gdebug) {
540: i = dimtab[szindex + 3];
541: p = &stab[i];
542: if (p->sname != nil) {
543: strindex = dimtab[p->sizoff + 1];
544: typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
545: if (typeid == nil) {
546: t = 0;
547: } else {
548: t = typeid->tnum;
549: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
550: }
551: printf("\t.stabs\t\"%s:T", p->sname);
552: genstruct(p->stype, t, strindex, p->sname, bsize(p));
553: geninfo(p);
554: }
555: }
556: }
557:
558: pstab(name, type)
559: char *name;
560: int type;
561: {
562: register int i;
563: register char c;
564:
565: if (!gdebug) {
566: return;
567: } else if (oldway) {
568: old_pstab(name, type);
569: return;
570: }
571: /* locctr(PROG); /* .stabs must appear in .text for c2 */
572: #ifdef ASSTRINGS
573: if ( name[0] == '\0')
574: printf("\t.stabn\t");
575: else
576: #ifndef FLEXNAMES
577: printf("\t.stabs\t\"%.8s\",", name);
578: #else
579: printf("\t.stabs\t\"%s\",", name);
580: #endif
581: #else
582: printf(" .stab ");
583: for(i=0; i<8; i++)
584: if (c = name[i]) printf("'%c,", c);
585: else printf("0,");
586: #endif
587: printf("0%o,", type);
588: }
589:
590: #ifdef STABDOT
591: pstabdot(type, value)
592: int type;
593: int value;
594: {
595: if ( ! gdebug) {
596: return;
597: } else if (oldway) {
598: old_pstabdot(type, value);
599: return;
600: }
601: /* locctr(PROG); /* .stabs must appear in .text for c2 */
602: printf("\t.stabd\t");
603: printf("0%o,0,0%o\n",type, value);
604: }
605: #endif
606:
607: extern char NULLNAME[8];
608: extern int labelno;
609: extern int fdefflag;
610:
611: psline()
612: {
613: static int lastlineno;
614: register char *cp, *cq;
615: register int i;
616:
617: if (!gdebug) {
618: return;
619: } else if (oldway) {
620: old_psline();
621: return;
622: }
623:
624: cq = ititle;
625: cp = ftitle;
626:
627: while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
628: if ( *cp == '\0' ) goto eq;
629:
630: neq: for (i=0; i<100; i++)
631: ititle[i] = '\0';
632: cp = ftitle;
633: cq = ititle;
634: while ( *cp )
635: *cq++ = *cp++;
636: *cq = '\0';
637: *--cq = '\0';
638: #ifndef FLEXNAMES
639: for ( cp = ititle+1; *(cp-1); cp += 8 ) {
640: pstab(cp, N_SOL);
641: if (gdebug) printf("0,0,LL%d\n", labelno);
642: }
643: #else
644: pstab(ititle+1, N_SOL);
645: if (gdebug) printf("0,0,LL%d\n", labelno);
646: #endif
647: *cq = '"';
648: printf("LL%d:\n", labelno++);
649:
650: eq: if (lineno == lastlineno) return;
651: lastlineno = lineno;
652:
653: if (fdefflag) {
654: #ifdef STABDOT
655: pstabdot(N_SLINE, lineno);
656: #else
657: pstab(NULLNAME, N_SLINE);
658: printf("0,%d,LL%d\n", lineno, labelno);
659: printf("LL%d:\n", labelno++);
660: #endif
661: }
662: }
663:
664: plcstab(level)
665: int level;
666: {
667: if (!gdebug) {
668: return;
669: } else if (oldway) {
670: old_plcstab(level);
671: return;
672: }
673: #ifdef STABDOT
674: pstabdot(N_LBRAC, level);
675: #else
676: pstab(NULLNAME, N_LBRAC);
677: printf("0,%d,LL%d\n", level, labelno);
678: printf("LL%d:\n", labelno++);
679: #endif
680: }
681:
682: prcstab(level)
683: int level;
684: {
685: if (!gdebug) {
686: return;
687: } else if (oldway) {
688: old_prcstab(level);
689: return;
690: }
691: #ifdef STABDOT
692: pstabdot(N_RBRAC, level);
693: #else
694: pstab(NULLNAME, N_RBRAC);
695: printf("0,%d,LL%d\n", level, labelno);
696: printf("LL%d:\n", labelno++);
697: #endif
698: }
699:
700: pfstab(sname)
701: char *sname;
702: {
703: register struct symtab *p;
704:
705: if (gdebug) {
706: if (oldway) {
707: old_pfstab(sname);
708: } else {
709: p = &stab[lookup(sname, 0)];
710: printf("\t.stabs\t\"%s:", p->sname);
711: putchar((p->sclass == STATIC) ? 'f' : 'F');
712: gentype(p);
713: geninfo(p);
714: }
715: }
716: }
717:
718: /*
719: * Old way of doing things.
720: */
721:
722: private old_fixarg(p)
723: struct symtab *p; {
724: if (gdebug) {
725: old_pstab(p->sname, N_PSYM);
726: if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
727: old_poffs(p);
728: }
729: }
730:
731: private old_outstab(p)
732: struct symtab *p; {
733: register TWORD ptype;
734: register char *pname;
735: register char pclass;
736: register int poffset;
737:
738: if (!gdebug) return;
739:
740: ptype = p->stype;
741: pname = p->sname;
742: pclass = p->sclass;
743: poffset = p->offset;
744:
745: if (ISFTN(ptype)) {
746: return;
747: }
748:
749: switch (pclass) {
750:
751: case AUTO:
752: old_pstab(pname, N_LSYM);
753: printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
754: old_poffs(p);
755: return;
756:
757: case EXTDEF:
758: case EXTERN:
759: old_pstab(pname, N_GSYM);
760: printf("0,%d,0\n", ptype);
761: old_poffs(p);
762: return;
763:
764: case STATIC:
765: #ifdef LCOMM
766: /* stabLCSYM is 1 during nidcl so we can get stab type right */
767: old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
768: #else
769: old_pstab(pname, N_STSYM);
770: #endif
771: if (p->slevel > 1) {
772: printf("0,%d,L%d\n", ptype, poffset);
773: } else {
774: printf("0,%d,%s\n", ptype, exname(pname));
775: }
776: old_poffs(p);
777: return;
778:
779: case REGISTER:
780: old_pstab(pname, N_RSYM);
781: printf("0,%d,%d\n", ptype, poffset);
782: old_poffs(p);
783: return;
784:
785: case MOS:
786: case MOU:
787: old_pstab(pname, N_SSYM);
788: printf("0,%d,%d\n", ptype, poffset/SZCHAR);
789: old_poffs(p);
790: return;
791:
792: case PARAM:
793: /* parameter stab entries are processed in dclargs() */
794: return;
795:
796: default:
797: #ifndef FLEXNAMES
798: if (ddebug) printf(" No .stab for %.8s\n", pname);
799: #else
800: if (ddebug) printf(" No .stab for %s\n", pname);
801: #endif
802:
803: }
804: }
805:
806: private old_pstab(name, type)
807: char *name;
808: int type; {
809: register int i;
810: register char c;
811: if (!gdebug) return;
812: /* locctr(PROG); /* .stabs must appear in .text for c2 */
813: #ifdef ASSTRINGS
814: if ( name[0] == '\0')
815: printf("\t.stabn\t");
816: else
817: #ifndef FLEXNAMES
818: printf("\t.stabs\t\"%.8s\", ", name);
819: #else
820: printf("\t.stabs\t\"%s\", ", name);
821: #endif
822: #else
823: printf(" .stab ");
824: for(i=0; i<8; i++)
825: if (c = name[i]) printf("'%c,", c);
826: else printf("0,");
827: #endif
828: printf("0%o,", type);
829: }
830:
831: #ifdef STABDOT
832: private old_pstabdot(type, value)
833: int type;
834: int value;
835: {
836: if ( ! gdebug) return;
837: /* locctr(PROG); /* .stabs must appear in .text for c2 */
838: printf("\t.stabd\t");
839: printf("0%o,0,0%o\n",type, value);
840: }
841: #endif
842:
843: private old_poffs(p)
844: register struct symtab *p; {
845: int s;
846: if (!gdebug) return;
847: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
848: old_pstab(p->sname, N_LENG);
849: printf("1,0,%d\n", s);
850: }
851: }
852:
853: private old_psline() {
854: static int lastlineno;
855: register char *cp, *cq;
856: register int i;
857:
858: if (!gdebug) return;
859:
860: cq = ititle;
861: cp = ftitle;
862:
863: while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
864: if ( *cp == '\0' ) goto eq;
865:
866: neq: for (i=0; i<100; i++)
867: ititle[i] = '\0';
868: cp = ftitle;
869: cq = ititle;
870: while ( *cp )
871: *cq++ = *cp++;
872: *cq = '\0';
873: *--cq = '\0';
874: #ifndef FLEXNAMES
875: for ( cp = ititle+1; *(cp-1); cp += 8 ) {
876: old_pstab(cp, N_SOL);
877: if (gdebug) printf("0,0,LL%d\n", labelno);
878: }
879: #else
880: old_pstab(ititle+1, N_SOL);
881: if (gdebug) printf("0,0,LL%d\n", labelno);
882: #endif
883: *cq = '"';
884: printf("LL%d:\n", labelno++);
885:
886: eq: if (lineno == lastlineno) return;
887: lastlineno = lineno;
888:
889: if (fdefflag) {
890: #ifdef STABDOT
891: old_pstabdot(N_SLINE, lineno);
892: #else
893: old_pstab(NULLNAME, N_SLINE);
894: printf("0,%d,LL%d\n", lineno, labelno);
895: printf("LL%d:\n", labelno++);
896: #endif
897: }
898: }
899:
900: private old_plcstab(level) {
901: if (!gdebug) return;
902: #ifdef STABDOT
903: old_pstabdot(N_LBRAC, level);
904: #else
905: old_pstab(NULLNAME, N_LBRAC);
906: printf("0,%d,LL%d\n", level, labelno);
907: printf("LL%d:\n", labelno++);
908: #endif
909: }
910:
911: private old_prcstab(level) {
912: if (!gdebug) return;
913: #ifdef STABDOT
914: pstabdot(N_RBRAC, level);
915: #else
916: pstab(NULLNAME, N_RBRAC);
917: printf("0,%d,LL%d\n", level, labelno);
918: printf("LL%d:\n", labelno++);
919: #endif
920: }
921:
922: private old_pfstab(sname)
923: char *sname; {
924: if (!gdebug) return;
925: pstab(sname, N_FUN);
926: #ifndef FLEXNAMES
927: printf("0,%d,_%.7s\n", lineno, sname);
928: #else
929: printf("0,%d,_%s\n", lineno, sname);
930: #endif
931: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.