|
|
1.1 root 1: #ifndef lint
2: static char *sccsid ="@(#)stab.c 1.10 (Berkeley) 10/22/83";
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 "mfile1"
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 (t == basictype) {
398: typeid = typelookup(t, NILINDEX, strindex, strtag);
399: } else {
400: typeid = typelookup(t, i, strindex, strtag);
401: }
402: }
403: if (typeid == nil) {
404: if (strindex == FORWARD) {
405: typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
406: if (typeid == nil) {
407: cerror("unbelievable forward reference");
408: }
409: printf("%d", typeid->tnum);
410: } else {
411: genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
412: }
413: } else {
414: printf("%d", typeid->tnum);
415: }
416: }
417:
418: /*
419: * Generate type information for structures, unions, and enumerations.
420: */
421:
422: private genstruct(t, structid, index, name, size)
423: TWORD t;
424: int structid;
425: int index;
426: char *name;
427: int size;
428: {
429: register int i;
430: register struct symtab *field;
431: int id;
432:
433: if (structid == NILINDEX) {
434: id = entertype(t, NILINDEX, index, NILINDEX);
435: } else {
436: id = structid;
437: }
438: switch (t) {
439: case STRTY:
440: case UNIONTY:
441: printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
442: i = index;
443: while (dimtab[i] != -1) {
444: field = &stab[dimtab[i]];
445: printf("%s:", field->sname);
446: gentype(field);
447: if (field->sclass > FIELD) {
448: printf(",%d,%d;", field->offset, field->sclass - FIELD);
449: } else {
450: printf(",%d,%d;", field->offset,
451: tsize(field->stype, field->dimoff, field->sizoff));
452: }
453: ++i;
454: }
455: putchar(';');
456: break;
457:
458: case ENUMTY:
459: printf("%d=e", id);
460: i = index;
461: while (dimtab[i] != -1) {
462: field = &stab[dimtab[i]];
463: printf("%s:%d,", field->sname, field->offset);
464: i++;
465: }
466: putchar(';');
467: break;
468:
469: default:
470: cerror("couldn't find basic type %d for %s\n", t, name);
471: break;
472: }
473: }
474:
475: /*
476: * Generate offset and size info.
477: */
478:
479: private geninfo(p)
480: register struct symtab *p;
481: {
482: int stabtype;
483:
484: if (p == nil) {
485: printf("\",0x%x,0,0,0\n", N_LSYM);
486: } else {
487: switch (p->sclass) {
488: case EXTERN:
489: case EXTDEF:
490: if (ISFTN(p->stype)) {
491: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
492: } else {
493: printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p));
494: }
495: break;
496:
497: case STATIC:
498: stabtype = stabLCSYM ? N_LCSYM : N_STSYM;
499: if (ISFTN(p->stype)) {
500: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
501: } else if (p->slevel > 1) {
502: printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset);
503: } else {
504: printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname);
505: }
506: break;
507:
508: case REGISTER:
509: printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
510: break;
511:
512: case PARAM:
513: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
514: break;
515:
516: default:
517: printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
518: break;
519: }
520: }
521: }
522:
523: /*
524: * Generate information for a newly-defined structure.
525: */
526:
527: outstruct(szindex, paramindex)
528: int szindex, paramindex;
529: {
530: register Typeid typeid;
531: register struct symtab *p;
532: register int i, t, strindex;
533:
534: if (oldway) {
535: /* do nothing */;
536: } else if (gdebug) {
537: i = dimtab[szindex + 3];
538: p = &stab[i];
539: if (p->sname != nil) {
540: strindex = dimtab[p->sizoff + 1];
541: typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
542: if (typeid == nil) {
543: t = 0;
544: } else {
545: t = typeid->tnum;
546: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
547: }
548: printf("\t.stabs\t\"%s:T", p->sname);
549: genstruct(p->stype, t, strindex, p->sname, bsize(p));
550: geninfo(p);
551: }
552: }
553: }
554:
555: pstab(name, type)
556: char *name;
557: int type;
558: {
559: register int i;
560: register char c;
561:
562: if (!gdebug) {
563: return;
564: } else if (oldway) {
565: old_pstab(name, type);
566: return;
567: }
568: /* locctr(PROG); /* .stabs must appear in .text for c2 */
569: #ifdef ASSTRINGS
570: if ( name[0] == '\0')
571: printf("\t.stabn\t");
572: else
573: #ifndef FLEXNAMES
574: printf("\t.stabs\t\"%.8s\",", name);
575: #else
576: printf("\t.stabs\t\"%s\",", name);
577: #endif
578: #else
579: printf(" .stab ");
580: for(i=0; i<8; i++)
581: if (c = name[i]) printf("'%c,", c);
582: else printf("0,");
583: #endif
584: printf("0%o,", type);
585: }
586:
587: #ifdef STABDOT
588: pstabdot(type, value)
589: int type;
590: int value;
591: {
592: if ( ! gdebug) {
593: return;
594: } else if (oldway) {
595: old_pstabdot(type, value);
596: return;
597: }
598: /* locctr(PROG); /* .stabs must appear in .text for c2 */
599: printf("\t.stabd\t");
600: printf("0%o,0,0%o\n",type, value);
601: }
602: #endif
603:
604: extern char NULLNAME[8];
605: extern int labelno;
606: extern int fdefflag;
607:
608: psline()
609: {
610: static int lastlineno;
611: register char *cp, *cq;
612: register int i;
613:
614: if (!gdebug) {
615: return;
616: } else if (oldway) {
617: old_psline();
618: return;
619: }
620:
621: cq = ititle;
622: cp = ftitle;
623:
624: while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
625: if ( *cp == '\0' ) goto eq;
626:
627: neq: for (i=0; i<100; i++)
628: ititle[i] = '\0';
629: cp = ftitle;
630: cq = ititle;
631: while ( *cp )
632: *cq++ = *cp++;
633: *cq = '\0';
634: *--cq = '\0';
635: #ifndef FLEXNAMES
636: for ( cp = ititle+1; *(cp-1); cp += 8 ) {
637: pstab(cp, N_SOL);
638: if (gdebug) printf("0,0,LL%d\n", labelno);
639: }
640: #else
641: pstab(ititle+1, N_SOL);
642: if (gdebug) printf("0,0,LL%d\n", labelno);
643: #endif
644: *cq = '"';
645: printf("LL%d:\n", labelno++);
646:
647: eq: if (lineno == lastlineno) return;
648: lastlineno = lineno;
649:
650: if (fdefflag) {
651: #ifdef STABDOT
652: pstabdot(N_SLINE, lineno);
653: #else
654: pstab(NULLNAME, N_SLINE);
655: printf("0,%d,LL%d\n", lineno, labelno);
656: printf("LL%d:\n", labelno++);
657: #endif
658: }
659: }
660:
661: plcstab(level)
662: int level;
663: {
664: if (!gdebug) {
665: return;
666: } else if (oldway) {
667: old_plcstab(level);
668: return;
669: }
670: #ifdef STABDOT
671: pstabdot(N_LBRAC, level);
672: #else
673: pstab(NULLNAME, N_LBRAC);
674: printf("0,%d,LL%d\n", level, labelno);
675: printf("LL%d:\n", labelno++);
676: #endif
677: }
678:
679: prcstab(level)
680: int level;
681: {
682: if (!gdebug) {
683: return;
684: } else if (oldway) {
685: old_prcstab(level);
686: return;
687: }
688: #ifdef STABDOT
689: pstabdot(N_RBRAC, level);
690: #else
691: pstab(NULLNAME, N_RBRAC);
692: printf("0,%d,LL%d\n", level, labelno);
693: printf("LL%d:\n", labelno++);
694: #endif
695: }
696:
697: pfstab(sname)
698: char *sname;
699: {
700: register struct symtab *p;
701:
702: if (gdebug) {
703: if (oldway) {
704: old_pfstab(sname);
705: } else {
706: p = &stab[lookup(sname, 0)];
707: printf("\t.stabs\t\"%s:", p->sname);
708: putchar((p->sclass == STATIC) ? 'f' : 'F');
709: gentype(p);
710: geninfo(p);
711: }
712: }
713: }
714:
715: /*
716: * Old way of doing things.
717: */
718:
719: private old_fixarg(p)
720: struct symtab *p; {
721: if (gdebug) {
722: old_pstab(p->sname, N_PSYM);
723: if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
724: old_poffs(p);
725: }
726: }
727:
728: private old_outstab(p)
729: struct symtab *p; {
730: register TWORD ptype;
731: register char *pname;
732: register char pclass;
733: register int poffset;
734:
735: if (!gdebug) return;
736:
737: ptype = p->stype;
738: pname = p->sname;
739: pclass = p->sclass;
740: poffset = p->offset;
741:
742: if (ISFTN(ptype)) {
743: return;
744: }
745:
746: switch (pclass) {
747:
748: case AUTO:
749: old_pstab(pname, N_LSYM);
750: printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
751: old_poffs(p);
752: return;
753:
754: case EXTDEF:
755: case EXTERN:
756: old_pstab(pname, N_GSYM);
757: printf("0,%d,0\n", ptype);
758: old_poffs(p);
759: return;
760:
761: case STATIC:
762: #ifdef LCOMM
763: /* stabLCSYM is 1 during nidcl so we can get stab type right */
764: old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
765: #else
766: old_pstab(pname, N_STSYM);
767: #endif
768: if (p->slevel > 1) {
769: printf("0,%d,L%d\n", ptype, poffset);
770: } else {
771: printf("0,%d,%s\n", ptype, exname(pname));
772: }
773: old_poffs(p);
774: return;
775:
776: case REGISTER:
777: old_pstab(pname, N_RSYM);
778: printf("0,%d,%d\n", ptype, poffset);
779: old_poffs(p);
780: return;
781:
782: case MOS:
783: case MOU:
784: old_pstab(pname, N_SSYM);
785: printf("0,%d,%d\n", ptype, poffset/SZCHAR);
786: old_poffs(p);
787: return;
788:
789: case PARAM:
790: /* parameter stab entries are processed in dclargs() */
791: return;
792:
793: default:
794: #ifndef FLEXNAMES
795: if (ddebug) printf(" No .stab for %.8s\n", pname);
796: #else
797: if (ddebug) printf(" No .stab for %s\n", pname);
798: #endif
799:
800: }
801: }
802:
803: private old_pstab(name, type)
804: char *name;
805: int type; {
806: register int i;
807: register char c;
808: if (!gdebug) return;
809: /* locctr(PROG); /* .stabs must appear in .text for c2 */
810: #ifdef ASSTRINGS
811: if ( name[0] == '\0')
812: printf("\t.stabn\t");
813: else
814: #ifndef FLEXNAMES
815: printf("\t.stabs\t\"%.8s\", ", name);
816: #else
817: printf("\t.stabs\t\"%s\", ", name);
818: #endif
819: #else
820: printf(" .stab ");
821: for(i=0; i<8; i++)
822: if (c = name[i]) printf("'%c,", c);
823: else printf("0,");
824: #endif
825: printf("0%o,", type);
826: }
827:
828: #ifdef STABDOT
829: private old_pstabdot(type, value)
830: int type;
831: int value;
832: {
833: if ( ! gdebug) return;
834: /* locctr(PROG); /* .stabs must appear in .text for c2 */
835: printf("\t.stabd\t");
836: printf("0%o,0,0%o\n",type, value);
837: }
838: #endif
839:
840: private old_poffs(p)
841: register struct symtab *p; {
842: int s;
843: if (!gdebug) return;
844: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
845: old_pstab(p->sname, N_LENG);
846: printf("1,0,%d\n", s);
847: }
848: }
849:
850: private old_psline() {
851: static int lastlineno;
852: register char *cp, *cq;
853: register int i;
854:
855: if (!gdebug) return;
856:
857: cq = ititle;
858: cp = ftitle;
859:
860: while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
861: if ( *cp == '\0' ) goto eq;
862:
863: neq: for (i=0; i<100; i++)
864: ititle[i] = '\0';
865: cp = ftitle;
866: cq = ititle;
867: while ( *cp )
868: *cq++ = *cp++;
869: *cq = '\0';
870: *--cq = '\0';
871: #ifndef FLEXNAMES
872: for ( cp = ititle+1; *(cp-1); cp += 8 ) {
873: old_pstab(cp, N_SOL);
874: if (gdebug) printf("0,0,LL%d\n", labelno);
875: }
876: #else
877: old_pstab(ititle+1, N_SOL);
878: if (gdebug) printf("0,0,LL%d\n", labelno);
879: #endif
880: *cq = '"';
881: printf("LL%d:\n", labelno++);
882:
883: eq: if (lineno == lastlineno) return;
884: lastlineno = lineno;
885:
886: if (fdefflag) {
887: #ifdef STABDOT
888: old_pstabdot(N_SLINE, lineno);
889: #else
890: old_pstab(NULLNAME, N_SLINE);
891: printf("0,%d,LL%d\n", lineno, labelno);
892: printf("LL%d:\n", labelno++);
893: #endif
894: }
895: }
896:
897: private old_plcstab(level) {
898: if (!gdebug) return;
899: #ifdef STABDOT
900: old_pstabdot(N_LBRAC, level);
901: #else
902: old_pstab(NULLNAME, N_LBRAC);
903: printf("0,%d,LL%d\n", level, labelno);
904: printf("LL%d:\n", labelno++);
905: #endif
906: }
907:
908: private old_prcstab(level) {
909: if (!gdebug) return;
910: #ifdef STABDOT
911: pstabdot(N_RBRAC, level);
912: #else
913: pstab(NULLNAME, N_RBRAC);
914: printf("0,%d,LL%d\n", level, labelno);
915: printf("LL%d:\n", labelno++);
916: #endif
917: }
918:
919: private old_pfstab(sname)
920: char *sname; {
921: if (!gdebug) return;
922: pstab(sname, N_FUN);
923: #ifndef FLEXNAMES
924: printf("0,%d,_%.7s\n", lineno, sname);
925: #else
926: printf("0,%d,_%s\n", lineno, sname);
927: #endif
928: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.