new include files; fix termination of enums
[unix-history] / usr / src / old / pcc / ccom.tahoe / stab.c
CommitLineData
5459df37 1#ifndef lint
9aa9515f 2static char sccsid[] = "@(#)stab.c 1.3 (Berkeley) %G%";
5459df37
SL
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
9aa9515f 11#include "pass1.h"
5459df37
SL
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
31typedef int Boolean;
32
33#define false 0
34#define true 1
35
36extern int ddebug;
37extern int gdebug;
38extern char *malloc();
39
40int stabLCSYM;
41
42/*
43 * Flag for producing either sdb or dbx symbol information.
44 */
45int 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
53fixarg(p)
54struct 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
76private Boolean zero_length_array(p)
77register 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
98outstab(sym)
99struct 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
191typedef struct Typeid *Typeid;
192
193struct 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
204private int tcount = 1;
205private int t_int, t_char;
206private Typeid typetable[TABLESIZE];
207
208/*
209 * Look for the given type word in the type table.
210 */
211
212private Typeid typelookup(type, arrindex, strindex, strtag)
213TWORD type;
214int arrindex;
215int strindex;
216int 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
251private int entertype(type, arrindex, strindex, strtag)
252TWORD type;
253int arrindex;
254int strindex;
255int 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
279private reentertype(typeid, type, arrindex, strindex, strtag)
280Typeid typeid;
281TWORD type;
282int arrindex;
283int strindex;
284int 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
306private 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
334private maketype(name, tnum, eqtnum, lower, upper)
335char *name;
336int tnum, eqtnum;
337long 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
347private gentype(sym)
348struct 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
422private genstruct(t, structid, index, name, size)
423TWORD t;
424int structid;
425int index;
426char *name;
427int 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 }
9aa9515f 466 putchar(';');
5459df37
SL
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
479private geninfo(p)
480register 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
527outstruct(szindex, paramindex)
528int 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
555pstab(name, type)
556char *name;
557int 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
588pstabdot(type, value)
589int type;
590int 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
604extern char NULLNAME[8];
605extern int labelno;
606extern int fdefflag;
607
608psline()
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
627neq: 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
647eq: 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
661plcstab(level)
662int 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
679prcstab(level)
680int 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
697pfstab(sname)
698char *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
719private old_fixarg(p)
720struct 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
728private old_outstab(p)
729struct 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
803private old_pstab(name, type)
804char *name;
805int 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
829private 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
840private old_poffs(p)
841register 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
850private 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
863neq: 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
883eq: 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
897private 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
908private 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
919private old_pfstab(sname)
920char *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}