|
|
1.1 root 1: #ifndef lint
2: static char *sccsid ="@(#)stab.c 1.6 (Berkeley) 12/10/87";
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: Boolean ignore;
104: static Boolean firsttime = true;
105:
106: if (oldway) {
107: old_outstab(sym);
108: } else if (gdebug and not zero_length_array(sym)) {
109: if (firsttime) {
110: firsttime = false;
111: inittypes();
112: }
113: ignore = false;
114: p = sym;
115: switch (p->sclass) {
116: case REGISTER:
117: classname = "r";
118: break;
119:
120: /*
121: * Locals are the default class.
122: */
123: case AUTO:
124: classname = "";
125: break;
126:
127: case STATIC:
128: if (ISFTN(p->stype)) {
129: ignore = true;
130: } else if (p->slevel <= 1) {
131: classname = "S";
132: } else {
133: classname = "V";
134: }
135: break;
136:
137: case EXTDEF:
138: case EXTERN:
139: if (ISFTN(p->stype)) {
140: ignore = true;
141: } else {
142: classname = "G";
143: }
144: break;
145:
146: case TYPEDEF:
147: classname = "t";
148: break;
149:
150: case PARAM:
151: case MOS:
152: case MOU:
153: case MOE:
154: ignore = true;
155: break;
156:
157: case ENAME:
158: case UNAME:
159: case STNAME:
160: (void) entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
161: ignore = true;
162: break;
163:
164: default:
165: if ((p->sclass&FIELD) == 0) {
166: printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
167: }
168: ignore = true;
169: break;
170: }
171: if (not ignore) {
172: printf("\t.stabs\t\"%s:%s", p->sname, classname);
173: gentype(p);
174: geninfo(p);
175: }
176: }
177: }
178:
179: /*
180: * Since type names are lost in the travels and because C has
181: * structural type equivalence we keep a table of type words that
182: * we've already seen. The first time we see a type, it is assigned
183: * (inline) a number and future references just list that number.
184: * Structures, unions, enums, and arrays must be handled carefully
185: * since not all the necessary information is in the type word.
186: */
187:
188: typedef struct Typeid *Typeid;
189:
190: struct Typeid {
191: TWORD tword;
192: int tarray;
193: int tstruct;
194: int tstrtag;
195: int tnum;
196: Typeid chain;
197: };
198:
199: #define TABLESIZE 2003
200:
201: private int tcount = 1;
202: private int t_int, t_char;
203: private Typeid typetable[TABLESIZE];
204:
205: /*
206: * Look for the given type word in the type table.
207: */
208:
209: private Typeid typelookup(type, arrindex, strindex, strtag)
210: TWORD type;
211: int arrindex;
212: int strindex;
213: int strtag;
214: {
215: register TWORD tword;
216: register int i1, i2;
217: Typeid t;
218:
219: t = typetable[type mod TABLESIZE];
220: while (t != nil) {
221: if (t->tword == type and
222: strindex == t->tstruct and strtag == t->tstrtag) {
223: if (arrindex == NILINDEX) {
224: break;
225: } else {
226: tword = type;
227: i1 = arrindex;
228: i2 = t->tarray;
229: while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
230: ++i1;
231: ++i2;
232: tword >>= TSHIFT;
233: }
234: if (!ISARY(tword)) {
235: break;
236: }
237: }
238: }
239: t = t->chain;
240: }
241: return t;
242: }
243:
244: /*
245: * Enter a type word and associated symtab indices into the type table.
246: */
247:
248: private int entertype(type, arrindex, strindex, strtag)
249: TWORD type;
250: int arrindex;
251: int strindex;
252: int strtag;
253: {
254: register Typeid t;
255: register int i;
256:
257: t = (Typeid) malloc(sizeof(struct Typeid));
258: t->tword = type;
259: t->tarray = arrindex;
260: t->tstruct = strindex;
261: t->tstrtag = strtag;
262: t->tnum = tcount;
263: ++tcount;
264: i = type mod TABLESIZE;
265: t->chain = typetable[i];
266: typetable[i] = t;
267: return t->tnum;
268: }
269:
270: /*
271: * Change the information associated with a type table entry.
272: * Since I'm lazy this just creates a new entry with the number
273: * as the old one.
274: */
275:
276: private reentertype(typeid, type, arrindex, strindex, strtag)
277: Typeid typeid;
278: TWORD type;
279: int arrindex;
280: int strindex;
281: int strtag;
282: {
283: register Typeid t;
284: register int i;
285:
286: t = (Typeid) malloc(sizeof(struct Typeid));
287: t->tword = type;
288: t->tarray = arrindex;
289: t->tstruct = strindex;
290: t->tstrtag = strtag;
291: t->tnum = typeid->tnum;
292: i = type mod TABLESIZE;
293: t->chain = typetable[i];
294: typetable[i] = t;
295: }
296:
297: /*
298: * Initialize type table with predefined types.
299: */
300:
301: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
302:
303: private inittypes()
304: {
305: int t;
306:
307: t_int = builtintype(INT);
308: t_char = builtintype(CHAR);
309: maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
310: maketype("char", t_char, t_char, 0L, 127L);
311: maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
312: maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
313: maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
314: maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
315: maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
316: maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
317: maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
318: maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
319: t = builtintype(UNDEF);
320: printf("\t.stabs\t\"void:t%d=%d", t, t);
321: geninfo((struct symtab *)nil);
322: t = builtintype(FARG);
323: printf("\t.stabs\t\"???:t%d=%d", t, t_int);
324: geninfo((struct symtab *)nil);
325: }
326:
327: /*
328: * Generate info for a new range type.
329: */
330:
331: private maketype(name, tnum, eqtnum, lower, upper)
332: char *name;
333: int tnum, eqtnum;
334: long lower, upper;
335: {
336: printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
337: geninfo((struct symtab *)nil);
338: }
339:
340: /*
341: * Generate debugging information for the given type of the given symbol.
342: */
343:
344: private gentype(sym)
345: struct symtab *sym;
346: {
347: register struct symtab *p;
348: register TWORD t;
349: register TWORD basictype;
350: register Typeid typeid;
351: int i, arrindex, strindex, strtag;
352:
353: p = sym;
354: t = p->stype;
355: if (ISFTN(t)) {
356: t = DECREF(t);
357: }
358: basictype = BTYPE(t);
359: if (ISARY(t)) {
360: arrindex = p->dimoff;
361: } else {
362: arrindex = NILINDEX;
363: }
364: if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
365: strindex = dimtab[p->sizoff + 1];
366: if (strindex == -1) {
367: strindex = FORWARD;
368: strtag = dimtab[p->sizoff + 3];
369: } else {
370: strtag = NILINDEX;
371: }
372: } else {
373: strindex = NILINDEX;
374: strtag = NILINDEX;
375: }
376: i = arrindex;
377: typeid = typelookup(t, arrindex, strindex, strtag);
378: while (t != basictype and typeid == nil) {
379: printf("%d=", entertype(t, i, strindex, strtag));
380: switch (t&TMASK) {
381: case PTR:
382: printf("*");
383: break;
384:
385: case FTN:
386: printf("f");
387: break;
388:
389: case ARY:
390: printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
391: break;
392: }
393: t = DECREF(t);
394: if (i == NILINDEX && ISARY(t)) {
395: i = p->dimoff;
396: }
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: /*ARGSUSED*/
528: outstruct(szindex, paramindex)
529: int szindex, paramindex;
530: {
531: register Typeid typeid;
532: register struct symtab *p;
533: register int i, t, strindex;
534:
535: if (oldway) {
536: /* do nothing */;
537: } else if (gdebug) {
538: if ((i = dimtab[szindex + 3]) >= 0 && (p = &stab[i])->sname != nil) {
539: strindex = dimtab[p->sizoff + 1];
540: typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
541: if (typeid == nil) {
542: t = 0;
543: } else {
544: t = typeid->tnum;
545: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
546: }
547: printf("\t.stabs\t\"%s:T", p->sname);
548: genstruct(p->stype, t, strindex, p->sname, bsize(p));
549: geninfo(p);
550: }
551: }
552: }
553:
554: pstab(name, type)
555: char *name;
556: int type;
557: {
558: #ifndef ASSTRINGS
559: register int i;
560: register char c;
561: #endif
562:
563: if (!gdebug) {
564: return;
565: } else if (oldway) {
566: old_pstab(name, type);
567: return;
568: }
569: /* locctr(PROG); /* .stabs must appear in .text for c2 */
570: #ifdef ASSTRINGS
571: if ( name[0] == '\0')
572: printf("\t.stabn\t");
573: else
574: #ifndef FLEXNAMES
575: printf("\t.stabs\t\"%.8s\",", name);
576: #else
577: printf("\t.stabs\t\"%s\",", name);
578: #endif
579: #else
580: printf(" .stab ");
581: for(i=0; i<8; i++)
582: if (c = name[i]) printf("'%c,", c);
583: else printf("0,");
584: #endif
585: printf("0%o,", type);
586: }
587:
588: #ifdef STABDOT
589: pstabdot(type, value)
590: int type;
591: int value;
592: {
593: if ( ! gdebug) {
594: return;
595: } else if (oldway) {
596: old_pstabdot(type, value);
597: return;
598: }
599: /* locctr(PROG); /* .stabs must appear in .text for c2 */
600: printf("\t.stabd\t");
601: printf("0%o,0,0%o\n",type, value);
602: }
603: #endif
604:
605: #ifndef STABDOT
606: extern char NULLNAME[8];
607: #endif
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: #ifndef ASSTRINGS
810: register int i;
811: register char c;
812: #endif
813: if (!gdebug) return;
814: /* locctr(PROG); /* .stabs must appear in .text for c2 */
815: #ifdef ASSTRINGS
816: if ( name[0] == '\0')
817: printf("\t.stabn\t");
818: else
819: #ifndef FLEXNAMES
820: printf("\t.stabs\t\"%.8s\", ", name);
821: #else
822: printf("\t.stabs\t\"%s\", ", name);
823: #endif
824: #else
825: printf(" .stab ");
826: for(i=0; i<8; i++)
827: if (c = name[i]) printf("'%c,", c);
828: else printf("0,");
829: #endif
830: printf("0%o,", type);
831: }
832:
833: #ifdef STABDOT
834: private old_pstabdot(type, value)
835: int type;
836: int value;
837: {
838: if ( ! gdebug) return;
839: /* locctr(PROG); /* .stabs must appear in .text for c2 */
840: printf("\t.stabd\t");
841: printf("0%o,0,0%o\n",type, value);
842: }
843: #endif
844:
845: private old_poffs(p)
846: register struct symtab *p; {
847: int s;
848: if (!gdebug) return;
849: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
850: old_pstab(p->sname, N_LENG);
851: printf("1,0,%d\n", s);
852: }
853: }
854:
855: private old_psline() {
856: static int lastlineno;
857: register char *cp, *cq;
858: register int i;
859:
860: if (!gdebug) return;
861:
862: cq = ititle;
863: cp = ftitle;
864:
865: while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
866: if ( *cp == '\0' ) goto eq;
867:
868: neq: for (i=0; i<100; i++)
869: ititle[i] = '\0';
870: cp = ftitle;
871: cq = ititle;
872: while ( *cp )
873: *cq++ = *cp++;
874: *cq = '\0';
875: *--cq = '\0';
876: #ifndef FLEXNAMES
877: for ( cp = ititle+1; *(cp-1); cp += 8 ) {
878: old_pstab(cp, N_SOL);
879: if (gdebug) printf("0,0,LL%d\n", labelno);
880: }
881: #else
882: old_pstab(ititle+1, N_SOL);
883: if (gdebug) printf("0,0,LL%d\n", labelno);
884: #endif
885: *cq = '"';
886: printf("LL%d:\n", labelno++);
887:
888: eq: if (lineno == lastlineno) return;
889: lastlineno = lineno;
890:
891: if (fdefflag) {
892: #ifdef STABDOT
893: old_pstabdot(N_SLINE, lineno);
894: #else
895: old_pstab(NULLNAME, N_SLINE);
896: printf("0,%d,LL%d\n", lineno, labelno);
897: printf("LL%d:\n", labelno++);
898: #endif
899: }
900: }
901:
902: private old_plcstab(level) {
903: if (!gdebug) return;
904: #ifdef STABDOT
905: old_pstabdot(N_LBRAC, level);
906: #else
907: old_pstab(NULLNAME, N_LBRAC);
908: printf("0,%d,LL%d\n", level, labelno);
909: printf("LL%d:\n", labelno++);
910: #endif
911: }
912:
913: private old_prcstab(level) {
914: if (!gdebug) return;
915: #ifdef STABDOT
916: pstabdot(N_RBRAC, level);
917: #else
918: pstab(NULLNAME, N_RBRAC);
919: printf("0,%d,LL%d\n", level, labelno);
920: printf("LL%d:\n", labelno++);
921: #endif
922: }
923:
924: private old_pfstab(sname)
925: char *sname; {
926: if (!gdebug) return;
927: pstab(sname, N_FUN);
928: #ifndef FLEXNAMES
929: printf("0,%d,_%.7s\n", lineno, sname);
930: #else
931: printf("0,%d,_%s\n", lineno, sname);
932: #endif
933: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.