114574Ssam #ifndef lint
2*32957Sdonn static char *sccsid ="@(#)stab.c 1.13 (Berkeley) 12/11/87";
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
1118557Sralph #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
zero_length_array(p)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 Boolean ignore;
1049703Slinton static Boolean firsttime = true;
1059703Slinton
1069814Slinton if (oldway) {
1079814Slinton old_outstab(sym);
10813941Slinton } else if (gdebug and not zero_length_array(sym)) {
1099703Slinton if (firsttime) {
1109703Slinton firsttime = false;
1119703Slinton inittypes();
1129703Slinton }
1139703Slinton ignore = false;
1149703Slinton p = sym;
1159703Slinton switch (p->sclass) {
1169703Slinton case REGISTER:
1179703Slinton classname = "r";
1189703Slinton break;
1199703Slinton
1209703Slinton /*
1219703Slinton * Locals are the default class.
1229703Slinton */
1239703Slinton case AUTO:
1249703Slinton classname = "";
1259703Slinton break;
1269703Slinton
1279703Slinton case STATIC:
1289703Slinton if (ISFTN(p->stype)) {
1299703Slinton ignore = true;
1309703Slinton } else if (p->slevel <= 1) {
1319703Slinton classname = "S";
1329703Slinton } else {
1339703Slinton classname = "V";
1349703Slinton }
1359703Slinton break;
1369703Slinton
1379703Slinton case EXTDEF:
1389703Slinton case EXTERN:
1399703Slinton if (ISFTN(p->stype)) {
1409703Slinton ignore = true;
1419703Slinton } else {
1429703Slinton classname = "G";
1439703Slinton }
1449703Slinton break;
1459703Slinton
1469703Slinton case TYPEDEF:
1479703Slinton classname = "t";
1489703Slinton break;
1499703Slinton
1509703Slinton case PARAM:
1519703Slinton case MOS:
1529703Slinton case MOU:
1539703Slinton case MOE:
1549703Slinton ignore = true;
1559703Slinton break;
1569703Slinton
1579703Slinton case ENAME:
1589703Slinton case UNAME:
1599703Slinton case STNAME:
160*32957Sdonn (void) entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
1619703Slinton ignore = true;
1629703Slinton break;
1639703Slinton
1649703Slinton default:
1659703Slinton if ((p->sclass&FIELD) == 0) {
1669703Slinton printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
1679703Slinton }
1689703Slinton ignore = true;
1699703Slinton break;
1709703Slinton }
1719703Slinton if (not ignore) {
1729703Slinton printf("\t.stabs\t\"%s:%s", p->sname, classname);
1739703Slinton gentype(p);
1749703Slinton geninfo(p);
1759703Slinton }
1769703Slinton }
1779703Slinton }
1789703Slinton
1799703Slinton /*
1809703Slinton * Since type names are lost in the travels and because C has
1819703Slinton * structural type equivalence we keep a table of type words that
1829703Slinton * we've already seen. The first time we see a type, it is assigned
1839703Slinton * (inline) a number and future references just list that number.
1849703Slinton * Structures, unions, enums, and arrays must be handled carefully
1859703Slinton * since not all the necessary information is in the type word.
1869703Slinton */
1879703Slinton
1889703Slinton typedef struct Typeid *Typeid;
1899703Slinton
1909703Slinton struct Typeid {
1919703Slinton TWORD tword;
1929703Slinton int tarray;
1939703Slinton int tstruct;
1949703Slinton int tstrtag;
1959703Slinton int tnum;
1969703Slinton Typeid chain;
1979703Slinton };
1989703Slinton
1999703Slinton #define TABLESIZE 2003
2009703Slinton
2019703Slinton private int tcount = 1;
2029703Slinton private int t_int, t_char;
2039703Slinton private Typeid typetable[TABLESIZE];
2049703Slinton
2059703Slinton /*
2069703Slinton * Look for the given type word in the type table.
2079703Slinton */
2089703Slinton
typelookup(type,arrindex,strindex,strtag)2099703Slinton private Typeid typelookup(type, arrindex, strindex, strtag)
2109703Slinton TWORD type;
2119703Slinton int arrindex;
2129703Slinton int strindex;
2139703Slinton int strtag;
2149703Slinton {
2159703Slinton register TWORD tword;
2169703Slinton register int i1, i2;
2179703Slinton Typeid t;
2189703Slinton
2199703Slinton t = typetable[type mod TABLESIZE];
2209703Slinton while (t != nil) {
2219703Slinton if (t->tword == type and
2229703Slinton strindex == t->tstruct and strtag == t->tstrtag) {
2239703Slinton if (arrindex == NILINDEX) {
2249703Slinton break;
2259703Slinton } else {
22611872Slinton tword = type;
2279703Slinton i1 = arrindex;
2289703Slinton i2 = t->tarray;
2299703Slinton while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
2309703Slinton ++i1;
2319703Slinton ++i2;
2329703Slinton tword >>= TSHIFT;
2339703Slinton }
2349703Slinton if (!ISARY(tword)) {
2359703Slinton break;
2369703Slinton }
2379703Slinton }
2389703Slinton }
2399703Slinton t = t->chain;
2409703Slinton }
2419703Slinton return t;
2429703Slinton }
2439703Slinton
2449703Slinton /*
2459703Slinton * Enter a type word and associated symtab indices into the type table.
2469703Slinton */
2479703Slinton
entertype(type,arrindex,strindex,strtag)2489703Slinton private int entertype(type, arrindex, strindex, strtag)
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 = tcount;
2639703Slinton ++tcount;
2649703Slinton i = type mod TABLESIZE;
2659703Slinton t->chain = typetable[i];
2669703Slinton typetable[i] = t;
2679703Slinton return t->tnum;
2689703Slinton }
2699703Slinton
2709703Slinton /*
2719703Slinton * Change the information associated with a type table entry.
2729703Slinton * Since I'm lazy this just creates a new entry with the number
2739703Slinton * as the old one.
2749703Slinton */
2759703Slinton
reentertype(typeid,type,arrindex,strindex,strtag)2769703Slinton private reentertype(typeid, type, arrindex, strindex, strtag)
2779703Slinton Typeid typeid;
2789703Slinton TWORD type;
2799703Slinton int arrindex;
2809703Slinton int strindex;
2819703Slinton int strtag;
2829703Slinton {
2839703Slinton register Typeid t;
2849703Slinton register int i;
2859703Slinton
2869703Slinton t = (Typeid) malloc(sizeof(struct Typeid));
2879703Slinton t->tword = type;
2889703Slinton t->tarray = arrindex;
2899703Slinton t->tstruct = strindex;
2909703Slinton t->tstrtag = strtag;
2919703Slinton t->tnum = typeid->tnum;
2929703Slinton i = type mod TABLESIZE;
2939703Slinton t->chain = typetable[i];
2949703Slinton typetable[i] = t;
2959703Slinton }
2969703Slinton
2979703Slinton /*
2989703Slinton * Initialize type table with predefined types.
2999703Slinton */
3009703Slinton
3019703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
3029703Slinton
inittypes()3039703Slinton private inittypes()
3049703Slinton {
3059703Slinton int t;
3069703Slinton
3079703Slinton t_int = builtintype(INT);
3089703Slinton t_char = builtintype(CHAR);
3099703Slinton maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
3109703Slinton maketype("char", t_char, t_char, 0L, 127L);
3119703Slinton maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
3129703Slinton maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
3139703Slinton maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
3149703Slinton maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
3159703Slinton maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
3169703Slinton maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
3179703Slinton maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
3189703Slinton maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
3199703Slinton t = builtintype(UNDEF);
3209703Slinton printf("\t.stabs\t\"void:t%d=%d", t, t);
321*32957Sdonn geninfo((struct symtab *)nil);
32210675Slinton t = builtintype(FARG);
32310675Slinton printf("\t.stabs\t\"???:t%d=%d", t, t_int);
324*32957Sdonn geninfo((struct symtab *)nil);
3259703Slinton }
3269703Slinton
3279703Slinton /*
3289703Slinton * Generate info for a new range type.
3299703Slinton */
3309703Slinton
maketype(name,tnum,eqtnum,lower,upper)3319703Slinton private maketype(name, tnum, eqtnum, lower, upper)
3329703Slinton char *name;
3339703Slinton int tnum, eqtnum;
3349703Slinton long lower, upper;
3359703Slinton {
3369703Slinton printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
337*32957Sdonn geninfo((struct symtab *)nil);
3389703Slinton }
3399703Slinton
3409703Slinton /*
3419703Slinton * Generate debugging information for the given type of the given symbol.
3429703Slinton */
3439703Slinton
gentype(sym)3449703Slinton private gentype(sym)
3459703Slinton struct symtab *sym;
3469703Slinton {
3479703Slinton register struct symtab *p;
3489703Slinton register TWORD t;
3499703Slinton register TWORD basictype;
3509703Slinton register Typeid typeid;
3519703Slinton int i, arrindex, strindex, strtag;
3529703Slinton
3539703Slinton p = sym;
3549703Slinton t = p->stype;
3559703Slinton if (ISFTN(t)) {
3569703Slinton t = DECREF(t);
3579703Slinton }
3589703Slinton basictype = BTYPE(t);
3599703Slinton if (ISARY(t)) {
3609703Slinton arrindex = p->dimoff;
3619703Slinton } else {
3629703Slinton arrindex = NILINDEX;
3639703Slinton }
3649703Slinton if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
3659703Slinton strindex = dimtab[p->sizoff + 1];
3669703Slinton if (strindex == -1) {
3679703Slinton strindex = FORWARD;
3689703Slinton strtag = dimtab[p->sizoff + 3];
3699703Slinton } else {
3709703Slinton strtag = NILINDEX;
3719703Slinton }
3729703Slinton } else {
3739703Slinton strindex = NILINDEX;
3749703Slinton strtag = NILINDEX;
3759703Slinton }
3769703Slinton i = arrindex;
3779703Slinton typeid = typelookup(t, arrindex, strindex, strtag);
3789703Slinton while (t != basictype and typeid == nil) {
3799703Slinton printf("%d=", entertype(t, i, strindex, strtag));
3809703Slinton switch (t&TMASK) {
3819703Slinton case PTR:
3829703Slinton printf("*");
3839703Slinton break;
3849703Slinton
3859703Slinton case FTN:
3869703Slinton printf("f");
3879703Slinton break;
3889703Slinton
3899703Slinton case ARY:
3909703Slinton printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
3919703Slinton break;
3929703Slinton }
3939703Slinton t = DECREF(t);
39426953Smckusick if (i == NILINDEX && ISARY(t)) {
39526953Smckusick i = p->dimoff;
39626953Smckusick }
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
genstruct(t,structid,index,name,size)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
geninfo(p)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
527*32957Sdonn /*ARGSUSED*/
outstruct(szindex,paramindex)5289703Slinton outstruct(szindex, paramindex)
5299703Slinton int szindex, paramindex;
5309703Slinton {
5319703Slinton register Typeid typeid;
5329703Slinton register struct symtab *p;
5339703Slinton register int i, t, strindex;
5349703Slinton
5359814Slinton if (oldway) {
5369814Slinton /* do nothing */;
5379814Slinton } else if (gdebug) {
538*32957Sdonn if ((i = dimtab[szindex + 3]) >= 0 && (p = &stab[i])->sname != nil) {
5399703Slinton strindex = dimtab[p->sizoff + 1];
5409703Slinton typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
5419703Slinton if (typeid == nil) {
5429703Slinton t = 0;
5439703Slinton } else {
5449703Slinton t = typeid->tnum;
5459703Slinton reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
5469703Slinton }
5479703Slinton printf("\t.stabs\t\"%s:T", p->sname);
5489703Slinton genstruct(p->stype, t, strindex, p->sname, bsize(p));
5499703Slinton geninfo(p);
5509703Slinton }
5519703Slinton }
5529703Slinton }
5539703Slinton
pstab(name,type)5549703Slinton pstab(name, type)
5559703Slinton char *name;
5569703Slinton int type;
5579703Slinton {
558*32957Sdonn #ifndef ASSTRINGS
5599703Slinton register int i;
5609703Slinton register char c;
561*32957Sdonn #endif
5629814Slinton
5639814Slinton if (!gdebug) {
5649814Slinton return;
5659814Slinton } else if (oldway) {
5669814Slinton old_pstab(name, type);
5679814Slinton return;
5689814Slinton }
5699703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */
5709703Slinton #ifdef ASSTRINGS
5719703Slinton if ( name[0] == '\0')
5729703Slinton printf("\t.stabn\t");
5739703Slinton else
5749703Slinton #ifndef FLEXNAMES
5759703Slinton printf("\t.stabs\t\"%.8s\",", name);
5769703Slinton #else
5779703Slinton printf("\t.stabs\t\"%s\",", name);
5789703Slinton #endif
5799703Slinton #else
5809703Slinton printf(" .stab ");
5819703Slinton for(i=0; i<8; i++)
5829703Slinton if (c = name[i]) printf("'%c,", c);
5839703Slinton else printf("0,");
5849703Slinton #endif
5859703Slinton printf("0%o,", type);
5869703Slinton }
5879703Slinton
5889703Slinton #ifdef STABDOT
pstabdot(type,value)5899703Slinton pstabdot(type, value)
5909703Slinton int type;
5919703Slinton int value;
5929703Slinton {
5939814Slinton if ( ! gdebug) {
5949814Slinton return;
5959814Slinton } else if (oldway) {
5969814Slinton old_pstabdot(type, value);
5979814Slinton return;
5989814Slinton }
5999703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */
6009703Slinton printf("\t.stabd\t");
6019703Slinton printf("0%o,0,0%o\n",type, value);
6029703Slinton }
6039703Slinton #endif
6049703Slinton
605*32957Sdonn #ifndef STABDOT
6069703Slinton extern char NULLNAME[8];
607*32957Sdonn #endif
6089703Slinton extern int labelno;
6099703Slinton extern int fdefflag;
6109703Slinton
psline()6119703Slinton psline()
6129703Slinton {
6139703Slinton static int lastlineno;
6149703Slinton register char *cp, *cq;
6159703Slinton register int i;
6169703Slinton
6179814Slinton if (!gdebug) {
6189814Slinton return;
6199814Slinton } else if (oldway) {
6209814Slinton old_psline();
6219814Slinton return;
6229814Slinton }
6239703Slinton
6249703Slinton cq = ititle;
6259703Slinton cp = ftitle;
6269703Slinton
6279703Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
6289703Slinton if ( *cp == '\0' ) goto eq;
6299703Slinton
6309703Slinton neq: for (i=0; i<100; i++)
6319703Slinton ititle[i] = '\0';
6329703Slinton cp = ftitle;
6339703Slinton cq = ititle;
6349703Slinton while ( *cp )
6359703Slinton *cq++ = *cp++;
6369703Slinton *cq = '\0';
6379703Slinton *--cq = '\0';
6389703Slinton #ifndef FLEXNAMES
6399703Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) {
6409703Slinton pstab(cp, N_SOL);
6419703Slinton if (gdebug) printf("0,0,LL%d\n", labelno);
6429703Slinton }
6439703Slinton #else
6449703Slinton pstab(ititle+1, N_SOL);
6459703Slinton if (gdebug) printf("0,0,LL%d\n", labelno);
6469703Slinton #endif
6479703Slinton *cq = '"';
6489703Slinton printf("LL%d:\n", labelno++);
6499703Slinton
6509703Slinton eq: if (lineno == lastlineno) return;
6519703Slinton lastlineno = lineno;
6529703Slinton
6539703Slinton if (fdefflag) {
6549703Slinton #ifdef STABDOT
6559703Slinton pstabdot(N_SLINE, lineno);
6569703Slinton #else
6579703Slinton pstab(NULLNAME, N_SLINE);
6589703Slinton printf("0,%d,LL%d\n", lineno, labelno);
6599703Slinton printf("LL%d:\n", labelno++);
6609703Slinton #endif
6619703Slinton }
6629703Slinton }
6639703Slinton
plcstab(level)6649703Slinton plcstab(level)
6659703Slinton int level;
6669703Slinton {
6679814Slinton if (!gdebug) {
6689814Slinton return;
6699814Slinton } else if (oldway) {
6709814Slinton old_plcstab(level);
6719814Slinton return;
6729814Slinton }
6739703Slinton #ifdef STABDOT
6749703Slinton pstabdot(N_LBRAC, level);
6759703Slinton #else
6769703Slinton pstab(NULLNAME, N_LBRAC);
6779703Slinton printf("0,%d,LL%d\n", level, labelno);
6789703Slinton printf("LL%d:\n", labelno++);
6799703Slinton #endif
6809703Slinton }
6819703Slinton
prcstab(level)6829703Slinton prcstab(level)
6839703Slinton int level;
6849703Slinton {
6859814Slinton if (!gdebug) {
6869814Slinton return;
6879814Slinton } else if (oldway) {
6889814Slinton old_prcstab(level);
6899814Slinton return;
6909814Slinton }
6919703Slinton #ifdef STABDOT
6929703Slinton pstabdot(N_RBRAC, level);
6939703Slinton #else
6949703Slinton pstab(NULLNAME, N_RBRAC);
6959703Slinton printf("0,%d,LL%d\n", level, labelno);
6969703Slinton printf("LL%d:\n", labelno++);
6979703Slinton #endif
6989703Slinton }
6999703Slinton
pfstab(sname)7009703Slinton pfstab(sname)
7019703Slinton char *sname;
7029703Slinton {
7039703Slinton register struct symtab *p;
7049703Slinton
7059703Slinton if (gdebug) {
7069814Slinton if (oldway) {
7079814Slinton old_pfstab(sname);
7089814Slinton } else {
7099814Slinton p = &stab[lookup(sname, 0)];
7109814Slinton printf("\t.stabs\t\"%s:", p->sname);
7119814Slinton putchar((p->sclass == STATIC) ? 'f' : 'F');
7129814Slinton gentype(p);
7139814Slinton geninfo(p);
7149814Slinton }
7159703Slinton }
7169703Slinton }
7179814Slinton
7189814Slinton /*
7199814Slinton * Old way of doing things.
7209814Slinton */
7219814Slinton
old_fixarg(p)7229814Slinton private old_fixarg(p)
7239814Slinton struct symtab *p; {
7249814Slinton if (gdebug) {
7259814Slinton old_pstab(p->sname, N_PSYM);
7269814Slinton if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
7279814Slinton old_poffs(p);
7289814Slinton }
7299814Slinton }
7309814Slinton
old_outstab(p)7319814Slinton private old_outstab(p)
7329814Slinton struct symtab *p; {
7339814Slinton register TWORD ptype;
7349814Slinton register char *pname;
7359814Slinton register char pclass;
7369814Slinton register int poffset;
7379814Slinton
7389814Slinton if (!gdebug) return;
7399814Slinton
7409814Slinton ptype = p->stype;
7419814Slinton pname = p->sname;
7429814Slinton pclass = p->sclass;
7439814Slinton poffset = p->offset;
7449814Slinton
7459814Slinton if (ISFTN(ptype)) {
7469814Slinton return;
7479814Slinton }
7489814Slinton
7499814Slinton switch (pclass) {
7509814Slinton
7519814Slinton case AUTO:
7529814Slinton old_pstab(pname, N_LSYM);
7539814Slinton printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
7549814Slinton old_poffs(p);
7559814Slinton return;
7569814Slinton
7579814Slinton case EXTDEF:
7589814Slinton case EXTERN:
7599814Slinton old_pstab(pname, N_GSYM);
7609814Slinton printf("0,%d,0\n", ptype);
7619814Slinton old_poffs(p);
7629814Slinton return;
7639814Slinton
7649814Slinton case STATIC:
7659814Slinton #ifdef LCOMM
7669814Slinton /* stabLCSYM is 1 during nidcl so we can get stab type right */
7679814Slinton old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
7689814Slinton #else
7699814Slinton old_pstab(pname, N_STSYM);
7709814Slinton #endif
7719814Slinton if (p->slevel > 1) {
7729814Slinton printf("0,%d,L%d\n", ptype, poffset);
7739814Slinton } else {
7749814Slinton printf("0,%d,%s\n", ptype, exname(pname));
7759814Slinton }
7769814Slinton old_poffs(p);
7779814Slinton return;
7789814Slinton
7799814Slinton case REGISTER:
7809814Slinton old_pstab(pname, N_RSYM);
7819814Slinton printf("0,%d,%d\n", ptype, poffset);
7829814Slinton old_poffs(p);
7839814Slinton return;
7849814Slinton
7859814Slinton case MOS:
7869814Slinton case MOU:
7879814Slinton old_pstab(pname, N_SSYM);
7889814Slinton printf("0,%d,%d\n", ptype, poffset/SZCHAR);
7899814Slinton old_poffs(p);
7909814Slinton return;
7919814Slinton
7929814Slinton case PARAM:
7939814Slinton /* parameter stab entries are processed in dclargs() */
7949814Slinton return;
7959814Slinton
7969814Slinton default:
7979814Slinton #ifndef FLEXNAMES
7989814Slinton if (ddebug) printf(" No .stab for %.8s\n", pname);
7999814Slinton #else
8009814Slinton if (ddebug) printf(" No .stab for %s\n", pname);
8019814Slinton #endif
8029814Slinton
8039814Slinton }
8049814Slinton }
8059814Slinton
old_pstab(name,type)8069814Slinton private old_pstab(name, type)
8079814Slinton char *name;
8089814Slinton int type; {
809*32957Sdonn #ifndef ASSTRINGS
8109814Slinton register int i;
8119814Slinton register char c;
812*32957Sdonn #endif
8139814Slinton if (!gdebug) return;
8149814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */
8159814Slinton #ifdef ASSTRINGS
8169814Slinton if ( name[0] == '\0')
8179814Slinton printf("\t.stabn\t");
8189814Slinton else
8199814Slinton #ifndef FLEXNAMES
8209814Slinton printf("\t.stabs\t\"%.8s\", ", name);
8219814Slinton #else
8229814Slinton printf("\t.stabs\t\"%s\", ", name);
8239814Slinton #endif
8249814Slinton #else
8259814Slinton printf(" .stab ");
8269814Slinton for(i=0; i<8; i++)
8279814Slinton if (c = name[i]) printf("'%c,", c);
8289814Slinton else printf("0,");
8299814Slinton #endif
8309814Slinton printf("0%o,", type);
8319814Slinton }
8329814Slinton
8339814Slinton #ifdef STABDOT
old_pstabdot(type,value)8349814Slinton private old_pstabdot(type, value)
8359814Slinton int type;
8369814Slinton int value;
8379814Slinton {
8389814Slinton if ( ! gdebug) return;
8399814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */
8409814Slinton printf("\t.stabd\t");
8419814Slinton printf("0%o,0,0%o\n",type, value);
8429814Slinton }
8439814Slinton #endif
8449814Slinton
old_poffs(p)8459814Slinton private old_poffs(p)
8469814Slinton register struct symtab *p; {
8479814Slinton int s;
8489814Slinton if (!gdebug) return;
8499814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
8509814Slinton old_pstab(p->sname, N_LENG);
8519814Slinton printf("1,0,%d\n", s);
8529814Slinton }
8539814Slinton }
8549814Slinton
old_psline()8559814Slinton private old_psline() {
8569814Slinton static int lastlineno;
8579814Slinton register char *cp, *cq;
8589814Slinton register int i;
8599814Slinton
8609814Slinton if (!gdebug) return;
8619814Slinton
8629814Slinton cq = ititle;
8639814Slinton cp = ftitle;
8649814Slinton
8659814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
8669814Slinton if ( *cp == '\0' ) goto eq;
8679814Slinton
8689814Slinton neq: for (i=0; i<100; i++)
8699814Slinton ititle[i] = '\0';
8709814Slinton cp = ftitle;
8719814Slinton cq = ititle;
8729814Slinton while ( *cp )
8739814Slinton *cq++ = *cp++;
8749814Slinton *cq = '\0';
8759814Slinton *--cq = '\0';
8769814Slinton #ifndef FLEXNAMES
8779814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) {
8789814Slinton old_pstab(cp, N_SOL);
8799814Slinton if (gdebug) printf("0,0,LL%d\n", labelno);
8809814Slinton }
8819814Slinton #else
8829814Slinton old_pstab(ititle+1, N_SOL);
8839814Slinton if (gdebug) printf("0,0,LL%d\n", labelno);
8849814Slinton #endif
8859814Slinton *cq = '"';
8869814Slinton printf("LL%d:\n", labelno++);
8879814Slinton
8889814Slinton eq: if (lineno == lastlineno) return;
8899814Slinton lastlineno = lineno;
8909814Slinton
8919814Slinton if (fdefflag) {
8929814Slinton #ifdef STABDOT
8939814Slinton old_pstabdot(N_SLINE, lineno);
8949814Slinton #else
8959814Slinton old_pstab(NULLNAME, N_SLINE);
8969814Slinton printf("0,%d,LL%d\n", lineno, labelno);
8979814Slinton printf("LL%d:\n", labelno++);
8989814Slinton #endif
8999814Slinton }
9009814Slinton }
9019814Slinton
old_plcstab(level)9029814Slinton private old_plcstab(level) {
9039814Slinton if (!gdebug) return;
9049814Slinton #ifdef STABDOT
9059814Slinton old_pstabdot(N_LBRAC, level);
9069814Slinton #else
9079814Slinton old_pstab(NULLNAME, N_LBRAC);
9089814Slinton printf("0,%d,LL%d\n", level, labelno);
9099814Slinton printf("LL%d:\n", labelno++);
9109814Slinton #endif
9119814Slinton }
9129814Slinton
old_prcstab(level)9139814Slinton private old_prcstab(level) {
9149814Slinton if (!gdebug) return;
9159814Slinton #ifdef STABDOT
9169814Slinton pstabdot(N_RBRAC, level);
9179814Slinton #else
9189814Slinton pstab(NULLNAME, N_RBRAC);
9199814Slinton printf("0,%d,LL%d\n", level, labelno);
9209814Slinton printf("LL%d:\n", labelno++);
9219814Slinton #endif
9229814Slinton }
9239814Slinton
old_pfstab(sname)9249814Slinton private old_pfstab(sname)
9259814Slinton char *sname; {
9269814Slinton if (!gdebug) return;
9279814Slinton pstab(sname, N_FUN);
9289814Slinton #ifndef FLEXNAMES
9299814Slinton printf("0,%d,_%.7s\n", lineno, sname);
9309814Slinton #else
9319814Slinton printf("0,%d,_%s\n", lineno, sname);
9329814Slinton #endif
9339814Slinton }
934