xref: /csrg-svn/old/pcc/ccom.vax/stab.c (revision 18557)
114574Ssam #ifndef lint
2*18557Sralph static char *sccsid ="@(#)stab.c	1.11 (Berkeley) 04/02/85";
314574Ssam #endif
49703Slinton /*
59703Slinton  * Symbolic debugging info interface.
69703Slinton  *
79703Slinton  * Here we generate pseudo-ops that cause the assembler to put
89703Slinton  * symbolic debugging information into the object file.
99703Slinton  */
109703Slinton 
11*18557Sralph #include "pass1.h"
129703Slinton 
139703Slinton #include <sys/types.h>
149703Slinton #include <a.out.h>
159703Slinton #include <stab.h>
169703Slinton 
179703Slinton #define private static
189703Slinton #define and &&
199703Slinton #define or ||
209703Slinton #define not !
219703Slinton #define div /
229703Slinton #define mod %
239703Slinton #define nil 0
249703Slinton 
259703Slinton #define bytes(bits) ((bits) / SZCHAR)
269703Slinton #define bsize(p) bytes(dimtab[p->sizoff])	/* size in bytes of a symbol */
279703Slinton 
289703Slinton #define NILINDEX -1
299703Slinton #define FORWARD -2
309703Slinton 
3110675Slinton typedef int Boolean;
329703Slinton 
3310675Slinton #define false 0
3410675Slinton #define true 1
3510675Slinton 
369703Slinton extern int ddebug;
379703Slinton extern int gdebug;
389703Slinton extern char *malloc();
399703Slinton 
409703Slinton int stabLCSYM;
419703Slinton 
429703Slinton /*
439814Slinton  * Flag for producing either sdb or dbx symbol information.
449814Slinton  */
459904Ssam int oldway = false;
469814Slinton 
479814Slinton /*
489703Slinton  * Generate debugging info for a parameter.
499703Slinton  * The offset isn't known when it is first entered into the symbol table
509703Slinton  * since the types are read later.
519703Slinton  */
529703Slinton 
539703Slinton fixarg(p)
549703Slinton struct symtab *p;
559703Slinton {
569814Slinton     if (oldway) {
579814Slinton 	old_fixarg(p);
589814Slinton     } else if (gdebug) {
599703Slinton 	printf("\t.stabs\t\"%s:p", p->sname);
609703Slinton 	gentype(p);
619703Slinton 	printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
629703Slinton     }
639703Slinton }
649703Slinton 
659703Slinton /*
6613941Slinton  * Determine if the given symbol is a global array with dimension 0,
6713941Slinton  * which only makes sense if it's dimension is to be given later.
6813941Slinton  * We therefore currently do not generate symbol information for
6913941Slinton  * such entries.
7013941Slinton  */
7113941Slinton 
7213941Slinton #define isglobal(class) ( \
7313941Slinton     class == EXTDEF or class == EXTERN or class == STATIC \
7413941Slinton )
7513941Slinton 
7613941Slinton private Boolean zero_length_array(p)
7713941Slinton register struct symtab *p;
7813941Slinton {
7913941Slinton     Boolean b;
8013941Slinton     int t;
8113941Slinton 
8213941Slinton     if (not isglobal(p->sclass)) {
8313941Slinton 	b = false;
8413941Slinton     } else {
8513941Slinton 	t = p->stype;
8613941Slinton 	if (ISFTN(t)) {
8713941Slinton 	    t = DECREF(t);
8813941Slinton 	}
8913941Slinton 	b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0);
9013941Slinton     }
9113941Slinton     return b;
9213941Slinton }
9313941Slinton 
9413941Slinton /*
959703Slinton  * Generate debugging info for a given symbol.
969703Slinton  */
979703Slinton 
989703Slinton outstab(sym)
999703Slinton struct symtab *sym;
1009703Slinton {
1019703Slinton     register struct symtab *p;
1029703Slinton     char *classname;
1039703Slinton     int offset;
1049703Slinton     Boolean ignore;
1059703Slinton     static Boolean firsttime = true;
1069703Slinton 
1079814Slinton     if (oldway) {
1089814Slinton 	old_outstab(sym);
10913941Slinton     } else if (gdebug and not zero_length_array(sym)) {
1109703Slinton 	if (firsttime) {
1119703Slinton 	    firsttime = false;
1129703Slinton 	    inittypes();
1139703Slinton 	}
1149703Slinton 	ignore = false;
1159703Slinton 	p = sym;
1169703Slinton 	offset = bytes(p->offset);
1179703Slinton 	switch (p->sclass) {
1189703Slinton 	case REGISTER:
1199703Slinton 	    classname = "r";
1209703Slinton 	    offset = p->offset;
1219703Slinton 	    break;
1229703Slinton 
1239703Slinton 	/*
1249703Slinton 	 * Locals are the default class.
1259703Slinton 	 */
1269703Slinton 	case AUTO:
1279703Slinton 	    classname = "";
1289703Slinton 	    break;
1299703Slinton 
1309703Slinton 	case STATIC:
1319703Slinton 	    if (ISFTN(p->stype)) {
1329703Slinton 		ignore = true;
1339703Slinton 	    } else if (p->slevel <= 1) {
1349703Slinton 		classname = "S";
1359703Slinton 	    } else {
1369703Slinton 		classname = "V";
1379703Slinton 	    }
1389703Slinton 	    break;
1399703Slinton 
1409703Slinton 	case EXTDEF:
1419703Slinton 	case EXTERN:
1429703Slinton 	    if (ISFTN(p->stype)) {
1439703Slinton 		ignore = true;
1449703Slinton 	    } else {
1459703Slinton 		classname = "G";
1469703Slinton 	    }
1479703Slinton 	    break;
1489703Slinton 
1499703Slinton 	case TYPEDEF:
1509703Slinton 	    classname = "t";
1519703Slinton 	    break;
1529703Slinton 
1539703Slinton 	case PARAM:
1549703Slinton 	case MOS:
1559703Slinton 	case MOU:
1569703Slinton 	case MOE:
1579703Slinton 	    ignore = true;
1589703Slinton 	    break;
1599703Slinton 
1609703Slinton 	case ENAME:
1619703Slinton 	case UNAME:
1629703Slinton 	case STNAME:
1639703Slinton 	    entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
1649703Slinton 	    ignore = true;
1659703Slinton 	    break;
1669703Slinton 
1679703Slinton 	default:
1689703Slinton 	    if ((p->sclass&FIELD) == 0) {
1699703Slinton 		printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
1709703Slinton 	    }
1719703Slinton 	    ignore = true;
1729703Slinton 	    break;
1739703Slinton 	}
1749703Slinton 	if (not ignore) {
1759703Slinton 	    printf("\t.stabs\t\"%s:%s", p->sname, classname);
1769703Slinton 	    gentype(p);
1779703Slinton 	    geninfo(p);
1789703Slinton 	}
1799703Slinton     }
1809703Slinton }
1819703Slinton 
1829703Slinton /*
1839703Slinton  * Since type names are lost in the travels and because C has
1849703Slinton  * structural type equivalence we keep a table of type words that
1859703Slinton  * we've already seen.  The first time we see a type, it is assigned
1869703Slinton  * (inline) a number and future references just list that number.
1879703Slinton  * Structures, unions, enums, and arrays must be handled carefully
1889703Slinton  * since not all the necessary information is in the type word.
1899703Slinton  */
1909703Slinton 
1919703Slinton typedef struct Typeid *Typeid;
1929703Slinton 
1939703Slinton struct Typeid {
1949703Slinton     TWORD tword;
1959703Slinton     int tarray;
1969703Slinton     int tstruct;
1979703Slinton     int tstrtag;
1989703Slinton     int tnum;
1999703Slinton     Typeid chain;
2009703Slinton };
2019703Slinton 
2029703Slinton #define TABLESIZE 2003
2039703Slinton 
2049703Slinton private int tcount = 1;
2059703Slinton private int t_int, t_char;
2069703Slinton private Typeid typetable[TABLESIZE];
2079703Slinton 
2089703Slinton /*
2099703Slinton  * Look for the given type word in the type table.
2109703Slinton  */
2119703Slinton 
2129703Slinton private Typeid typelookup(type, arrindex, strindex, strtag)
2139703Slinton TWORD type;
2149703Slinton int arrindex;
2159703Slinton int strindex;
2169703Slinton int strtag;
2179703Slinton {
2189703Slinton     register TWORD tword;
2199703Slinton     register int i1, i2;
2209703Slinton     Typeid t;
2219703Slinton 
2229703Slinton     t = typetable[type mod TABLESIZE];
2239703Slinton     while (t != nil) {
2249703Slinton 	if (t->tword == type and
2259703Slinton 	  strindex == t->tstruct and strtag == t->tstrtag) {
2269703Slinton 	    if (arrindex == NILINDEX) {
2279703Slinton 		break;
2289703Slinton 	    } else {
22911872Slinton 		tword = type;
2309703Slinton 		i1 = arrindex;
2319703Slinton 		i2 = t->tarray;
2329703Slinton 		while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
2339703Slinton 		    ++i1;
2349703Slinton 		    ++i2;
2359703Slinton 		    tword >>= TSHIFT;
2369703Slinton 		}
2379703Slinton 		if (!ISARY(tword)) {
2389703Slinton 		    break;
2399703Slinton 		}
2409703Slinton 	    }
2419703Slinton 	}
2429703Slinton 	t = t->chain;
2439703Slinton     }
2449703Slinton     return t;
2459703Slinton }
2469703Slinton 
2479703Slinton /*
2489703Slinton  * Enter a type word and associated symtab indices into the type table.
2499703Slinton  */
2509703Slinton 
2519703Slinton private int entertype(type, arrindex, strindex, strtag)
2529703Slinton TWORD type;
2539703Slinton int arrindex;
2549703Slinton int strindex;
2559703Slinton int strtag;
2569703Slinton {
2579703Slinton     register Typeid t;
2589703Slinton     register int i;
2599703Slinton 
2609703Slinton     t = (Typeid) malloc(sizeof(struct Typeid));
2619703Slinton     t->tword = type;
2629703Slinton     t->tarray = arrindex;
2639703Slinton     t->tstruct = strindex;
2649703Slinton     t->tstrtag = strtag;
2659703Slinton     t->tnum = tcount;
2669703Slinton     ++tcount;
2679703Slinton     i = type mod TABLESIZE;
2689703Slinton     t->chain = typetable[i];
2699703Slinton     typetable[i] = t;
2709703Slinton     return t->tnum;
2719703Slinton }
2729703Slinton 
2739703Slinton /*
2749703Slinton  * Change the information associated with a type table entry.
2759703Slinton  * Since I'm lazy this just creates a new entry with the number
2769703Slinton  * as the old one.
2779703Slinton  */
2789703Slinton 
2799703Slinton private reentertype(typeid, type, arrindex, strindex, strtag)
2809703Slinton Typeid typeid;
2819703Slinton TWORD type;
2829703Slinton int arrindex;
2839703Slinton int strindex;
2849703Slinton int strtag;
2859703Slinton {
2869703Slinton     register Typeid t;
2879703Slinton     register int i;
2889703Slinton 
2899703Slinton     t = (Typeid) malloc(sizeof(struct Typeid));
2909703Slinton     t->tword = type;
2919703Slinton     t->tarray = arrindex;
2929703Slinton     t->tstruct = strindex;
2939703Slinton     t->tstrtag = strtag;
2949703Slinton     t->tnum = typeid->tnum;
2959703Slinton     i = type mod TABLESIZE;
2969703Slinton     t->chain = typetable[i];
2979703Slinton     typetable[i] = t;
2989703Slinton }
2999703Slinton 
3009703Slinton /*
3019703Slinton  * Initialize type table with predefined types.
3029703Slinton  */
3039703Slinton 
3049703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
3059703Slinton 
3069703Slinton private inittypes()
3079703Slinton {
3089703Slinton     int t;
3099703Slinton 
3109703Slinton     t_int = builtintype(INT);
3119703Slinton     t_char = builtintype(CHAR);
3129703Slinton     maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
3139703Slinton     maketype("char", t_char, t_char, 0L, 127L);
3149703Slinton     maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
3159703Slinton     maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
3169703Slinton     maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
3179703Slinton     maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
3189703Slinton     maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
3199703Slinton     maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
3209703Slinton     maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
3219703Slinton     maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
3229703Slinton     t = builtintype(UNDEF);
3239703Slinton     printf("\t.stabs\t\"void:t%d=%d", t, t);
3249703Slinton     geninfo(nil);
32510675Slinton     t = builtintype(FARG);
32610675Slinton     printf("\t.stabs\t\"???:t%d=%d", t, t_int);
32710675Slinton     geninfo(nil);
3289703Slinton }
3299703Slinton 
3309703Slinton /*
3319703Slinton  * Generate info for a new range type.
3329703Slinton  */
3339703Slinton 
3349703Slinton private maketype(name, tnum, eqtnum, lower, upper)
3359703Slinton char *name;
3369703Slinton int tnum, eqtnum;
3379703Slinton long lower, upper;
3389703Slinton {
3399703Slinton     printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
3409703Slinton     geninfo(nil);
3419703Slinton }
3429703Slinton 
3439703Slinton /*
3449703Slinton  * Generate debugging information for the given type of the given symbol.
3459703Slinton  */
3469703Slinton 
3479703Slinton private gentype(sym)
3489703Slinton struct symtab *sym;
3499703Slinton {
3509703Slinton     register struct symtab *p;
3519703Slinton     register TWORD t;
3529703Slinton     register TWORD basictype;
3539703Slinton     register Typeid typeid;
3549703Slinton     int i, arrindex, strindex, strtag;
3559703Slinton 
3569703Slinton     p = sym;
3579703Slinton     t = p->stype;
3589703Slinton     if (ISFTN(t)) {
3599703Slinton 	t = DECREF(t);
3609703Slinton     }
3619703Slinton     basictype = BTYPE(t);
3629703Slinton     if (ISARY(t)) {
3639703Slinton 	arrindex = p->dimoff;
3649703Slinton     } else {
3659703Slinton 	arrindex = NILINDEX;
3669703Slinton     }
3679703Slinton     if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
3689703Slinton 	strindex = dimtab[p->sizoff + 1];
3699703Slinton 	if (strindex == -1) {
3709703Slinton 	    strindex = FORWARD;
3719703Slinton 	    strtag = dimtab[p->sizoff + 3];
3729703Slinton 	} else {
3739703Slinton 	    strtag = NILINDEX;
3749703Slinton 	}
3759703Slinton     } else {
3769703Slinton 	strindex = NILINDEX;
3779703Slinton 	strtag = NILINDEX;
3789703Slinton     }
3799703Slinton     i = arrindex;
3809703Slinton     typeid = typelookup(t, arrindex, strindex, strtag);
3819703Slinton     while (t != basictype and typeid == nil) {
3829703Slinton 	printf("%d=", entertype(t, i, strindex, strtag));
3839703Slinton 	switch (t&TMASK) {
3849703Slinton 	case PTR:
3859703Slinton 	    printf("*");
3869703Slinton 	    break;
3879703Slinton 
3889703Slinton 	case FTN:
3899703Slinton 	    printf("f");
3909703Slinton 	    break;
3919703Slinton 
3929703Slinton 	case ARY:
3939703Slinton 	    printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
3949703Slinton 	    break;
3959703Slinton 	}
3969703Slinton 	t = DECREF(t);
3979703Slinton 	if (t == basictype) {
3989703Slinton 	    typeid = typelookup(t, NILINDEX, strindex, strtag);
3999703Slinton 	} else {
4009703Slinton 	    typeid = typelookup(t, i, strindex, strtag);
4019703Slinton 	}
4029703Slinton     }
4039703Slinton     if (typeid == nil) {
4049703Slinton 	if (strindex == FORWARD) {
4059703Slinton 	    typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
4069703Slinton 	    if (typeid == nil) {
4079703Slinton 		cerror("unbelievable forward reference");
4089703Slinton 	    }
4099703Slinton 	    printf("%d", typeid->tnum);
4109703Slinton 	} else {
4119703Slinton 	    genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
4129703Slinton 	}
4139703Slinton     } else {
4149703Slinton 	printf("%d", typeid->tnum);
4159703Slinton     }
4169703Slinton }
4179703Slinton 
4189703Slinton /*
4199703Slinton  * Generate type information for structures, unions, and enumerations.
4209703Slinton  */
4219703Slinton 
4229703Slinton private genstruct(t, structid, index, name, size)
4239703Slinton TWORD t;
4249703Slinton int structid;
4259703Slinton int index;
4269703Slinton char *name;
4279703Slinton int size;
4289703Slinton {
4299703Slinton     register int i;
4309703Slinton     register struct symtab *field;
4319703Slinton     int id;
4329703Slinton 
4339703Slinton     if (structid == NILINDEX) {
4349703Slinton 	id = entertype(t, NILINDEX, index, NILINDEX);
4359703Slinton     } else {
4369703Slinton 	id = structid;
4379703Slinton     }
4389703Slinton     switch (t) {
4399703Slinton     case STRTY:
4409703Slinton     case UNIONTY:
4419703Slinton 	printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
4429703Slinton 	i = index;
4439703Slinton 	while (dimtab[i] != -1) {
4449703Slinton 	    field = &stab[dimtab[i]];
4459703Slinton 	    printf("%s:", field->sname);
4469703Slinton 	    gentype(field);
4479703Slinton 	    if (field->sclass > FIELD) {
4489703Slinton 		printf(",%d,%d;", field->offset, field->sclass - FIELD);
4499703Slinton 	    } else {
4509703Slinton 		printf(",%d,%d;", field->offset,
4519703Slinton 		    tsize(field->stype, field->dimoff, field->sizoff));
4529703Slinton 	    }
4539703Slinton 	    ++i;
4549703Slinton 	}
4559703Slinton 	putchar(';');
4569703Slinton 	break;
4579703Slinton 
4589703Slinton     case ENUMTY:
4599703Slinton 	printf("%d=e", id);
4609703Slinton 	i = index;
4619703Slinton 	while (dimtab[i] != -1) {
4629703Slinton 	    field = &stab[dimtab[i]];
4639703Slinton 	    printf("%s:%d,", field->sname, field->offset);
4649703Slinton 	    i++;
4659703Slinton 	}
46615275Ssam 	putchar(';');
4679703Slinton 	break;
4689703Slinton 
4699703Slinton     default:
4709703Slinton 	cerror("couldn't find basic type %d for %s\n", t, name);
4719703Slinton 	break;
4729703Slinton     }
4739703Slinton }
4749703Slinton 
4759703Slinton /*
4769703Slinton  * Generate offset and size info.
4779703Slinton  */
4789703Slinton 
4799703Slinton private geninfo(p)
4809703Slinton register struct symtab *p;
4819703Slinton {
48214437Slinton     int stabtype;
48314437Slinton 
4849703Slinton     if (p == nil) {
4859703Slinton 	printf("\",0x%x,0,0,0\n", N_LSYM);
4869703Slinton     } else {
4879703Slinton 	switch (p->sclass) {
4889703Slinton 	    case EXTERN:
4899703Slinton 	    case EXTDEF:
4909703Slinton 		if (ISFTN(p->stype)) {
4919703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
4929703Slinton 		} else {
49310675Slinton 		    printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p));
4949703Slinton 		}
4959703Slinton 		break;
4969703Slinton 
4979703Slinton 	    case STATIC:
49814437Slinton 		stabtype = stabLCSYM ? N_LCSYM : N_STSYM;
4999703Slinton 		if (ISFTN(p->stype)) {
5009703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
5019703Slinton 		} else if (p->slevel > 1) {
50214437Slinton 		    printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset);
5039703Slinton 		} else {
50414437Slinton 		    printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname);
5059703Slinton 		}
5069703Slinton 		break;
5079703Slinton 
5089703Slinton 	    case REGISTER:
5099703Slinton 		printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
5109703Slinton 		break;
5119703Slinton 
5129703Slinton 	    case PARAM:
5139703Slinton 		printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
5149703Slinton 		break;
5159703Slinton 
5169703Slinton 	    default:
5179703Slinton 		printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
5189703Slinton 		break;
5199703Slinton 	}
5209703Slinton     }
5219703Slinton }
5229703Slinton 
5239703Slinton /*
5249703Slinton  * Generate information for a newly-defined structure.
5259703Slinton  */
5269703Slinton 
5279703Slinton outstruct(szindex, paramindex)
5289703Slinton int szindex, paramindex;
5299703Slinton {
5309703Slinton     register Typeid typeid;
5319703Slinton     register struct symtab *p;
5329703Slinton     register int i, t, strindex;
5339703Slinton 
5349814Slinton     if (oldway) {
5359814Slinton 	/* do nothing */;
5369814Slinton     } else if (gdebug) {
5379703Slinton 	i = dimtab[szindex + 3];
5389703Slinton 	p = &stab[i];
5399703Slinton 	if (p->sname != nil) {
5409703Slinton 	    strindex = dimtab[p->sizoff + 1];
5419703Slinton 	    typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
5429703Slinton 	    if (typeid == nil) {
5439703Slinton 		t = 0;
5449703Slinton 	    } else {
5459703Slinton 		t = typeid->tnum;
5469703Slinton 		reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
5479703Slinton 	    }
5489703Slinton 	    printf("\t.stabs\t\"%s:T", p->sname);
5499703Slinton 	    genstruct(p->stype, t, strindex, p->sname, bsize(p));
5509703Slinton 	    geninfo(p);
5519703Slinton 	}
5529703Slinton     }
5539703Slinton }
5549703Slinton 
5559703Slinton pstab(name, type)
5569703Slinton char *name;
5579703Slinton int type;
5589703Slinton {
5599703Slinton     register int i;
5609703Slinton     register char c;
5619814Slinton 
5629814Slinton     if (!gdebug) {
5639814Slinton 	return;
5649814Slinton     } else if (oldway) {
5659814Slinton 	old_pstab(name, type);
5669814Slinton 	return;
5679814Slinton     }
5689703Slinton     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
5699703Slinton #ifdef ASSTRINGS
5709703Slinton     if ( name[0] == '\0')
5719703Slinton 	printf("\t.stabn\t");
5729703Slinton     else
5739703Slinton #ifndef FLEXNAMES
5749703Slinton 	printf("\t.stabs\t\"%.8s\",", name);
5759703Slinton #else
5769703Slinton 	printf("\t.stabs\t\"%s\",", name);
5779703Slinton #endif
5789703Slinton #else
5799703Slinton     printf("    .stab   ");
5809703Slinton     for(i=0; i<8; i++)
5819703Slinton 	if (c = name[i]) printf("'%c,", c);
5829703Slinton 	else printf("0,");
5839703Slinton #endif
5849703Slinton     printf("0%o,", type);
5859703Slinton }
5869703Slinton 
5879703Slinton #ifdef STABDOT
5889703Slinton pstabdot(type, value)
5899703Slinton int type;
5909703Slinton int value;
5919703Slinton {
5929814Slinton     if ( ! gdebug) {
5939814Slinton 	return;
5949814Slinton     } else if (oldway) {
5959814Slinton 	old_pstabdot(type, value);
5969814Slinton 	return;
5979814Slinton     }
5989703Slinton     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
5999703Slinton     printf("\t.stabd\t");
6009703Slinton     printf("0%o,0,0%o\n",type, value);
6019703Slinton }
6029703Slinton #endif
6039703Slinton 
6049703Slinton extern char NULLNAME[8];
6059703Slinton extern int  labelno;
6069703Slinton extern int  fdefflag;
6079703Slinton 
6089703Slinton psline()
6099703Slinton {
6109703Slinton     static int lastlineno;
6119703Slinton     register char *cp, *cq;
6129703Slinton     register int i;
6139703Slinton 
6149814Slinton     if (!gdebug) {
6159814Slinton 	return;
6169814Slinton     } else if (oldway) {
6179814Slinton 	old_psline();
6189814Slinton 	return;
6199814Slinton     }
6209703Slinton 
6219703Slinton     cq = ititle;
6229703Slinton     cp = ftitle;
6239703Slinton 
6249703Slinton     while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
6259703Slinton     if ( *cp == '\0' ) goto eq;
6269703Slinton 
6279703Slinton neq:    for (i=0; i<100; i++)
6289703Slinton 	ititle[i] = '\0';
6299703Slinton     cp = ftitle;
6309703Slinton     cq = ititle;
6319703Slinton     while ( *cp )
6329703Slinton 	*cq++ = *cp++;
6339703Slinton     *cq = '\0';
6349703Slinton     *--cq = '\0';
6359703Slinton #ifndef FLEXNAMES
6369703Slinton     for ( cp = ititle+1; *(cp-1); cp += 8 ) {
6379703Slinton 	pstab(cp, N_SOL);
6389703Slinton 	if (gdebug) printf("0,0,LL%d\n", labelno);
6399703Slinton     }
6409703Slinton #else
6419703Slinton     pstab(ititle+1, N_SOL);
6429703Slinton     if (gdebug) printf("0,0,LL%d\n", labelno);
6439703Slinton #endif
6449703Slinton     *cq = '"';
6459703Slinton     printf("LL%d:\n", labelno++);
6469703Slinton 
6479703Slinton eq: if (lineno == lastlineno) return;
6489703Slinton     lastlineno = lineno;
6499703Slinton 
6509703Slinton     if (fdefflag) {
6519703Slinton #ifdef STABDOT
6529703Slinton 	pstabdot(N_SLINE, lineno);
6539703Slinton #else
6549703Slinton 	pstab(NULLNAME, N_SLINE);
6559703Slinton 	printf("0,%d,LL%d\n", lineno, labelno);
6569703Slinton 	printf("LL%d:\n", labelno++);
6579703Slinton #endif
6589703Slinton     }
6599703Slinton }
6609703Slinton 
6619703Slinton plcstab(level)
6629703Slinton int level;
6639703Slinton {
6649814Slinton     if (!gdebug) {
6659814Slinton 	return;
6669814Slinton     } else if (oldway) {
6679814Slinton 	old_plcstab(level);
6689814Slinton 	return;
6699814Slinton     }
6709703Slinton #ifdef STABDOT
6719703Slinton     pstabdot(N_LBRAC, level);
6729703Slinton #else
6739703Slinton     pstab(NULLNAME, N_LBRAC);
6749703Slinton     printf("0,%d,LL%d\n", level, labelno);
6759703Slinton     printf("LL%d:\n", labelno++);
6769703Slinton #endif
6779703Slinton }
6789703Slinton 
6799703Slinton prcstab(level)
6809703Slinton int level;
6819703Slinton {
6829814Slinton     if (!gdebug) {
6839814Slinton 	return;
6849814Slinton     } else if (oldway) {
6859814Slinton 	old_prcstab(level);
6869814Slinton 	return;
6879814Slinton     }
6889703Slinton #ifdef STABDOT
6899703Slinton     pstabdot(N_RBRAC, level);
6909703Slinton #else
6919703Slinton     pstab(NULLNAME, N_RBRAC);
6929703Slinton     printf("0,%d,LL%d\n", level, labelno);
6939703Slinton     printf("LL%d:\n", labelno++);
6949703Slinton #endif
6959703Slinton }
6969703Slinton 
6979703Slinton pfstab(sname)
6989703Slinton char *sname;
6999703Slinton {
7009703Slinton     register struct symtab *p;
7019703Slinton 
7029703Slinton     if (gdebug) {
7039814Slinton 	if (oldway) {
7049814Slinton 	    old_pfstab(sname);
7059814Slinton 	} else {
7069814Slinton 	    p = &stab[lookup(sname, 0)];
7079814Slinton 	    printf("\t.stabs\t\"%s:", p->sname);
7089814Slinton 	    putchar((p->sclass == STATIC) ? 'f' : 'F');
7099814Slinton 	    gentype(p);
7109814Slinton 	    geninfo(p);
7119814Slinton 	}
7129703Slinton     }
7139703Slinton }
7149814Slinton 
7159814Slinton /*
7169814Slinton  * Old way of doing things.
7179814Slinton  */
7189814Slinton 
7199814Slinton private old_fixarg(p)
7209814Slinton struct symtab *p; {
7219814Slinton 	if (gdebug) {
7229814Slinton 		old_pstab(p->sname, N_PSYM);
7239814Slinton 		if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
7249814Slinton 		old_poffs(p);
7259814Slinton 	}
7269814Slinton }
7279814Slinton 
7289814Slinton private old_outstab(p)
7299814Slinton struct symtab *p; {
7309814Slinton 	register TWORD ptype;
7319814Slinton 	register char *pname;
7329814Slinton 	register char pclass;
7339814Slinton 	register int poffset;
7349814Slinton 
7359814Slinton 	if (!gdebug) return;
7369814Slinton 
7379814Slinton 	ptype = p->stype;
7389814Slinton 	pname = p->sname;
7399814Slinton 	pclass = p->sclass;
7409814Slinton 	poffset = p->offset;
7419814Slinton 
7429814Slinton 	if (ISFTN(ptype)) {
7439814Slinton 		return;
7449814Slinton 	}
7459814Slinton 
7469814Slinton 	switch (pclass) {
7479814Slinton 
7489814Slinton 	case AUTO:
7499814Slinton 		old_pstab(pname, N_LSYM);
7509814Slinton 		printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
7519814Slinton 		old_poffs(p);
7529814Slinton 		return;
7539814Slinton 
7549814Slinton 	case EXTDEF:
7559814Slinton 	case EXTERN:
7569814Slinton 		old_pstab(pname, N_GSYM);
7579814Slinton 		printf("0,%d,0\n", ptype);
7589814Slinton 		old_poffs(p);
7599814Slinton 		return;
7609814Slinton 
7619814Slinton 	case STATIC:
7629814Slinton #ifdef LCOMM
7639814Slinton 		/* stabLCSYM is 1 during nidcl so we can get stab type right */
7649814Slinton 		old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
7659814Slinton #else
7669814Slinton 		old_pstab(pname, N_STSYM);
7679814Slinton #endif
7689814Slinton 		if (p->slevel > 1) {
7699814Slinton 			printf("0,%d,L%d\n", ptype, poffset);
7709814Slinton 		} else {
7719814Slinton 			printf("0,%d,%s\n", ptype, exname(pname));
7729814Slinton 		}
7739814Slinton 		old_poffs(p);
7749814Slinton 		return;
7759814Slinton 
7769814Slinton 	case REGISTER:
7779814Slinton 		old_pstab(pname, N_RSYM);
7789814Slinton 		printf("0,%d,%d\n", ptype, poffset);
7799814Slinton 		old_poffs(p);
7809814Slinton 		return;
7819814Slinton 
7829814Slinton 	case MOS:
7839814Slinton 	case MOU:
7849814Slinton 		old_pstab(pname, N_SSYM);
7859814Slinton 		printf("0,%d,%d\n", ptype, poffset/SZCHAR);
7869814Slinton 		old_poffs(p);
7879814Slinton 		return;
7889814Slinton 
7899814Slinton 	case PARAM:
7909814Slinton 		/* parameter stab entries are processed in dclargs() */
7919814Slinton 		return;
7929814Slinton 
7939814Slinton 	default:
7949814Slinton #ifndef FLEXNAMES
7959814Slinton 		if (ddebug) printf("	No .stab for %.8s\n", pname);
7969814Slinton #else
7979814Slinton 		if (ddebug) printf("	No .stab for %s\n", pname);
7989814Slinton #endif
7999814Slinton 
8009814Slinton 	}
8019814Slinton }
8029814Slinton 
8039814Slinton private old_pstab(name, type)
8049814Slinton char *name;
8059814Slinton int type; {
8069814Slinton 	register int i;
8079814Slinton 	register char c;
8089814Slinton 	if (!gdebug) return;
8099814Slinton 	/* locctr(PROG);  /* .stabs must appear in .text for c2 */
8109814Slinton #ifdef ASSTRINGS
8119814Slinton 	if ( name[0] == '\0')
8129814Slinton 		printf("\t.stabn\t");
8139814Slinton 	else
8149814Slinton #ifndef FLEXNAMES
8159814Slinton 		printf("\t.stabs\t\"%.8s\", ", name);
8169814Slinton #else
8179814Slinton 		printf("\t.stabs\t\"%s\", ", name);
8189814Slinton #endif
8199814Slinton #else
8209814Slinton 	printf("	.stab	");
8219814Slinton 	for(i=0; i<8; i++)
8229814Slinton 		if (c = name[i]) printf("'%c,", c);
8239814Slinton 		else printf("0,");
8249814Slinton #endif
8259814Slinton 	printf("0%o,", type);
8269814Slinton }
8279814Slinton 
8289814Slinton #ifdef STABDOT
8299814Slinton private old_pstabdot(type, value)
8309814Slinton 	int	type;
8319814Slinton 	int	value;
8329814Slinton {
8339814Slinton 	if ( ! gdebug) return;
8349814Slinton 	/* locctr(PROG);  /* .stabs must appear in .text for c2 */
8359814Slinton 	printf("\t.stabd\t");
8369814Slinton 	printf("0%o,0,0%o\n",type, value);
8379814Slinton }
8389814Slinton #endif
8399814Slinton 
8409814Slinton private old_poffs(p)
8419814Slinton register struct symtab *p; {
8429814Slinton 	int s;
8439814Slinton 	if (!gdebug) return;
8449814Slinton 	if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
8459814Slinton 		old_pstab(p->sname, N_LENG);
8469814Slinton 		printf("1,0,%d\n", s);
8479814Slinton 	}
8489814Slinton }
8499814Slinton 
8509814Slinton private old_psline() {
8519814Slinton 	static int lastlineno;
8529814Slinton 	register char *cp, *cq;
8539814Slinton 	register int i;
8549814Slinton 
8559814Slinton 	if (!gdebug) return;
8569814Slinton 
8579814Slinton 	cq = ititle;
8589814Slinton 	cp = ftitle;
8599814Slinton 
8609814Slinton 	while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
8619814Slinton 	if ( *cp == '\0' ) goto eq;
8629814Slinton 
8639814Slinton neq:	for (i=0; i<100; i++)
8649814Slinton 		ititle[i] = '\0';
8659814Slinton 	cp = ftitle;
8669814Slinton 	cq = ititle;
8679814Slinton 	while ( *cp )
8689814Slinton 		*cq++ = *cp++;
8699814Slinton 	*cq = '\0';
8709814Slinton 	*--cq = '\0';
8719814Slinton #ifndef FLEXNAMES
8729814Slinton 	for ( cp = ititle+1; *(cp-1); cp += 8 ) {
8739814Slinton 		old_pstab(cp, N_SOL);
8749814Slinton 		if (gdebug) printf("0,0,LL%d\n", labelno);
8759814Slinton 		}
8769814Slinton #else
8779814Slinton 	old_pstab(ititle+1, N_SOL);
8789814Slinton 	if (gdebug) printf("0,0,LL%d\n", labelno);
8799814Slinton #endif
8809814Slinton 	*cq = '"';
8819814Slinton 	printf("LL%d:\n", labelno++);
8829814Slinton 
8839814Slinton eq:	if (lineno == lastlineno) return;
8849814Slinton 	lastlineno = lineno;
8859814Slinton 
8869814Slinton 	if (fdefflag) {
8879814Slinton #ifdef STABDOT
8889814Slinton 		old_pstabdot(N_SLINE, lineno);
8899814Slinton #else
8909814Slinton 		old_pstab(NULLNAME, N_SLINE);
8919814Slinton 		printf("0,%d,LL%d\n", lineno, labelno);
8929814Slinton 		printf("LL%d:\n", labelno++);
8939814Slinton #endif
8949814Slinton 		}
8959814Slinton 	}
8969814Slinton 
8979814Slinton private old_plcstab(level) {
8989814Slinton 	if (!gdebug) return;
8999814Slinton #ifdef STABDOT
9009814Slinton 	old_pstabdot(N_LBRAC, level);
9019814Slinton #else
9029814Slinton 	old_pstab(NULLNAME, N_LBRAC);
9039814Slinton 	printf("0,%d,LL%d\n", level, labelno);
9049814Slinton 	printf("LL%d:\n", labelno++);
9059814Slinton #endif
9069814Slinton 	}
9079814Slinton 
9089814Slinton private old_prcstab(level) {
9099814Slinton 	if (!gdebug) return;
9109814Slinton #ifdef STABDOT
9119814Slinton 	pstabdot(N_RBRAC, level);
9129814Slinton #else
9139814Slinton 	pstab(NULLNAME, N_RBRAC);
9149814Slinton 	printf("0,%d,LL%d\n", level, labelno);
9159814Slinton 	printf("LL%d:\n", labelno++);
9169814Slinton #endif
9179814Slinton 	}
9189814Slinton 
9199814Slinton private old_pfstab(sname)
9209814Slinton char *sname; {
9219814Slinton 	if (!gdebug) return;
9229814Slinton 	pstab(sname, N_FUN);
9239814Slinton #ifndef FLEXNAMES
9249814Slinton 	printf("0,%d,_%.7s\n", lineno, sname);
9259814Slinton #else
9269814Slinton 	printf("0,%d,_%s\n", lineno, sname);
9279814Slinton #endif
9289814Slinton }
929