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