date and time created 86/01/11 11:00:56 by sam
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 12 Jan 1986 03:00:56 +0000 (19:00 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 12 Jan 1986 03:00:56 +0000 (19:00 -0800)
SCCS-vsn: old/pcc/ccom.tahoe/stab.c 1.1

usr/src/old/pcc/ccom.tahoe/stab.c [new file with mode: 0644]

diff --git a/usr/src/old/pcc/ccom.tahoe/stab.c b/usr/src/old/pcc/ccom.tahoe/stab.c
new file mode 100644 (file)
index 0000000..a5868b3
--- /dev/null
@@ -0,0 +1,931 @@
+#ifndef lint
+static char sccsid[] = "@(#)stab.c     1.1 (Berkeley) %G%";
+#endif
+
+#ifndef lint
+static char *sccsid ="@(#)stab.c       1.9 (Berkeley) 8/11/83";
+#endif
+/*
+ * Symbolic debugging info interface.
+ *
+ * Here we generate pseudo-ops that cause the assembler to put
+ * symbolic debugging information into the object file.
+ */
+
+#include "mfile1"
+
+#include <sys/types.h>
+#include <a.out.h>
+#include <stab.h>
+
+#define private static
+#define and &&
+#define or ||
+#define not !
+#define div /
+#define mod %
+#define nil 0
+
+#define bytes(bits) ((bits) / SZCHAR)
+#define bsize(p) bytes(dimtab[p->sizoff])      /* size in bytes of a symbol */
+
+#define NILINDEX -1
+#define FORWARD -2
+
+typedef int Boolean;
+
+#define false 0
+#define true 1
+
+extern int ddebug;
+extern int gdebug;
+extern char *malloc();
+
+int stabLCSYM;
+
+/*
+ * Flag for producing either sdb or dbx symbol information.
+ */
+int oldway = false;
+
+/*
+ * Generate debugging info for a parameter.
+ * The offset isn't known when it is first entered into the symbol table
+ * since the types are read later.
+ */
+
+fixarg(p)
+struct symtab *p;
+{
+    if (oldway) {
+       old_fixarg(p);
+    } else if (gdebug) {
+       printf("\t.stabs\t\"%s:p", p->sname);
+       gentype(p);
+       printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
+    }
+}
+
+/*
+ * Determine if the given symbol is a global array with dimension 0,
+ * which only makes sense if it's dimension is to be given later.
+ * We therefore currently do not generate symbol information for
+ * such entries.
+ */
+
+#define isglobal(class) ( \
+    class == EXTDEF or class == EXTERN or class == STATIC \
+)
+
+private Boolean zero_length_array(p)
+register struct symtab *p;
+{
+    Boolean b;
+    int t;
+
+    if (not isglobal(p->sclass)) {
+       b = false;
+    } else {
+       t = p->stype;
+       if (ISFTN(t)) {
+           t = DECREF(t);
+       }
+       b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0);
+    }
+    return b;
+}
+
+/*
+ * Generate debugging info for a given symbol.
+ */
+
+outstab(sym)
+struct symtab *sym;
+{
+    register struct symtab *p;
+    char *classname;
+    int offset;
+    Boolean ignore;
+    static Boolean firsttime = true;
+
+    if (oldway) {
+       old_outstab(sym);
+    } else if (gdebug and not zero_length_array(sym)) {
+       if (firsttime) {
+           firsttime = false;
+           inittypes();
+       }
+       ignore = false;
+       p = sym;
+       offset = bytes(p->offset);
+       switch (p->sclass) {
+       case REGISTER:
+           classname = "r";
+           offset = p->offset;
+           break;
+
+       /*
+        * Locals are the default class.
+        */
+       case AUTO:
+           classname = "";
+           break;
+
+       case STATIC:
+           if (ISFTN(p->stype)) {
+               ignore = true;
+           } else if (p->slevel <= 1) {
+               classname = "S";
+           } else {
+               classname = "V";
+           }
+           break;
+
+       case EXTDEF:
+       case EXTERN:
+           if (ISFTN(p->stype)) {
+               ignore = true;
+           } else {
+               classname = "G";
+           }
+           break;
+
+       case TYPEDEF:
+           classname = "t";
+           break;
+
+       case PARAM:
+       case MOS:
+       case MOU:
+       case MOE:
+           ignore = true;
+           break;
+
+       case ENAME:
+       case UNAME:
+       case STNAME:
+           entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
+           ignore = true;
+           break;
+
+       default:
+           if ((p->sclass&FIELD) == 0) {
+               printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
+           }
+           ignore = true;
+           break;
+       }
+       if (not ignore) {
+           printf("\t.stabs\t\"%s:%s", p->sname, classname);
+           gentype(p);
+           geninfo(p);
+       }
+    }
+}
+
+/*
+ * Since type names are lost in the travels and because C has
+ * structural type equivalence we keep a table of type words that
+ * we've already seen.  The first time we see a type, it is assigned
+ * (inline) a number and future references just list that number.
+ * Structures, unions, enums, and arrays must be handled carefully
+ * since not all the necessary information is in the type word.
+ */
+
+typedef struct Typeid *Typeid;
+
+struct Typeid {
+    TWORD tword;
+    int tarray;
+    int tstruct;
+    int tstrtag;
+    int tnum;
+    Typeid chain;
+};
+
+#define TABLESIZE 2003
+
+private int tcount = 1;
+private int t_int, t_char;
+private Typeid typetable[TABLESIZE];
+
+/*
+ * Look for the given type word in the type table.
+ */
+
+private Typeid typelookup(type, arrindex, strindex, strtag)
+TWORD type;
+int arrindex;
+int strindex;
+int strtag;
+{
+    register TWORD tword;
+    register int i1, i2;
+    Typeid t;
+
+    t = typetable[type mod TABLESIZE];
+    while (t != nil) {
+       if (t->tword == type and
+         strindex == t->tstruct and strtag == t->tstrtag) {
+           if (arrindex == NILINDEX) {
+               break;
+           } else {
+               tword = type;
+               i1 = arrindex;
+               i2 = t->tarray;
+               while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
+                   ++i1;
+                   ++i2;
+                   tword >>= TSHIFT;
+               }
+               if (!ISARY(tword)) {
+                   break;
+               }
+           }
+       }
+       t = t->chain;
+    }
+    return t;
+}
+
+/*
+ * Enter a type word and associated symtab indices into the type table.
+ */
+
+private int entertype(type, arrindex, strindex, strtag)
+TWORD type;
+int arrindex;
+int strindex;
+int strtag;
+{
+    register Typeid t;
+    register int i;
+
+    t = (Typeid) malloc(sizeof(struct Typeid));
+    t->tword = type;
+    t->tarray = arrindex;
+    t->tstruct = strindex;
+    t->tstrtag = strtag;
+    t->tnum = tcount;
+    ++tcount;
+    i = type mod TABLESIZE;
+    t->chain = typetable[i];
+    typetable[i] = t;
+    return t->tnum;
+}
+
+/*
+ * Change the information associated with a type table entry.
+ * Since I'm lazy this just creates a new entry with the number
+ * as the old one.
+ */
+
+private reentertype(typeid, type, arrindex, strindex, strtag)
+Typeid typeid;
+TWORD type;
+int arrindex;
+int strindex;
+int strtag;
+{
+    register Typeid t;
+    register int i;
+
+    t = (Typeid) malloc(sizeof(struct Typeid));
+    t->tword = type;
+    t->tarray = arrindex;
+    t->tstruct = strindex;
+    t->tstrtag = strtag;
+    t->tnum = typeid->tnum;
+    i = type mod TABLESIZE;
+    t->chain = typetable[i];
+    typetable[i] = t;
+}
+
+/*
+ * Initialize type table with predefined types.
+ */
+
+#define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
+
+private inittypes()
+{
+    int t;
+
+    t_int = builtintype(INT);
+    t_char = builtintype(CHAR);
+    maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
+    maketype("char", t_char, t_char, 0L, 127L);
+    maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
+    maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
+    maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
+    maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
+    maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
+    maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
+    maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
+    maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
+    t = builtintype(UNDEF);
+    printf("\t.stabs\t\"void:t%d=%d", t, t);
+    geninfo(nil);
+    t = builtintype(FARG);
+    printf("\t.stabs\t\"???:t%d=%d", t, t_int);
+    geninfo(nil);
+}
+
+/*
+ * Generate info for a new range type.
+ */
+
+private maketype(name, tnum, eqtnum, lower, upper)
+char *name;
+int tnum, eqtnum;
+long lower, upper;
+{
+    printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
+    geninfo(nil);
+}
+
+/*
+ * Generate debugging information for the given type of the given symbol.
+ */
+
+private gentype(sym)
+struct symtab *sym;
+{
+    register struct symtab *p;
+    register TWORD t;
+    register TWORD basictype;
+    register Typeid typeid;
+    int i, arrindex, strindex, strtag;
+
+    p = sym;
+    t = p->stype;
+    if (ISFTN(t)) {
+       t = DECREF(t);
+    }
+    basictype = BTYPE(t);
+    if (ISARY(t)) {
+       arrindex = p->dimoff;
+    } else {
+       arrindex = NILINDEX;
+    }
+    if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
+       strindex = dimtab[p->sizoff + 1];
+       if (strindex == -1) {
+           strindex = FORWARD;
+           strtag = dimtab[p->sizoff + 3];
+       } else {
+           strtag = NILINDEX;
+       }
+    } else {
+       strindex = NILINDEX;
+       strtag = NILINDEX;
+    }
+    i = arrindex;
+    typeid = typelookup(t, arrindex, strindex, strtag);
+    while (t != basictype and typeid == nil) {
+       printf("%d=", entertype(t, i, strindex, strtag));
+       switch (t&TMASK) {
+       case PTR:
+           printf("*");
+           break;
+
+       case FTN:
+           printf("f");
+           break;
+
+       case ARY:
+           printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
+           break;
+       }
+       t = DECREF(t);
+       if (t == basictype) {
+           typeid = typelookup(t, NILINDEX, strindex, strtag);
+       } else {
+           typeid = typelookup(t, i, strindex, strtag);
+       }
+    }
+    if (typeid == nil) {
+       if (strindex == FORWARD) {
+           typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
+           if (typeid == nil) {
+               cerror("unbelievable forward reference");
+           }
+           printf("%d", typeid->tnum);
+       } else {
+           genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
+       }
+    } else {
+       printf("%d", typeid->tnum);
+    }
+}
+
+/*
+ * Generate type information for structures, unions, and enumerations.
+ */
+
+private genstruct(t, structid, index, name, size)
+TWORD t;
+int structid;
+int index;
+char *name;
+int size;
+{
+    register int i;
+    register struct symtab *field;
+    int id;
+
+    if (structid == NILINDEX) {
+       id = entertype(t, NILINDEX, index, NILINDEX);
+    } else {
+       id = structid;
+    }
+    switch (t) {
+    case STRTY:
+    case UNIONTY:
+       printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
+       i = index;
+       while (dimtab[i] != -1) {
+           field = &stab[dimtab[i]];
+           printf("%s:", field->sname);
+           gentype(field);
+           if (field->sclass > FIELD) {
+               printf(",%d,%d;", field->offset, field->sclass - FIELD);
+           } else {
+               printf(",%d,%d;", field->offset,
+                   tsize(field->stype, field->dimoff, field->sizoff));
+           }
+           ++i;
+       }
+       putchar(';');
+       break;
+
+    case ENUMTY:
+       printf("%d=e", id);
+       i = index;
+       while (dimtab[i] != -1) {
+           field = &stab[dimtab[i]];
+           printf("%s:%d,", field->sname, field->offset);
+           i++;
+       }
+       break;
+
+    default:
+       cerror("couldn't find basic type %d for %s\n", t, name);
+       break;
+    }
+}
+
+/*
+ * Generate offset and size info.
+ */
+
+private geninfo(p)
+register struct symtab *p;
+{
+    int stabtype;
+
+    if (p == nil) {
+       printf("\",0x%x,0,0,0\n", N_LSYM);
+    } else {
+       switch (p->sclass) {
+           case EXTERN:
+           case EXTDEF:
+               if (ISFTN(p->stype)) {
+                   printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
+               } else {
+                   printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p));
+               }
+               break;
+
+           case STATIC:
+               stabtype = stabLCSYM ? N_LCSYM : N_STSYM;
+               if (ISFTN(p->stype)) {
+                   printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
+               } else if (p->slevel > 1) {
+                   printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset);
+               } else {
+                   printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname);
+               }
+               break;
+
+           case REGISTER:
+               printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
+               break;
+
+           case PARAM:
+               printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
+               break;
+
+           default:
+               printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
+               break;
+       }
+    }
+}
+
+/*
+ * Generate information for a newly-defined structure.
+ */
+
+outstruct(szindex, paramindex)
+int szindex, paramindex;
+{
+    register Typeid typeid;
+    register struct symtab *p;
+    register int i, t, strindex;
+
+    if (oldway) {
+       /* do nothing */;
+    } else if (gdebug) {
+       i = dimtab[szindex + 3];
+       p = &stab[i];
+       if (p->sname != nil) {
+           strindex = dimtab[p->sizoff + 1];
+           typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
+           if (typeid == nil) {
+               t = 0;
+           } else {
+               t = typeid->tnum;
+               reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
+           }
+           printf("\t.stabs\t\"%s:T", p->sname);
+           genstruct(p->stype, t, strindex, p->sname, bsize(p));
+           geninfo(p);
+       }
+    }
+}
+
+pstab(name, type)
+char *name;
+int type;
+{
+    register int i;
+    register char c;
+
+    if (!gdebug) {
+       return;
+    } else if (oldway) {
+       old_pstab(name, type);
+       return;
+    }
+    /* locctr(PROG);  /* .stabs must appear in .text for c2 */
+#ifdef ASSTRINGS
+    if ( name[0] == '\0')
+       printf("\t.stabn\t");
+    else
+#ifndef FLEXNAMES
+       printf("\t.stabs\t\"%.8s\",", name);
+#else
+       printf("\t.stabs\t\"%s\",", name);
+#endif
+#else
+    printf("    .stab   ");
+    for(i=0; i<8; i++) 
+       if (c = name[i]) printf("'%c,", c);
+       else printf("0,");
+#endif
+    printf("0%o,", type);
+}
+
+#ifdef STABDOT
+pstabdot(type, value)
+int type;
+int value;
+{
+    if ( ! gdebug) {
+       return;
+    } else if (oldway) {
+       old_pstabdot(type, value);
+       return;
+    }
+    /* locctr(PROG);  /* .stabs must appear in .text for c2 */
+    printf("\t.stabd\t");
+    printf("0%o,0,0%o\n",type, value);
+}
+#endif
+
+extern char NULLNAME[8];
+extern int  labelno;
+extern int  fdefflag;
+
+psline()
+{
+    static int lastlineno;
+    register char *cp, *cq;
+    register int i;
+    
+    if (!gdebug) {
+       return;
+    } else if (oldway) {
+       old_psline();
+       return;
+    }
+
+    cq = ititle;
+    cp = ftitle;
+
+    while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
+    if ( *cp == '\0' ) goto eq;
+    
+neq:    for (i=0; i<100; i++)
+       ititle[i] = '\0';
+    cp = ftitle;
+    cq = ititle;
+    while ( *cp )  
+       *cq++ = *cp++;
+    *cq = '\0';
+    *--cq = '\0';
+#ifndef FLEXNAMES
+    for ( cp = ititle+1; *(cp-1); cp += 8 ) {
+       pstab(cp, N_SOL);
+       if (gdebug) printf("0,0,LL%d\n", labelno);
+    }
+#else
+    pstab(ititle+1, N_SOL);
+    if (gdebug) printf("0,0,LL%d\n", labelno);
+#endif
+    *cq = '"';
+    printf("LL%d:\n", labelno++);
+
+eq: if (lineno == lastlineno) return;
+    lastlineno = lineno;
+
+    if (fdefflag) {
+#ifdef STABDOT
+       pstabdot(N_SLINE, lineno);
+#else
+       pstab(NULLNAME, N_SLINE);
+       printf("0,%d,LL%d\n", lineno, labelno);
+       printf("LL%d:\n", labelno++);
+#endif
+    }
+}
+    
+plcstab(level)
+int level;
+{
+    if (!gdebug) {
+       return;
+    } else if (oldway) {
+       old_plcstab(level);
+       return;
+    }
+#ifdef STABDOT
+    pstabdot(N_LBRAC, level);
+#else
+    pstab(NULLNAME, N_LBRAC);
+    printf("0,%d,LL%d\n", level, labelno);
+    printf("LL%d:\n", labelno++);
+#endif
+}
+    
+prcstab(level)
+int level;
+{
+    if (!gdebug) {
+       return;
+    } else if (oldway) {
+       old_prcstab(level);
+       return;
+    }
+#ifdef STABDOT
+    pstabdot(N_RBRAC, level);
+#else
+    pstab(NULLNAME, N_RBRAC);
+    printf("0,%d,LL%d\n", level, labelno);
+    printf("LL%d:\n", labelno++);
+#endif
+}
+    
+pfstab(sname) 
+char *sname;
+{
+    register struct symtab *p;
+
+    if (gdebug) {
+       if (oldway) {
+           old_pfstab(sname);
+       } else {
+           p = &stab[lookup(sname, 0)];
+           printf("\t.stabs\t\"%s:", p->sname);
+           putchar((p->sclass == STATIC) ? 'f' : 'F');
+           gentype(p);
+           geninfo(p);
+       }
+    }
+}
+
+/*
+ * Old way of doing things.
+ */
+
+private old_fixarg(p)
+struct symtab *p; {
+       if (gdebug) {
+               old_pstab(p->sname, N_PSYM);
+               if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
+               old_poffs(p);
+       }
+}
+
+private old_outstab(p)
+struct symtab *p; {
+       register TWORD ptype;
+       register char *pname;
+       register char pclass;
+       register int poffset;
+
+       if (!gdebug) return;
+
+       ptype = p->stype;
+       pname = p->sname;
+       pclass = p->sclass;
+       poffset = p->offset;
+
+       if (ISFTN(ptype)) {
+               return;
+       }
+       
+       switch (pclass) {
+       
+       case AUTO:
+               old_pstab(pname, N_LSYM);
+               printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
+               old_poffs(p);
+               return;
+       
+       case EXTDEF:
+       case EXTERN:
+               old_pstab(pname, N_GSYM);
+               printf("0,%d,0\n", ptype);
+               old_poffs(p);
+               return;
+                       
+       case STATIC:
+#ifdef LCOMM
+               /* stabLCSYM is 1 during nidcl so we can get stab type right */
+               old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
+#else
+               old_pstab(pname, N_STSYM);
+#endif
+               if (p->slevel > 1) {
+                       printf("0,%d,L%d\n", ptype, poffset);
+               } else {
+                       printf("0,%d,%s\n", ptype, exname(pname));
+               }
+               old_poffs(p);
+               return;
+       
+       case REGISTER:
+               old_pstab(pname, N_RSYM);
+               printf("0,%d,%d\n", ptype, poffset);
+               old_poffs(p);
+               return;
+       
+       case MOS:
+       case MOU:
+               old_pstab(pname, N_SSYM);
+               printf("0,%d,%d\n", ptype, poffset/SZCHAR);
+               old_poffs(p);
+               return;
+       
+       case PARAM:
+               /* parameter stab entries are processed in dclargs() */
+               return;
+       
+       default:
+#ifndef FLEXNAMES
+               if (ddebug) printf("    No .stab for %.8s\n", pname);
+#else
+               if (ddebug) printf("    No .stab for %s\n", pname);
+#endif
+               
+       }
+}
+
+private old_pstab(name, type)
+char *name;
+int type; {
+       register int i;
+       register char c;
+       if (!gdebug) return;
+       /* locctr(PROG);  /* .stabs must appear in .text for c2 */
+#ifdef ASSTRINGS
+       if ( name[0] == '\0')
+               printf("\t.stabn\t");
+       else
+#ifndef FLEXNAMES
+               printf("\t.stabs\t\"%.8s\", ", name);
+#else
+               printf("\t.stabs\t\"%s\", ", name);
+#endif
+#else
+       printf("        .stab   ");
+       for(i=0; i<8; i++) 
+               if (c = name[i]) printf("'%c,", c);
+               else printf("0,");
+#endif
+       printf("0%o,", type);
+}
+
+#ifdef STABDOT
+private old_pstabdot(type, value)
+       int     type;
+       int     value;
+{
+       if ( ! gdebug) return;
+       /* locctr(PROG);  /* .stabs must appear in .text for c2 */
+       printf("\t.stabd\t");
+       printf("0%o,0,0%o\n",type, value);
+}
+#endif
+
+private old_poffs(p)
+register struct symtab *p; {
+       int s;
+       if (!gdebug) return;
+       if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
+               old_pstab(p->sname, N_LENG);
+               printf("1,0,%d\n", s);
+       }
+}
+
+private old_psline() {
+       static int lastlineno;
+       register char *cp, *cq;
+       register int i;
+       
+       if (!gdebug) return;
+
+       cq = ititle;
+       cp = ftitle;
+
+       while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
+       if ( *cp == '\0' ) goto eq;
+       
+neq:   for (i=0; i<100; i++)
+               ititle[i] = '\0';
+       cp = ftitle;
+       cq = ititle;
+       while ( *cp )  
+               *cq++ = *cp++;
+       *cq = '\0';
+       *--cq = '\0';
+#ifndef FLEXNAMES
+       for ( cp = ititle+1; *(cp-1); cp += 8 ) {
+               old_pstab(cp, N_SOL);
+               if (gdebug) printf("0,0,LL%d\n", labelno);
+               }
+#else
+       old_pstab(ititle+1, N_SOL);
+       if (gdebug) printf("0,0,LL%d\n", labelno);
+#endif
+       *cq = '"';
+       printf("LL%d:\n", labelno++);
+
+eq:    if (lineno == lastlineno) return;
+       lastlineno = lineno;
+
+       if (fdefflag) {
+#ifdef STABDOT
+               old_pstabdot(N_SLINE, lineno);
+#else
+               old_pstab(NULLNAME, N_SLINE);
+               printf("0,%d,LL%d\n", lineno, labelno);
+               printf("LL%d:\n", labelno++);
+#endif
+               }
+       }
+       
+private old_plcstab(level) {
+       if (!gdebug) return;
+#ifdef STABDOT
+       old_pstabdot(N_LBRAC, level);
+#else
+       old_pstab(NULLNAME, N_LBRAC);
+       printf("0,%d,LL%d\n", level, labelno);
+       printf("LL%d:\n", labelno++);
+#endif
+       }
+       
+private old_prcstab(level) {
+       if (!gdebug) return;
+#ifdef STABDOT
+       pstabdot(N_RBRAC, level);
+#else
+       pstab(NULLNAME, N_RBRAC);
+       printf("0,%d,LL%d\n", level, labelno);
+       printf("LL%d:\n", labelno++);
+#endif
+       }
+       
+private old_pfstab(sname) 
+char *sname; {
+       if (!gdebug) return;
+       pstab(sname, N_FUN);
+#ifndef FLEXNAMES
+       printf("0,%d,_%.7s\n", lineno, sname);
+#else
+       printf("0,%d,_%s\n", lineno, sname);
+#endif
+}