1*14574Ssam #ifndef lint 2*14574Ssam static char *sccsid ="@(#)stab.c 1.9 (Berkeley) 08/11/83"; 3*14574Ssam #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 119703Slinton #include "mfile1" 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 } 4669703Slinton break; 4679703Slinton 4689703Slinton default: 4699703Slinton cerror("couldn't find basic type %d for %s\n", t, name); 4709703Slinton break; 4719703Slinton } 4729703Slinton } 4739703Slinton 4749703Slinton /* 4759703Slinton * Generate offset and size info. 4769703Slinton */ 4779703Slinton 4789703Slinton private geninfo(p) 4799703Slinton register struct symtab *p; 4809703Slinton { 48114437Slinton int stabtype; 48214437Slinton 4839703Slinton if (p == nil) { 4849703Slinton printf("\",0x%x,0,0,0\n", N_LSYM); 4859703Slinton } else { 4869703Slinton switch (p->sclass) { 4879703Slinton case EXTERN: 4889703Slinton case EXTDEF: 4899703Slinton if (ISFTN(p->stype)) { 4909703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4919703Slinton } else { 49210675Slinton printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p)); 4939703Slinton } 4949703Slinton break; 4959703Slinton 4969703Slinton case STATIC: 49714437Slinton stabtype = stabLCSYM ? N_LCSYM : N_STSYM; 4989703Slinton if (ISFTN(p->stype)) { 4999703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 5009703Slinton } else if (p->slevel > 1) { 50114437Slinton printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset); 5029703Slinton } else { 50314437Slinton printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname); 5049703Slinton } 5059703Slinton break; 5069703Slinton 5079703Slinton case REGISTER: 5089703Slinton printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); 5099703Slinton break; 5109703Slinton 5119703Slinton case PARAM: 5129703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 5139703Slinton break; 5149703Slinton 5159703Slinton default: 5169703Slinton printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); 5179703Slinton break; 5189703Slinton } 5199703Slinton } 5209703Slinton } 5219703Slinton 5229703Slinton /* 5239703Slinton * Generate information for a newly-defined structure. 5249703Slinton */ 5259703Slinton 5269703Slinton outstruct(szindex, paramindex) 5279703Slinton int szindex, paramindex; 5289703Slinton { 5299703Slinton register Typeid typeid; 5309703Slinton register struct symtab *p; 5319703Slinton register int i, t, strindex; 5329703Slinton 5339814Slinton if (oldway) { 5349814Slinton /* do nothing */; 5359814Slinton } else if (gdebug) { 5369703Slinton i = dimtab[szindex + 3]; 5379703Slinton p = &stab[i]; 5389703Slinton if (p->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 5549703Slinton pstab(name, type) 5559703Slinton char *name; 5569703Slinton int type; 5579703Slinton { 5589703Slinton register int i; 5599703Slinton register char c; 5609814Slinton 5619814Slinton if (!gdebug) { 5629814Slinton return; 5639814Slinton } else if (oldway) { 5649814Slinton old_pstab(name, type); 5659814Slinton return; 5669814Slinton } 5679703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5689703Slinton #ifdef ASSTRINGS 5699703Slinton if ( name[0] == '\0') 5709703Slinton printf("\t.stabn\t"); 5719703Slinton else 5729703Slinton #ifndef FLEXNAMES 5739703Slinton printf("\t.stabs\t\"%.8s\",", name); 5749703Slinton #else 5759703Slinton printf("\t.stabs\t\"%s\",", name); 5769703Slinton #endif 5779703Slinton #else 5789703Slinton printf(" .stab "); 5799703Slinton for(i=0; i<8; i++) 5809703Slinton if (c = name[i]) printf("'%c,", c); 5819703Slinton else printf("0,"); 5829703Slinton #endif 5839703Slinton printf("0%o,", type); 5849703Slinton } 5859703Slinton 5869703Slinton #ifdef STABDOT 5879703Slinton pstabdot(type, value) 5889703Slinton int type; 5899703Slinton int value; 5909703Slinton { 5919814Slinton if ( ! gdebug) { 5929814Slinton return; 5939814Slinton } else if (oldway) { 5949814Slinton old_pstabdot(type, value); 5959814Slinton return; 5969814Slinton } 5979703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5989703Slinton printf("\t.stabd\t"); 5999703Slinton printf("0%o,0,0%o\n",type, value); 6009703Slinton } 6019703Slinton #endif 6029703Slinton 6039703Slinton extern char NULLNAME[8]; 6049703Slinton extern int labelno; 6059703Slinton extern int fdefflag; 6069703Slinton 6079703Slinton psline() 6089703Slinton { 6099703Slinton static int lastlineno; 6109703Slinton register char *cp, *cq; 6119703Slinton register int i; 6129703Slinton 6139814Slinton if (!gdebug) { 6149814Slinton return; 6159814Slinton } else if (oldway) { 6169814Slinton old_psline(); 6179814Slinton return; 6189814Slinton } 6199703Slinton 6209703Slinton cq = ititle; 6219703Slinton cp = ftitle; 6229703Slinton 6239703Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 6249703Slinton if ( *cp == '\0' ) goto eq; 6259703Slinton 6269703Slinton neq: for (i=0; i<100; i++) 6279703Slinton ititle[i] = '\0'; 6289703Slinton cp = ftitle; 6299703Slinton cq = ititle; 6309703Slinton while ( *cp ) 6319703Slinton *cq++ = *cp++; 6329703Slinton *cq = '\0'; 6339703Slinton *--cq = '\0'; 6349703Slinton #ifndef FLEXNAMES 6359703Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 6369703Slinton pstab(cp, N_SOL); 6379703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6389703Slinton } 6399703Slinton #else 6409703Slinton pstab(ititle+1, N_SOL); 6419703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6429703Slinton #endif 6439703Slinton *cq = '"'; 6449703Slinton printf("LL%d:\n", labelno++); 6459703Slinton 6469703Slinton eq: if (lineno == lastlineno) return; 6479703Slinton lastlineno = lineno; 6489703Slinton 6499703Slinton if (fdefflag) { 6509703Slinton #ifdef STABDOT 6519703Slinton pstabdot(N_SLINE, lineno); 6529703Slinton #else 6539703Slinton pstab(NULLNAME, N_SLINE); 6549703Slinton printf("0,%d,LL%d\n", lineno, labelno); 6559703Slinton printf("LL%d:\n", labelno++); 6569703Slinton #endif 6579703Slinton } 6589703Slinton } 6599703Slinton 6609703Slinton plcstab(level) 6619703Slinton int level; 6629703Slinton { 6639814Slinton if (!gdebug) { 6649814Slinton return; 6659814Slinton } else if (oldway) { 6669814Slinton old_plcstab(level); 6679814Slinton return; 6689814Slinton } 6699703Slinton #ifdef STABDOT 6709703Slinton pstabdot(N_LBRAC, level); 6719703Slinton #else 6729703Slinton pstab(NULLNAME, N_LBRAC); 6739703Slinton printf("0,%d,LL%d\n", level, labelno); 6749703Slinton printf("LL%d:\n", labelno++); 6759703Slinton #endif 6769703Slinton } 6779703Slinton 6789703Slinton prcstab(level) 6799703Slinton int level; 6809703Slinton { 6819814Slinton if (!gdebug) { 6829814Slinton return; 6839814Slinton } else if (oldway) { 6849814Slinton old_prcstab(level); 6859814Slinton return; 6869814Slinton } 6879703Slinton #ifdef STABDOT 6889703Slinton pstabdot(N_RBRAC, level); 6899703Slinton #else 6909703Slinton pstab(NULLNAME, N_RBRAC); 6919703Slinton printf("0,%d,LL%d\n", level, labelno); 6929703Slinton printf("LL%d:\n", labelno++); 6939703Slinton #endif 6949703Slinton } 6959703Slinton 6969703Slinton pfstab(sname) 6979703Slinton char *sname; 6989703Slinton { 6999703Slinton register struct symtab *p; 7009703Slinton 7019703Slinton if (gdebug) { 7029814Slinton if (oldway) { 7039814Slinton old_pfstab(sname); 7049814Slinton } else { 7059814Slinton p = &stab[lookup(sname, 0)]; 7069814Slinton printf("\t.stabs\t\"%s:", p->sname); 7079814Slinton putchar((p->sclass == STATIC) ? 'f' : 'F'); 7089814Slinton gentype(p); 7099814Slinton geninfo(p); 7109814Slinton } 7119703Slinton } 7129703Slinton } 7139814Slinton 7149814Slinton /* 7159814Slinton * Old way of doing things. 7169814Slinton */ 7179814Slinton 7189814Slinton private old_fixarg(p) 7199814Slinton struct symtab *p; { 7209814Slinton if (gdebug) { 7219814Slinton old_pstab(p->sname, N_PSYM); 7229814Slinton if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); 7239814Slinton old_poffs(p); 7249814Slinton } 7259814Slinton } 7269814Slinton 7279814Slinton private old_outstab(p) 7289814Slinton struct symtab *p; { 7299814Slinton register TWORD ptype; 7309814Slinton register char *pname; 7319814Slinton register char pclass; 7329814Slinton register int poffset; 7339814Slinton 7349814Slinton if (!gdebug) return; 7359814Slinton 7369814Slinton ptype = p->stype; 7379814Slinton pname = p->sname; 7389814Slinton pclass = p->sclass; 7399814Slinton poffset = p->offset; 7409814Slinton 7419814Slinton if (ISFTN(ptype)) { 7429814Slinton return; 7439814Slinton } 7449814Slinton 7459814Slinton switch (pclass) { 7469814Slinton 7479814Slinton case AUTO: 7489814Slinton old_pstab(pname, N_LSYM); 7499814Slinton printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); 7509814Slinton old_poffs(p); 7519814Slinton return; 7529814Slinton 7539814Slinton case EXTDEF: 7549814Slinton case EXTERN: 7559814Slinton old_pstab(pname, N_GSYM); 7569814Slinton printf("0,%d,0\n", ptype); 7579814Slinton old_poffs(p); 7589814Slinton return; 7599814Slinton 7609814Slinton case STATIC: 7619814Slinton #ifdef LCOMM 7629814Slinton /* stabLCSYM is 1 during nidcl so we can get stab type right */ 7639814Slinton old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); 7649814Slinton #else 7659814Slinton old_pstab(pname, N_STSYM); 7669814Slinton #endif 7679814Slinton if (p->slevel > 1) { 7689814Slinton printf("0,%d,L%d\n", ptype, poffset); 7699814Slinton } else { 7709814Slinton printf("0,%d,%s\n", ptype, exname(pname)); 7719814Slinton } 7729814Slinton old_poffs(p); 7739814Slinton return; 7749814Slinton 7759814Slinton case REGISTER: 7769814Slinton old_pstab(pname, N_RSYM); 7779814Slinton printf("0,%d,%d\n", ptype, poffset); 7789814Slinton old_poffs(p); 7799814Slinton return; 7809814Slinton 7819814Slinton case MOS: 7829814Slinton case MOU: 7839814Slinton old_pstab(pname, N_SSYM); 7849814Slinton printf("0,%d,%d\n", ptype, poffset/SZCHAR); 7859814Slinton old_poffs(p); 7869814Slinton return; 7879814Slinton 7889814Slinton case PARAM: 7899814Slinton /* parameter stab entries are processed in dclargs() */ 7909814Slinton return; 7919814Slinton 7929814Slinton default: 7939814Slinton #ifndef FLEXNAMES 7949814Slinton if (ddebug) printf(" No .stab for %.8s\n", pname); 7959814Slinton #else 7969814Slinton if (ddebug) printf(" No .stab for %s\n", pname); 7979814Slinton #endif 7989814Slinton 7999814Slinton } 8009814Slinton } 8019814Slinton 8029814Slinton private old_pstab(name, type) 8039814Slinton char *name; 8049814Slinton int type; { 8059814Slinton register int i; 8069814Slinton register char c; 8079814Slinton if (!gdebug) return; 8089814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8099814Slinton #ifdef ASSTRINGS 8109814Slinton if ( name[0] == '\0') 8119814Slinton printf("\t.stabn\t"); 8129814Slinton else 8139814Slinton #ifndef FLEXNAMES 8149814Slinton printf("\t.stabs\t\"%.8s\", ", name); 8159814Slinton #else 8169814Slinton printf("\t.stabs\t\"%s\", ", name); 8179814Slinton #endif 8189814Slinton #else 8199814Slinton printf(" .stab "); 8209814Slinton for(i=0; i<8; i++) 8219814Slinton if (c = name[i]) printf("'%c,", c); 8229814Slinton else printf("0,"); 8239814Slinton #endif 8249814Slinton printf("0%o,", type); 8259814Slinton } 8269814Slinton 8279814Slinton #ifdef STABDOT 8289814Slinton private old_pstabdot(type, value) 8299814Slinton int type; 8309814Slinton int value; 8319814Slinton { 8329814Slinton if ( ! gdebug) return; 8339814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8349814Slinton printf("\t.stabd\t"); 8359814Slinton printf("0%o,0,0%o\n",type, value); 8369814Slinton } 8379814Slinton #endif 8389814Slinton 8399814Slinton private old_poffs(p) 8409814Slinton register struct symtab *p; { 8419814Slinton int s; 8429814Slinton if (!gdebug) return; 8439814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { 8449814Slinton old_pstab(p->sname, N_LENG); 8459814Slinton printf("1,0,%d\n", s); 8469814Slinton } 8479814Slinton } 8489814Slinton 8499814Slinton private old_psline() { 8509814Slinton static int lastlineno; 8519814Slinton register char *cp, *cq; 8529814Slinton register int i; 8539814Slinton 8549814Slinton if (!gdebug) return; 8559814Slinton 8569814Slinton cq = ititle; 8579814Slinton cp = ftitle; 8589814Slinton 8599814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 8609814Slinton if ( *cp == '\0' ) goto eq; 8619814Slinton 8629814Slinton neq: for (i=0; i<100; i++) 8639814Slinton ititle[i] = '\0'; 8649814Slinton cp = ftitle; 8659814Slinton cq = ititle; 8669814Slinton while ( *cp ) 8679814Slinton *cq++ = *cp++; 8689814Slinton *cq = '\0'; 8699814Slinton *--cq = '\0'; 8709814Slinton #ifndef FLEXNAMES 8719814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 8729814Slinton old_pstab(cp, N_SOL); 8739814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8749814Slinton } 8759814Slinton #else 8769814Slinton old_pstab(ititle+1, N_SOL); 8779814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8789814Slinton #endif 8799814Slinton *cq = '"'; 8809814Slinton printf("LL%d:\n", labelno++); 8819814Slinton 8829814Slinton eq: if (lineno == lastlineno) return; 8839814Slinton lastlineno = lineno; 8849814Slinton 8859814Slinton if (fdefflag) { 8869814Slinton #ifdef STABDOT 8879814Slinton old_pstabdot(N_SLINE, lineno); 8889814Slinton #else 8899814Slinton old_pstab(NULLNAME, N_SLINE); 8909814Slinton printf("0,%d,LL%d\n", lineno, labelno); 8919814Slinton printf("LL%d:\n", labelno++); 8929814Slinton #endif 8939814Slinton } 8949814Slinton } 8959814Slinton 8969814Slinton private old_plcstab(level) { 8979814Slinton if (!gdebug) return; 8989814Slinton #ifdef STABDOT 8999814Slinton old_pstabdot(N_LBRAC, level); 9009814Slinton #else 9019814Slinton old_pstab(NULLNAME, N_LBRAC); 9029814Slinton printf("0,%d,LL%d\n", level, labelno); 9039814Slinton printf("LL%d:\n", labelno++); 9049814Slinton #endif 9059814Slinton } 9069814Slinton 9079814Slinton private old_prcstab(level) { 9089814Slinton if (!gdebug) return; 9099814Slinton #ifdef STABDOT 9109814Slinton pstabdot(N_RBRAC, level); 9119814Slinton #else 9129814Slinton pstab(NULLNAME, N_RBRAC); 9139814Slinton printf("0,%d,LL%d\n", level, labelno); 9149814Slinton printf("LL%d:\n", labelno++); 9159814Slinton #endif 9169814Slinton } 9179814Slinton 9189814Slinton private old_pfstab(sname) 9199814Slinton char *sname; { 9209814Slinton if (!gdebug) return; 9219814Slinton pstab(sname, N_FUN); 9229814Slinton #ifndef FLEXNAMES 9239814Slinton printf("0,%d,_%.7s\n", lineno, sname); 9249814Slinton #else 9259814Slinton printf("0,%d,_%s\n", lineno, sname); 9269814Slinton #endif 9279814Slinton } 928