xref: /csrg-svn/old/pcc/ccom.vax/stab.c (revision 9814)
19703Slinton /*
29703Slinton  * Symbolic debugging info interface.
39703Slinton  *
49703Slinton  * Here we generate pseudo-ops that cause the assembler to put
59703Slinton  * symbolic debugging information into the object file.
69703Slinton  */
79703Slinton 
8*9814Slinton static char *sccsid ="@(#)stab.c	1.2 (Berkeley) 12/18/82";
99703Slinton 
109703Slinton #include "mfile1"
119703Slinton 
129703Slinton #include <sys/types.h>
139703Slinton #include <a.out.h>
149703Slinton #include <stab.h>
159703Slinton 
169703Slinton #define private static
179703Slinton #define and &&
189703Slinton #define or ||
199703Slinton #define not !
209703Slinton #define div /
219703Slinton #define mod %
229703Slinton #define nil 0
239703Slinton 
249703Slinton #define bytes(bits) ((bits) / SZCHAR)
259703Slinton #define bsize(p) bytes(dimtab[p->sizoff])	/* size in bytes of a symbol */
269703Slinton 
279703Slinton #define NILINDEX -1
289703Slinton #define FORWARD -2
299703Slinton 
309703Slinton typedef enum { false, true } Boolean;
319703Slinton 
329703Slinton extern int ddebug;
339703Slinton extern int gdebug;
349703Slinton extern char *malloc();
359703Slinton 
369703Slinton int stabLCSYM;
379703Slinton 
389703Slinton /*
39*9814Slinton  * Flag for producing either sdb or dbx symbol information.
40*9814Slinton  */
41*9814Slinton 
42*9814Slinton Boolean oldway = false;
43*9814Slinton 
44*9814Slinton /*
459703Slinton  * Generate debugging info for a parameter.
469703Slinton  * The offset isn't known when it is first entered into the symbol table
479703Slinton  * since the types are read later.
489703Slinton  */
499703Slinton 
509703Slinton fixarg(p)
519703Slinton struct symtab *p;
529703Slinton {
53*9814Slinton     if (oldway) {
54*9814Slinton 	old_fixarg(p);
55*9814Slinton     } else if (gdebug) {
569703Slinton 	printf("\t.stabs\t\"%s:p", p->sname);
579703Slinton 	gentype(p);
589703Slinton 	printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
599703Slinton     }
609703Slinton }
619703Slinton 
629703Slinton /*
639703Slinton  * Generate debugging info for a given symbol.
649703Slinton  */
659703Slinton 
669703Slinton outstab(sym)
679703Slinton struct symtab *sym;
689703Slinton {
699703Slinton     register struct symtab *p;
709703Slinton     char *classname;
719703Slinton     int offset;
729703Slinton     Boolean ignore;
739703Slinton     static Boolean firsttime = true;
749703Slinton 
75*9814Slinton     if (oldway) {
76*9814Slinton 	old_outstab(sym);
77*9814Slinton     } else if (gdebug) {
789703Slinton 	if (firsttime) {
799703Slinton 	    firsttime = false;
809703Slinton 	    inittypes();
819703Slinton 	}
829703Slinton 	ignore = false;
839703Slinton 	p = sym;
849703Slinton 	offset = bytes(p->offset);
859703Slinton 	switch (p->sclass) {
869703Slinton 	case REGISTER:
879703Slinton 	    classname = "r";
889703Slinton 	    offset = p->offset;
899703Slinton 	    break;
909703Slinton 
919703Slinton 	/*
929703Slinton 	 * Locals are the default class.
939703Slinton 	 */
949703Slinton 	case AUTO:
959703Slinton 	    classname = "";
969703Slinton 	    break;
979703Slinton 
989703Slinton 	case STATIC:
999703Slinton 	    if (ISFTN(p->stype)) {
1009703Slinton 		ignore = true;
1019703Slinton 	    } else if (p->slevel <= 1) {
1029703Slinton 		classname = "S";
1039703Slinton 	    } else {
1049703Slinton 		classname = "V";
1059703Slinton 	    }
1069703Slinton 	    break;
1079703Slinton 
1089703Slinton 	case EXTDEF:
1099703Slinton 	case EXTERN:
1109703Slinton 	    if (ISFTN(p->stype)) {
1119703Slinton 		ignore = true;
1129703Slinton 	    } else {
1139703Slinton 		classname = "G";
1149703Slinton 	    }
1159703Slinton 	    break;
1169703Slinton 
1179703Slinton 	case TYPEDEF:
1189703Slinton 	    classname = "t";
1199703Slinton 	    break;
1209703Slinton 
1219703Slinton 	case PARAM:
1229703Slinton 	case MOS:
1239703Slinton 	case MOU:
1249703Slinton 	case MOE:
1259703Slinton 	    ignore = true;
1269703Slinton 	    break;
1279703Slinton 
1289703Slinton 	case ENAME:
1299703Slinton 	case UNAME:
1309703Slinton 	case STNAME:
1319703Slinton 	    entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
1329703Slinton 	    ignore = true;
1339703Slinton 	    break;
1349703Slinton 
1359703Slinton 	default:
1369703Slinton 	    if ((p->sclass&FIELD) == 0) {
1379703Slinton 		printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
1389703Slinton 	    }
1399703Slinton 	    ignore = true;
1409703Slinton 	    break;
1419703Slinton 	}
1429703Slinton 	if (not ignore) {
1439703Slinton 	    printf("\t.stabs\t\"%s:%s", p->sname, classname);
1449703Slinton 	    gentype(p);
1459703Slinton 	    geninfo(p);
1469703Slinton 	}
1479703Slinton     }
1489703Slinton }
1499703Slinton 
1509703Slinton /*
1519703Slinton  * Since type names are lost in the travels and because C has
1529703Slinton  * structural type equivalence we keep a table of type words that
1539703Slinton  * we've already seen.  The first time we see a type, it is assigned
1549703Slinton  * (inline) a number and future references just list that number.
1559703Slinton  * Structures, unions, enums, and arrays must be handled carefully
1569703Slinton  * since not all the necessary information is in the type word.
1579703Slinton  */
1589703Slinton 
1599703Slinton typedef struct Typeid *Typeid;
1609703Slinton 
1619703Slinton struct Typeid {
1629703Slinton     TWORD tword;
1639703Slinton     int tarray;
1649703Slinton     int tstruct;
1659703Slinton     int tstrtag;
1669703Slinton     int tnum;
1679703Slinton     Typeid chain;
1689703Slinton };
1699703Slinton 
1709703Slinton #define TABLESIZE 2003
1719703Slinton 
1729703Slinton private int tcount = 1;
1739703Slinton private int t_int, t_char;
1749703Slinton private Typeid typetable[TABLESIZE];
1759703Slinton 
1769703Slinton /*
1779703Slinton  * Look for the given type word in the type table.
1789703Slinton  */
1799703Slinton 
1809703Slinton private Typeid typelookup(type, arrindex, strindex, strtag)
1819703Slinton TWORD type;
1829703Slinton int arrindex;
1839703Slinton int strindex;
1849703Slinton int strtag;
1859703Slinton {
1869703Slinton     register TWORD tword;
1879703Slinton     register int i1, i2;
1889703Slinton     Typeid t;
1899703Slinton 
1909703Slinton     t = typetable[type mod TABLESIZE];
1919703Slinton     while (t != nil) {
1929703Slinton 	if (t->tword == type and
1939703Slinton 	  strindex == t->tstruct and strtag == t->tstrtag) {
1949703Slinton 	    if (arrindex == NILINDEX) {
1959703Slinton 		break;
1969703Slinton 	    } else {
1979703Slinton 		tword = type >> TSHIFT;
1989703Slinton 		i1 = arrindex;
1999703Slinton 		i2 = t->tarray;
2009703Slinton 		while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
2019703Slinton 		    ++i1;
2029703Slinton 		    ++i2;
2039703Slinton 		    tword >>= TSHIFT;
2049703Slinton 		}
2059703Slinton 		if (!ISARY(tword)) {
2069703Slinton 		    break;
2079703Slinton 		}
2089703Slinton 	    }
2099703Slinton 	}
2109703Slinton 	t = t->chain;
2119703Slinton     }
2129703Slinton     return t;
2139703Slinton }
2149703Slinton 
2159703Slinton /*
2169703Slinton  * Enter a type word and associated symtab indices into the type table.
2179703Slinton  */
2189703Slinton 
2199703Slinton private int entertype(type, arrindex, strindex, strtag)
2209703Slinton TWORD type;
2219703Slinton int arrindex;
2229703Slinton int strindex;
2239703Slinton int strtag;
2249703Slinton {
2259703Slinton     register Typeid t;
2269703Slinton     register int i;
2279703Slinton 
2289703Slinton     t = (Typeid) malloc(sizeof(struct Typeid));
2299703Slinton     t->tword = type;
2309703Slinton     t->tarray = arrindex;
2319703Slinton     t->tstruct = strindex;
2329703Slinton     t->tstrtag = strtag;
2339703Slinton     t->tnum = tcount;
2349703Slinton     ++tcount;
2359703Slinton     i = type mod TABLESIZE;
2369703Slinton     t->chain = typetable[i];
2379703Slinton     typetable[i] = t;
2389703Slinton     return t->tnum;
2399703Slinton }
2409703Slinton 
2419703Slinton /*
2429703Slinton  * Change the information associated with a type table entry.
2439703Slinton  * Since I'm lazy this just creates a new entry with the number
2449703Slinton  * as the old one.
2459703Slinton  */
2469703Slinton 
2479703Slinton private reentertype(typeid, type, arrindex, strindex, strtag)
2489703Slinton Typeid typeid;
2499703Slinton TWORD type;
2509703Slinton int arrindex;
2519703Slinton int strindex;
2529703Slinton int strtag;
2539703Slinton {
2549703Slinton     register Typeid t;
2559703Slinton     register int i;
2569703Slinton 
2579703Slinton     t = (Typeid) malloc(sizeof(struct Typeid));
2589703Slinton     t->tword = type;
2599703Slinton     t->tarray = arrindex;
2609703Slinton     t->tstruct = strindex;
2619703Slinton     t->tstrtag = strtag;
2629703Slinton     t->tnum = typeid->tnum;
2639703Slinton     i = type mod TABLESIZE;
2649703Slinton     t->chain = typetable[i];
2659703Slinton     typetable[i] = t;
2669703Slinton }
2679703Slinton 
2689703Slinton /*
2699703Slinton  * Initialize type table with predefined types.
2709703Slinton  */
2719703Slinton 
2729703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
2739703Slinton 
2749703Slinton private inittypes()
2759703Slinton {
2769703Slinton     int t;
2779703Slinton 
2789703Slinton     t_int = builtintype(INT);
2799703Slinton     t_char = builtintype(CHAR);
2809703Slinton     maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
2819703Slinton     maketype("char", t_char, t_char, 0L, 127L);
2829703Slinton     maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
2839703Slinton     maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
2849703Slinton     maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
2859703Slinton     maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
2869703Slinton     maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
2879703Slinton     maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
2889703Slinton     maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
2899703Slinton     maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
2909703Slinton     t = builtintype(UNDEF);
2919703Slinton     printf("\t.stabs\t\"void:t%d=%d", t, t);
2929703Slinton     geninfo(nil);
2939703Slinton }
2949703Slinton 
2959703Slinton /*
2969703Slinton  * Generate info for a new range type.
2979703Slinton  */
2989703Slinton 
2999703Slinton private maketype(name, tnum, eqtnum, lower, upper)
3009703Slinton char *name;
3019703Slinton int tnum, eqtnum;
3029703Slinton long lower, upper;
3039703Slinton {
3049703Slinton     printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
3059703Slinton     geninfo(nil);
3069703Slinton }
3079703Slinton 
3089703Slinton /*
3099703Slinton  * Generate debugging information for the given type of the given symbol.
3109703Slinton  */
3119703Slinton 
3129703Slinton private gentype(sym)
3139703Slinton struct symtab *sym;
3149703Slinton {
3159703Slinton     register struct symtab *p;
3169703Slinton     register TWORD t;
3179703Slinton     register TWORD basictype;
3189703Slinton     register Typeid typeid;
3199703Slinton     int i, arrindex, strindex, strtag;
3209703Slinton 
3219703Slinton     p = sym;
3229703Slinton     t = p->stype;
3239703Slinton     if (ISFTN(t)) {
3249703Slinton 	t = DECREF(t);
3259703Slinton     }
3269703Slinton     basictype = BTYPE(t);
3279703Slinton     if (ISARY(t)) {
3289703Slinton 	arrindex = p->dimoff;
3299703Slinton     } else {
3309703Slinton 	arrindex = NILINDEX;
3319703Slinton     }
3329703Slinton     if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
3339703Slinton 	strindex = dimtab[p->sizoff + 1];
3349703Slinton 	if (strindex == -1) {
3359703Slinton 	    strindex = FORWARD;
3369703Slinton 	    strtag = dimtab[p->sizoff + 3];
3379703Slinton 	} else {
3389703Slinton 	    strtag = NILINDEX;
3399703Slinton 	}
3409703Slinton     } else {
3419703Slinton 	strindex = NILINDEX;
3429703Slinton 	strtag = NILINDEX;
3439703Slinton     }
3449703Slinton     i = arrindex;
3459703Slinton     typeid = typelookup(t, arrindex, strindex, strtag);
3469703Slinton     while (t != basictype and typeid == nil) {
3479703Slinton 	printf("%d=", entertype(t, i, strindex, strtag));
3489703Slinton 	switch (t&TMASK) {
3499703Slinton 	case PTR:
3509703Slinton 	    printf("*");
3519703Slinton 	    break;
3529703Slinton 
3539703Slinton 	case FTN:
3549703Slinton 	    printf("f");
3559703Slinton 	    break;
3569703Slinton 
3579703Slinton 	case ARY:
3589703Slinton 	    printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
3599703Slinton 	    break;
3609703Slinton 	}
3619703Slinton 	t = DECREF(t);
3629703Slinton 	if (t == basictype) {
3639703Slinton 	    typeid = typelookup(t, NILINDEX, strindex, strtag);
3649703Slinton 	} else {
3659703Slinton 	    typeid = typelookup(t, i, strindex, strtag);
3669703Slinton 	}
3679703Slinton     }
3689703Slinton     if (typeid == nil) {
3699703Slinton 	if (strindex == FORWARD) {
3709703Slinton 	    typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
3719703Slinton 	    if (typeid == nil) {
3729703Slinton 		cerror("unbelievable forward reference");
3739703Slinton 	    }
3749703Slinton 	    printf("%d", typeid->tnum);
3759703Slinton 	} else {
3769703Slinton 	    genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
3779703Slinton 	}
3789703Slinton     } else {
3799703Slinton 	printf("%d", typeid->tnum);
3809703Slinton     }
3819703Slinton }
3829703Slinton 
3839703Slinton /*
3849703Slinton  * Generate type information for structures, unions, and enumerations.
3859703Slinton  */
3869703Slinton 
3879703Slinton private genstruct(t, structid, index, name, size)
3889703Slinton TWORD t;
3899703Slinton int structid;
3909703Slinton int index;
3919703Slinton char *name;
3929703Slinton int size;
3939703Slinton {
3949703Slinton     register int i;
3959703Slinton     register struct symtab *field;
3969703Slinton     int id;
3979703Slinton 
3989703Slinton     if (structid == NILINDEX) {
3999703Slinton 	id = entertype(t, NILINDEX, index, NILINDEX);
4009703Slinton     } else {
4019703Slinton 	id = structid;
4029703Slinton     }
4039703Slinton     switch (t) {
4049703Slinton     case STRTY:
4059703Slinton     case UNIONTY:
4069703Slinton 	printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
4079703Slinton 	i = index;
4089703Slinton 	while (dimtab[i] != -1) {
4099703Slinton 	    field = &stab[dimtab[i]];
4109703Slinton 	    printf("%s:", field->sname);
4119703Slinton 	    gentype(field);
4129703Slinton 	    if (field->sclass > FIELD) {
4139703Slinton 		printf(",%d,%d;", field->offset, field->sclass - FIELD);
4149703Slinton 	    } else {
4159703Slinton 		printf(",%d,%d;", field->offset,
4169703Slinton 		    tsize(field->stype, field->dimoff, field->sizoff));
4179703Slinton 	    }
4189703Slinton 	    ++i;
4199703Slinton 	}
4209703Slinton 	putchar(';');
4219703Slinton 	break;
4229703Slinton 
4239703Slinton     case ENUMTY:
4249703Slinton 	printf("%d=e", id);
4259703Slinton 	i = index;
4269703Slinton 	while (dimtab[i] != -1) {
4279703Slinton 	    field = &stab[dimtab[i]];
4289703Slinton 	    printf("%s:%d,", field->sname, field->offset);
4299703Slinton 	    i++;
4309703Slinton 	}
4319703Slinton 	break;
4329703Slinton 
4339703Slinton     default:
4349703Slinton 	cerror("couldn't find basic type %d for %s\n", t, name);
4359703Slinton 	break;
4369703Slinton     }
4379703Slinton }
4389703Slinton 
4399703Slinton /*
4409703Slinton  * Generate offset and size info.
4419703Slinton  */
4429703Slinton 
4439703Slinton private geninfo(p)
4449703Slinton register struct symtab *p;
4459703Slinton {
4469703Slinton     if (p == nil) {
4479703Slinton 	printf("\",0x%x,0,0,0\n", N_LSYM);
4489703Slinton     } else {
4499703Slinton 	switch (p->sclass) {
4509703Slinton 	    case EXTERN:
4519703Slinton 	    case EXTDEF:
4529703Slinton 		if (ISFTN(p->stype)) {
4539703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
4549703Slinton 		} else {
4559703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_GSYM, bsize(p), p->sname);
4569703Slinton 		}
4579703Slinton 		break;
4589703Slinton 
4599703Slinton 	    case STATIC:
4609703Slinton 		if (ISFTN(p->stype)) {
4619703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
4629703Slinton 		} else if (p->slevel > 1) {
4639703Slinton 		    printf("\",0x%x,0,%d,L%d\n", N_STSYM, bsize(p), p->offset);
4649703Slinton 		} else {
4659703Slinton 		    printf("\",0x%x,0,%d,_%s\n", N_LCSYM, bsize(p), p->sname);
4669703Slinton 		}
4679703Slinton 		break;
4689703Slinton 
4699703Slinton 	    case REGISTER:
4709703Slinton 		printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
4719703Slinton 		break;
4729703Slinton 
4739703Slinton 	    case PARAM:
4749703Slinton 		printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
4759703Slinton 		break;
4769703Slinton 
4779703Slinton 	    default:
4789703Slinton 		printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
4799703Slinton 		break;
4809703Slinton 	}
4819703Slinton     }
4829703Slinton }
4839703Slinton 
4849703Slinton /*
4859703Slinton  * Generate information for a newly-defined structure.
4869703Slinton  */
4879703Slinton 
4889703Slinton outstruct(szindex, paramindex)
4899703Slinton int szindex, paramindex;
4909703Slinton {
4919703Slinton     register Typeid typeid;
4929703Slinton     register struct symtab *p;
4939703Slinton     register int i, t, strindex;
4949703Slinton 
495*9814Slinton     if (oldway) {
496*9814Slinton 	/* do nothing */;
497*9814Slinton     } else if (gdebug) {
4989703Slinton 	i = dimtab[szindex + 3];
4999703Slinton 	p = &stab[i];
5009703Slinton 	if (p->sname != nil) {
5019703Slinton 	    strindex = dimtab[p->sizoff + 1];
5029703Slinton 	    typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
5039703Slinton 	    if (typeid == nil) {
5049703Slinton 		t = 0;
5059703Slinton 	    } else {
5069703Slinton 		t = typeid->tnum;
5079703Slinton 		reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
5089703Slinton 	    }
5099703Slinton 	    printf("\t.stabs\t\"%s:T", p->sname);
5109703Slinton 	    genstruct(p->stype, t, strindex, p->sname, bsize(p));
5119703Slinton 	    geninfo(p);
5129703Slinton 	}
5139703Slinton     }
5149703Slinton }
5159703Slinton 
5169703Slinton pstab(name, type)
5179703Slinton char *name;
5189703Slinton int type;
5199703Slinton {
5209703Slinton     register int i;
5219703Slinton     register char c;
522*9814Slinton 
523*9814Slinton     if (!gdebug) {
524*9814Slinton 	return;
525*9814Slinton     } else if (oldway) {
526*9814Slinton 	old_pstab(name, type);
527*9814Slinton 	return;
528*9814Slinton     }
5299703Slinton     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
5309703Slinton #ifdef ASSTRINGS
5319703Slinton     if ( name[0] == '\0')
5329703Slinton 	printf("\t.stabn\t");
5339703Slinton     else
5349703Slinton #ifndef FLEXNAMES
5359703Slinton 	printf("\t.stabs\t\"%.8s\",", name);
5369703Slinton #else
5379703Slinton 	printf("\t.stabs\t\"%s\",", name);
5389703Slinton #endif
5399703Slinton #else
5409703Slinton     printf("    .stab   ");
5419703Slinton     for(i=0; i<8; i++)
5429703Slinton 	if (c = name[i]) printf("'%c,", c);
5439703Slinton 	else printf("0,");
5449703Slinton #endif
5459703Slinton     printf("0%o,", type);
5469703Slinton }
5479703Slinton 
5489703Slinton #ifdef STABDOT
5499703Slinton pstabdot(type, value)
5509703Slinton int type;
5519703Slinton int value;
5529703Slinton {
553*9814Slinton     if ( ! gdebug) {
554*9814Slinton 	return;
555*9814Slinton     } else if (oldway) {
556*9814Slinton 	old_pstabdot(type, value);
557*9814Slinton 	return;
558*9814Slinton     }
5599703Slinton     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
5609703Slinton     printf("\t.stabd\t");
5619703Slinton     printf("0%o,0,0%o\n",type, value);
5629703Slinton }
5639703Slinton #endif
5649703Slinton 
5659703Slinton extern char NULLNAME[8];
5669703Slinton extern int  labelno;
5679703Slinton extern int  fdefflag;
5689703Slinton 
5699703Slinton psline()
5709703Slinton {
5719703Slinton     static int lastlineno;
5729703Slinton     register char *cp, *cq;
5739703Slinton     register int i;
5749703Slinton 
575*9814Slinton     if (!gdebug) {
576*9814Slinton 	return;
577*9814Slinton     } else if (oldway) {
578*9814Slinton 	old_psline();
579*9814Slinton 	return;
580*9814Slinton     }
5819703Slinton 
5829703Slinton     cq = ititle;
5839703Slinton     cp = ftitle;
5849703Slinton 
5859703Slinton     while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
5869703Slinton     if ( *cp == '\0' ) goto eq;
5879703Slinton 
5889703Slinton neq:    for (i=0; i<100; i++)
5899703Slinton 	ititle[i] = '\0';
5909703Slinton     cp = ftitle;
5919703Slinton     cq = ititle;
5929703Slinton     while ( *cp )
5939703Slinton 	*cq++ = *cp++;
5949703Slinton     *cq = '\0';
5959703Slinton     *--cq = '\0';
5969703Slinton #ifndef FLEXNAMES
5979703Slinton     for ( cp = ititle+1; *(cp-1); cp += 8 ) {
5989703Slinton 	pstab(cp, N_SOL);
5999703Slinton 	if (gdebug) printf("0,0,LL%d\n", labelno);
6009703Slinton     }
6019703Slinton #else
6029703Slinton     pstab(ititle+1, N_SOL);
6039703Slinton     if (gdebug) printf("0,0,LL%d\n", labelno);
6049703Slinton #endif
6059703Slinton     *cq = '"';
6069703Slinton     printf("LL%d:\n", labelno++);
6079703Slinton 
6089703Slinton eq: if (lineno == lastlineno) return;
6099703Slinton     lastlineno = lineno;
6109703Slinton 
6119703Slinton     if (fdefflag) {
6129703Slinton #ifdef STABDOT
6139703Slinton 	pstabdot(N_SLINE, lineno);
6149703Slinton #else
6159703Slinton 	pstab(NULLNAME, N_SLINE);
6169703Slinton 	printf("0,%d,LL%d\n", lineno, labelno);
6179703Slinton 	printf("LL%d:\n", labelno++);
6189703Slinton #endif
6199703Slinton     }
6209703Slinton }
6219703Slinton 
6229703Slinton plcstab(level)
6239703Slinton int level;
6249703Slinton {
625*9814Slinton     if (!gdebug) {
626*9814Slinton 	return;
627*9814Slinton     } else if (oldway) {
628*9814Slinton 	old_plcstab(level);
629*9814Slinton 	return;
630*9814Slinton     }
6319703Slinton #ifdef STABDOT
6329703Slinton     pstabdot(N_LBRAC, level);
6339703Slinton #else
6349703Slinton     pstab(NULLNAME, N_LBRAC);
6359703Slinton     printf("0,%d,LL%d\n", level, labelno);
6369703Slinton     printf("LL%d:\n", labelno++);
6379703Slinton #endif
6389703Slinton }
6399703Slinton 
6409703Slinton prcstab(level)
6419703Slinton int level;
6429703Slinton {
643*9814Slinton     if (!gdebug) {
644*9814Slinton 	return;
645*9814Slinton     } else if (oldway) {
646*9814Slinton 	old_prcstab(level);
647*9814Slinton 	return;
648*9814Slinton     }
6499703Slinton #ifdef STABDOT
6509703Slinton     pstabdot(N_RBRAC, level);
6519703Slinton #else
6529703Slinton     pstab(NULLNAME, N_RBRAC);
6539703Slinton     printf("0,%d,LL%d\n", level, labelno);
6549703Slinton     printf("LL%d:\n", labelno++);
6559703Slinton #endif
6569703Slinton }
6579703Slinton 
6589703Slinton pfstab(sname)
6599703Slinton char *sname;
6609703Slinton {
6619703Slinton     register struct symtab *p;
6629703Slinton 
6639703Slinton     if (gdebug) {
664*9814Slinton 	if (oldway) {
665*9814Slinton 	    old_pfstab(sname);
666*9814Slinton 	} else {
667*9814Slinton 	    p = &stab[lookup(sname, 0)];
668*9814Slinton 	    printf("\t.stabs\t\"%s:", p->sname);
669*9814Slinton 	    putchar((p->sclass == STATIC) ? 'f' : 'F');
670*9814Slinton 	    gentype(p);
671*9814Slinton 	    geninfo(p);
672*9814Slinton 	}
6739703Slinton     }
6749703Slinton }
675*9814Slinton 
676*9814Slinton /*
677*9814Slinton  * Old way of doing things.
678*9814Slinton  */
679*9814Slinton 
680*9814Slinton private old_fixarg(p)
681*9814Slinton struct symtab *p; {
682*9814Slinton 	if (gdebug) {
683*9814Slinton 		old_pstab(p->sname, N_PSYM);
684*9814Slinton 		if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
685*9814Slinton 		old_poffs(p);
686*9814Slinton 	}
687*9814Slinton }
688*9814Slinton 
689*9814Slinton private old_outstab(p)
690*9814Slinton struct symtab *p; {
691*9814Slinton 	register TWORD ptype;
692*9814Slinton 	register char *pname;
693*9814Slinton 	register char pclass;
694*9814Slinton 	register int poffset;
695*9814Slinton 
696*9814Slinton 	if (!gdebug) return;
697*9814Slinton 
698*9814Slinton 	ptype = p->stype;
699*9814Slinton 	pname = p->sname;
700*9814Slinton 	pclass = p->sclass;
701*9814Slinton 	poffset = p->offset;
702*9814Slinton 
703*9814Slinton 	if (ISFTN(ptype)) {
704*9814Slinton 		return;
705*9814Slinton 	}
706*9814Slinton 
707*9814Slinton 	switch (pclass) {
708*9814Slinton 
709*9814Slinton 	case AUTO:
710*9814Slinton 		old_pstab(pname, N_LSYM);
711*9814Slinton 		printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
712*9814Slinton 		old_poffs(p);
713*9814Slinton 		return;
714*9814Slinton 
715*9814Slinton 	case EXTDEF:
716*9814Slinton 	case EXTERN:
717*9814Slinton 		old_pstab(pname, N_GSYM);
718*9814Slinton 		printf("0,%d,0\n", ptype);
719*9814Slinton 		old_poffs(p);
720*9814Slinton 		return;
721*9814Slinton 
722*9814Slinton 	case STATIC:
723*9814Slinton #ifdef LCOMM
724*9814Slinton 		/* stabLCSYM is 1 during nidcl so we can get stab type right */
725*9814Slinton 		old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
726*9814Slinton #else
727*9814Slinton 		old_pstab(pname, N_STSYM);
728*9814Slinton #endif
729*9814Slinton 		if (p->slevel > 1) {
730*9814Slinton 			printf("0,%d,L%d\n", ptype, poffset);
731*9814Slinton 		} else {
732*9814Slinton 			printf("0,%d,%s\n", ptype, exname(pname));
733*9814Slinton 		}
734*9814Slinton 		old_poffs(p);
735*9814Slinton 		return;
736*9814Slinton 
737*9814Slinton 	case REGISTER:
738*9814Slinton 		old_pstab(pname, N_RSYM);
739*9814Slinton 		printf("0,%d,%d\n", ptype, poffset);
740*9814Slinton 		old_poffs(p);
741*9814Slinton 		return;
742*9814Slinton 
743*9814Slinton 	case MOS:
744*9814Slinton 	case MOU:
745*9814Slinton 		old_pstab(pname, N_SSYM);
746*9814Slinton 		printf("0,%d,%d\n", ptype, poffset/SZCHAR);
747*9814Slinton 		old_poffs(p);
748*9814Slinton 		return;
749*9814Slinton 
750*9814Slinton 	case PARAM:
751*9814Slinton 		/* parameter stab entries are processed in dclargs() */
752*9814Slinton 		return;
753*9814Slinton 
754*9814Slinton 	default:
755*9814Slinton #ifndef FLEXNAMES
756*9814Slinton 		if (ddebug) printf("	No .stab for %.8s\n", pname);
757*9814Slinton #else
758*9814Slinton 		if (ddebug) printf("	No .stab for %s\n", pname);
759*9814Slinton #endif
760*9814Slinton 
761*9814Slinton 	}
762*9814Slinton }
763*9814Slinton 
764*9814Slinton private old_pstab(name, type)
765*9814Slinton char *name;
766*9814Slinton int type; {
767*9814Slinton 	register int i;
768*9814Slinton 	register char c;
769*9814Slinton 	if (!gdebug) return;
770*9814Slinton 	/* locctr(PROG);  /* .stabs must appear in .text for c2 */
771*9814Slinton #ifdef ASSTRINGS
772*9814Slinton 	if ( name[0] == '\0')
773*9814Slinton 		printf("\t.stabn\t");
774*9814Slinton 	else
775*9814Slinton #ifndef FLEXNAMES
776*9814Slinton 		printf("\t.stabs\t\"%.8s\", ", name);
777*9814Slinton #else
778*9814Slinton 		printf("\t.stabs\t\"%s\", ", name);
779*9814Slinton #endif
780*9814Slinton #else
781*9814Slinton 	printf("	.stab	");
782*9814Slinton 	for(i=0; i<8; i++)
783*9814Slinton 		if (c = name[i]) printf("'%c,", c);
784*9814Slinton 		else printf("0,");
785*9814Slinton #endif
786*9814Slinton 	printf("0%o,", type);
787*9814Slinton }
788*9814Slinton 
789*9814Slinton #ifdef STABDOT
790*9814Slinton private old_pstabdot(type, value)
791*9814Slinton 	int	type;
792*9814Slinton 	int	value;
793*9814Slinton {
794*9814Slinton 	if ( ! gdebug) return;
795*9814Slinton 	/* locctr(PROG);  /* .stabs must appear in .text for c2 */
796*9814Slinton 	printf("\t.stabd\t");
797*9814Slinton 	printf("0%o,0,0%o\n",type, value);
798*9814Slinton }
799*9814Slinton #endif
800*9814Slinton 
801*9814Slinton private old_poffs(p)
802*9814Slinton register struct symtab *p; {
803*9814Slinton 	int s;
804*9814Slinton 	if (!gdebug) return;
805*9814Slinton 	if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
806*9814Slinton 		old_pstab(p->sname, N_LENG);
807*9814Slinton 		printf("1,0,%d\n", s);
808*9814Slinton 	}
809*9814Slinton }
810*9814Slinton 
811*9814Slinton private old_psline() {
812*9814Slinton 	static int lastlineno;
813*9814Slinton 	register char *cp, *cq;
814*9814Slinton 	register int i;
815*9814Slinton 
816*9814Slinton 	if (!gdebug) return;
817*9814Slinton 
818*9814Slinton 	cq = ititle;
819*9814Slinton 	cp = ftitle;
820*9814Slinton 
821*9814Slinton 	while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
822*9814Slinton 	if ( *cp == '\0' ) goto eq;
823*9814Slinton 
824*9814Slinton neq:	for (i=0; i<100; i++)
825*9814Slinton 		ititle[i] = '\0';
826*9814Slinton 	cp = ftitle;
827*9814Slinton 	cq = ititle;
828*9814Slinton 	while ( *cp )
829*9814Slinton 		*cq++ = *cp++;
830*9814Slinton 	*cq = '\0';
831*9814Slinton 	*--cq = '\0';
832*9814Slinton #ifndef FLEXNAMES
833*9814Slinton 	for ( cp = ititle+1; *(cp-1); cp += 8 ) {
834*9814Slinton 		old_pstab(cp, N_SOL);
835*9814Slinton 		if (gdebug) printf("0,0,LL%d\n", labelno);
836*9814Slinton 		}
837*9814Slinton #else
838*9814Slinton 	old_pstab(ititle+1, N_SOL);
839*9814Slinton 	if (gdebug) printf("0,0,LL%d\n", labelno);
840*9814Slinton #endif
841*9814Slinton 	*cq = '"';
842*9814Slinton 	printf("LL%d:\n", labelno++);
843*9814Slinton 
844*9814Slinton eq:	if (lineno == lastlineno) return;
845*9814Slinton 	lastlineno = lineno;
846*9814Slinton 
847*9814Slinton 	if (fdefflag) {
848*9814Slinton #ifdef STABDOT
849*9814Slinton 		old_pstabdot(N_SLINE, lineno);
850*9814Slinton #else
851*9814Slinton 		old_pstab(NULLNAME, N_SLINE);
852*9814Slinton 		printf("0,%d,LL%d\n", lineno, labelno);
853*9814Slinton 		printf("LL%d:\n", labelno++);
854*9814Slinton #endif
855*9814Slinton 		}
856*9814Slinton 	}
857*9814Slinton 
858*9814Slinton private old_plcstab(level) {
859*9814Slinton 	if (!gdebug) return;
860*9814Slinton #ifdef STABDOT
861*9814Slinton 	old_pstabdot(N_LBRAC, level);
862*9814Slinton #else
863*9814Slinton 	old_pstab(NULLNAME, N_LBRAC);
864*9814Slinton 	printf("0,%d,LL%d\n", level, labelno);
865*9814Slinton 	printf("LL%d:\n", labelno++);
866*9814Slinton #endif
867*9814Slinton 	}
868*9814Slinton 
869*9814Slinton private old_prcstab(level) {
870*9814Slinton 	if (!gdebug) return;
871*9814Slinton #ifdef STABDOT
872*9814Slinton 	pstabdot(N_RBRAC, level);
873*9814Slinton #else
874*9814Slinton 	pstab(NULLNAME, N_RBRAC);
875*9814Slinton 	printf("0,%d,LL%d\n", level, labelno);
876*9814Slinton 	printf("LL%d:\n", labelno++);
877*9814Slinton #endif
878*9814Slinton 	}
879*9814Slinton 
880*9814Slinton private old_pfstab(sname)
881*9814Slinton char *sname; {
882*9814Slinton 	if (!gdebug) return;
883*9814Slinton 	pstab(sname, N_FUN);
884*9814Slinton #ifndef FLEXNAMES
885*9814Slinton 	printf("0,%d,_%.7s\n", lineno, sname);
886*9814Slinton #else
887*9814Slinton 	printf("0,%d,_%s\n", lineno, sname);
888*9814Slinton #endif
889*9814Slinton }
890