114574Ssam #ifndef lint 2*26953Smckusick static char *sccsid ="@(#)stab.c 1.12 (Berkeley) 03/27/86"; 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 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); 397*26953Smckusick if (i == NILINDEX && ISARY(t)) { 398*26953Smckusick i = p->dimoff; 399*26953Smckusick } 4009703Slinton if (t == basictype) { 4019703Slinton typeid = typelookup(t, NILINDEX, strindex, strtag); 4029703Slinton } else { 4039703Slinton typeid = typelookup(t, i, strindex, strtag); 4049703Slinton } 4059703Slinton } 4069703Slinton if (typeid == nil) { 4079703Slinton if (strindex == FORWARD) { 4089703Slinton typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 4099703Slinton if (typeid == nil) { 4109703Slinton cerror("unbelievable forward reference"); 4119703Slinton } 4129703Slinton printf("%d", typeid->tnum); 4139703Slinton } else { 4149703Slinton genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); 4159703Slinton } 4169703Slinton } else { 4179703Slinton printf("%d", typeid->tnum); 4189703Slinton } 4199703Slinton } 4209703Slinton 4219703Slinton /* 4229703Slinton * Generate type information for structures, unions, and enumerations. 4239703Slinton */ 4249703Slinton 4259703Slinton private genstruct(t, structid, index, name, size) 4269703Slinton TWORD t; 4279703Slinton int structid; 4289703Slinton int index; 4299703Slinton char *name; 4309703Slinton int size; 4319703Slinton { 4329703Slinton register int i; 4339703Slinton register struct symtab *field; 4349703Slinton int id; 4359703Slinton 4369703Slinton if (structid == NILINDEX) { 4379703Slinton id = entertype(t, NILINDEX, index, NILINDEX); 4389703Slinton } else { 4399703Slinton id = structid; 4409703Slinton } 4419703Slinton switch (t) { 4429703Slinton case STRTY: 4439703Slinton case UNIONTY: 4449703Slinton printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); 4459703Slinton i = index; 4469703Slinton while (dimtab[i] != -1) { 4479703Slinton field = &stab[dimtab[i]]; 4489703Slinton printf("%s:", field->sname); 4499703Slinton gentype(field); 4509703Slinton if (field->sclass > FIELD) { 4519703Slinton printf(",%d,%d;", field->offset, field->sclass - FIELD); 4529703Slinton } else { 4539703Slinton printf(",%d,%d;", field->offset, 4549703Slinton tsize(field->stype, field->dimoff, field->sizoff)); 4559703Slinton } 4569703Slinton ++i; 4579703Slinton } 4589703Slinton putchar(';'); 4599703Slinton break; 4609703Slinton 4619703Slinton case ENUMTY: 4629703Slinton printf("%d=e", id); 4639703Slinton i = index; 4649703Slinton while (dimtab[i] != -1) { 4659703Slinton field = &stab[dimtab[i]]; 4669703Slinton printf("%s:%d,", field->sname, field->offset); 4679703Slinton i++; 4689703Slinton } 46915275Ssam putchar(';'); 4709703Slinton break; 4719703Slinton 4729703Slinton default: 4739703Slinton cerror("couldn't find basic type %d for %s\n", t, name); 4749703Slinton break; 4759703Slinton } 4769703Slinton } 4779703Slinton 4789703Slinton /* 4799703Slinton * Generate offset and size info. 4809703Slinton */ 4819703Slinton 4829703Slinton private geninfo(p) 4839703Slinton register struct symtab *p; 4849703Slinton { 48514437Slinton int stabtype; 48614437Slinton 4879703Slinton if (p == nil) { 4889703Slinton printf("\",0x%x,0,0,0\n", N_LSYM); 4899703Slinton } else { 4909703Slinton switch (p->sclass) { 4919703Slinton case EXTERN: 4929703Slinton case EXTDEF: 4939703Slinton if (ISFTN(p->stype)) { 4949703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4959703Slinton } else { 49610675Slinton printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p)); 4979703Slinton } 4989703Slinton break; 4999703Slinton 5009703Slinton case STATIC: 50114437Slinton stabtype = stabLCSYM ? N_LCSYM : N_STSYM; 5029703Slinton if (ISFTN(p->stype)) { 5039703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 5049703Slinton } else if (p->slevel > 1) { 50514437Slinton printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset); 5069703Slinton } else { 50714437Slinton printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname); 5089703Slinton } 5099703Slinton break; 5109703Slinton 5119703Slinton case REGISTER: 5129703Slinton printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); 5139703Slinton break; 5149703Slinton 5159703Slinton case PARAM: 5169703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 5179703Slinton break; 5189703Slinton 5199703Slinton default: 5209703Slinton printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); 5219703Slinton break; 5229703Slinton } 5239703Slinton } 5249703Slinton } 5259703Slinton 5269703Slinton /* 5279703Slinton * Generate information for a newly-defined structure. 5289703Slinton */ 5299703Slinton 5309703Slinton outstruct(szindex, paramindex) 5319703Slinton int szindex, paramindex; 5329703Slinton { 5339703Slinton register Typeid typeid; 5349703Slinton register struct symtab *p; 5359703Slinton register int i, t, strindex; 5369703Slinton 5379814Slinton if (oldway) { 5389814Slinton /* do nothing */; 5399814Slinton } else if (gdebug) { 5409703Slinton i = dimtab[szindex + 3]; 5419703Slinton p = &stab[i]; 5429703Slinton if (p->sname != nil) { 5439703Slinton strindex = dimtab[p->sizoff + 1]; 5449703Slinton typeid = typelookup(p->stype, NILINDEX, FORWARD, i); 5459703Slinton if (typeid == nil) { 5469703Slinton t = 0; 5479703Slinton } else { 5489703Slinton t = typeid->tnum; 5499703Slinton reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); 5509703Slinton } 5519703Slinton printf("\t.stabs\t\"%s:T", p->sname); 5529703Slinton genstruct(p->stype, t, strindex, p->sname, bsize(p)); 5539703Slinton geninfo(p); 5549703Slinton } 5559703Slinton } 5569703Slinton } 5579703Slinton 5589703Slinton pstab(name, type) 5599703Slinton char *name; 5609703Slinton int type; 5619703Slinton { 5629703Slinton register int i; 5639703Slinton register char c; 5649814Slinton 5659814Slinton if (!gdebug) { 5669814Slinton return; 5679814Slinton } else if (oldway) { 5689814Slinton old_pstab(name, type); 5699814Slinton return; 5709814Slinton } 5719703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5729703Slinton #ifdef ASSTRINGS 5739703Slinton if ( name[0] == '\0') 5749703Slinton printf("\t.stabn\t"); 5759703Slinton else 5769703Slinton #ifndef FLEXNAMES 5779703Slinton printf("\t.stabs\t\"%.8s\",", name); 5789703Slinton #else 5799703Slinton printf("\t.stabs\t\"%s\",", name); 5809703Slinton #endif 5819703Slinton #else 5829703Slinton printf(" .stab "); 5839703Slinton for(i=0; i<8; i++) 5849703Slinton if (c = name[i]) printf("'%c,", c); 5859703Slinton else printf("0,"); 5869703Slinton #endif 5879703Slinton printf("0%o,", type); 5889703Slinton } 5899703Slinton 5909703Slinton #ifdef STABDOT 5919703Slinton pstabdot(type, value) 5929703Slinton int type; 5939703Slinton int value; 5949703Slinton { 5959814Slinton if ( ! gdebug) { 5969814Slinton return; 5979814Slinton } else if (oldway) { 5989814Slinton old_pstabdot(type, value); 5999814Slinton return; 6009814Slinton } 6019703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 6029703Slinton printf("\t.stabd\t"); 6039703Slinton printf("0%o,0,0%o\n",type, value); 6049703Slinton } 6059703Slinton #endif 6069703Slinton 6079703Slinton extern char NULLNAME[8]; 6089703Slinton extern int labelno; 6099703Slinton extern int fdefflag; 6109703Slinton 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 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 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 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 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 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 8069814Slinton private old_pstab(name, type) 8079814Slinton char *name; 8089814Slinton int type; { 8099814Slinton register int i; 8109814Slinton register char c; 8119814Slinton if (!gdebug) return; 8129814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8139814Slinton #ifdef ASSTRINGS 8149814Slinton if ( name[0] == '\0') 8159814Slinton printf("\t.stabn\t"); 8169814Slinton else 8179814Slinton #ifndef FLEXNAMES 8189814Slinton printf("\t.stabs\t\"%.8s\", ", name); 8199814Slinton #else 8209814Slinton printf("\t.stabs\t\"%s\", ", name); 8219814Slinton #endif 8229814Slinton #else 8239814Slinton printf(" .stab "); 8249814Slinton for(i=0; i<8; i++) 8259814Slinton if (c = name[i]) printf("'%c,", c); 8269814Slinton else printf("0,"); 8279814Slinton #endif 8289814Slinton printf("0%o,", type); 8299814Slinton } 8309814Slinton 8319814Slinton #ifdef STABDOT 8329814Slinton private old_pstabdot(type, value) 8339814Slinton int type; 8349814Slinton int value; 8359814Slinton { 8369814Slinton if ( ! gdebug) return; 8379814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8389814Slinton printf("\t.stabd\t"); 8399814Slinton printf("0%o,0,0%o\n",type, value); 8409814Slinton } 8419814Slinton #endif 8429814Slinton 8439814Slinton private old_poffs(p) 8449814Slinton register struct symtab *p; { 8459814Slinton int s; 8469814Slinton if (!gdebug) return; 8479814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { 8489814Slinton old_pstab(p->sname, N_LENG); 8499814Slinton printf("1,0,%d\n", s); 8509814Slinton } 8519814Slinton } 8529814Slinton 8539814Slinton private old_psline() { 8549814Slinton static int lastlineno; 8559814Slinton register char *cp, *cq; 8569814Slinton register int i; 8579814Slinton 8589814Slinton if (!gdebug) return; 8599814Slinton 8609814Slinton cq = ititle; 8619814Slinton cp = ftitle; 8629814Slinton 8639814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 8649814Slinton if ( *cp == '\0' ) goto eq; 8659814Slinton 8669814Slinton neq: for (i=0; i<100; i++) 8679814Slinton ititle[i] = '\0'; 8689814Slinton cp = ftitle; 8699814Slinton cq = ititle; 8709814Slinton while ( *cp ) 8719814Slinton *cq++ = *cp++; 8729814Slinton *cq = '\0'; 8739814Slinton *--cq = '\0'; 8749814Slinton #ifndef FLEXNAMES 8759814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 8769814Slinton old_pstab(cp, N_SOL); 8779814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8789814Slinton } 8799814Slinton #else 8809814Slinton old_pstab(ititle+1, N_SOL); 8819814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8829814Slinton #endif 8839814Slinton *cq = '"'; 8849814Slinton printf("LL%d:\n", labelno++); 8859814Slinton 8869814Slinton eq: if (lineno == lastlineno) return; 8879814Slinton lastlineno = lineno; 8889814Slinton 8899814Slinton if (fdefflag) { 8909814Slinton #ifdef STABDOT 8919814Slinton old_pstabdot(N_SLINE, lineno); 8929814Slinton #else 8939814Slinton old_pstab(NULLNAME, N_SLINE); 8949814Slinton printf("0,%d,LL%d\n", lineno, labelno); 8959814Slinton printf("LL%d:\n", labelno++); 8969814Slinton #endif 8979814Slinton } 8989814Slinton } 8999814Slinton 9009814Slinton private old_plcstab(level) { 9019814Slinton if (!gdebug) return; 9029814Slinton #ifdef STABDOT 9039814Slinton old_pstabdot(N_LBRAC, level); 9049814Slinton #else 9059814Slinton old_pstab(NULLNAME, N_LBRAC); 9069814Slinton printf("0,%d,LL%d\n", level, labelno); 9079814Slinton printf("LL%d:\n", labelno++); 9089814Slinton #endif 9099814Slinton } 9109814Slinton 9119814Slinton private old_prcstab(level) { 9129814Slinton if (!gdebug) return; 9139814Slinton #ifdef STABDOT 9149814Slinton pstabdot(N_RBRAC, level); 9159814Slinton #else 9169814Slinton pstab(NULLNAME, N_RBRAC); 9179814Slinton printf("0,%d,LL%d\n", level, labelno); 9189814Slinton printf("LL%d:\n", labelno++); 9199814Slinton #endif 9209814Slinton } 9219814Slinton 9229814Slinton private old_pfstab(sname) 9239814Slinton char *sname; { 9249814Slinton if (!gdebug) return; 9259814Slinton pstab(sname, N_FUN); 9269814Slinton #ifndef FLEXNAMES 9279814Slinton printf("0,%d,_%.7s\n", lineno, sname); 9289814Slinton #else 9299814Slinton printf("0,%d,_%s\n", lineno, sname); 9309814Slinton #endif 9319814Slinton } 932