19703Slinton /* 29703Slinton * Symbolic debugging info interface. 39703Slinton * 49703Slinton * Here we generate pseudo-ops that cause the assembler to put 59703Slinton * symbolic debugging information into the object file. 69703Slinton */ 79703Slinton 8*13941Slinton static char *sccsid ="@(#)stab.c 1.7 (Berkeley) 07/15/83"; 99703Slinton 109703Slinton #include "mfile1" 119703Slinton 129703Slinton #include <sys/types.h> 139703Slinton #include <a.out.h> 149703Slinton #include <stab.h> 159703Slinton 169703Slinton #define private static 179703Slinton #define and && 189703Slinton #define or || 199703Slinton #define not ! 209703Slinton #define div / 219703Slinton #define mod % 229703Slinton #define nil 0 239703Slinton 249703Slinton #define bytes(bits) ((bits) / SZCHAR) 259703Slinton #define bsize(p) bytes(dimtab[p->sizoff]) /* size in bytes of a symbol */ 269703Slinton 279703Slinton #define NILINDEX -1 289703Slinton #define FORWARD -2 299703Slinton 3010675Slinton typedef int Boolean; 319703Slinton 3210675Slinton #define false 0 3310675Slinton #define true 1 3410675Slinton 359703Slinton extern int ddebug; 369703Slinton extern int gdebug; 379703Slinton extern char *malloc(); 389703Slinton 399703Slinton int stabLCSYM; 409703Slinton 419703Slinton /* 429814Slinton * Flag for producing either sdb or dbx symbol information. 439814Slinton */ 449904Ssam int oldway = false; 459814Slinton 469814Slinton /* 479703Slinton * Generate debugging info for a parameter. 489703Slinton * The offset isn't known when it is first entered into the symbol table 499703Slinton * since the types are read later. 509703Slinton */ 519703Slinton 529703Slinton fixarg(p) 539703Slinton struct symtab *p; 549703Slinton { 559814Slinton if (oldway) { 569814Slinton old_fixarg(p); 579814Slinton } else if (gdebug) { 589703Slinton printf("\t.stabs\t\"%s:p", p->sname); 599703Slinton gentype(p); 609703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 619703Slinton } 629703Slinton } 639703Slinton 649703Slinton /* 65*13941Slinton * Determine if the given symbol is a global array with dimension 0, 66*13941Slinton * which only makes sense if it's dimension is to be given later. 67*13941Slinton * We therefore currently do not generate symbol information for 68*13941Slinton * such entries. 69*13941Slinton */ 70*13941Slinton 71*13941Slinton #define isglobal(class) ( \ 72*13941Slinton class == EXTDEF or class == EXTERN or class == STATIC \ 73*13941Slinton ) 74*13941Slinton 75*13941Slinton private Boolean zero_length_array(p) 76*13941Slinton register struct symtab *p; 77*13941Slinton { 78*13941Slinton Boolean b; 79*13941Slinton int t; 80*13941Slinton 81*13941Slinton if (not isglobal(p->sclass)) { 82*13941Slinton b = false; 83*13941Slinton } else { 84*13941Slinton t = p->stype; 85*13941Slinton if (ISFTN(t)) { 86*13941Slinton t = DECREF(t); 87*13941Slinton } 88*13941Slinton b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0); 89*13941Slinton } 90*13941Slinton return b; 91*13941Slinton } 92*13941Slinton 93*13941Slinton /* 949703Slinton * Generate debugging info for a given symbol. 959703Slinton */ 969703Slinton 979703Slinton outstab(sym) 989703Slinton struct symtab *sym; 999703Slinton { 1009703Slinton register struct symtab *p; 1019703Slinton char *classname; 1029703Slinton int offset; 1039703Slinton Boolean ignore; 1049703Slinton static Boolean firsttime = true; 1059703Slinton 1069814Slinton if (oldway) { 1079814Slinton old_outstab(sym); 108*13941Slinton } 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 offset = bytes(p->offset); 1169703Slinton switch (p->sclass) { 1179703Slinton case REGISTER: 1189703Slinton classname = "r"; 1199703Slinton offset = p->offset; 1209703Slinton break; 1219703Slinton 1229703Slinton /* 1239703Slinton * Locals are the default class. 1249703Slinton */ 1259703Slinton case AUTO: 1269703Slinton classname = ""; 1279703Slinton break; 1289703Slinton 1299703Slinton case STATIC: 1309703Slinton if (ISFTN(p->stype)) { 1319703Slinton ignore = true; 1329703Slinton } else if (p->slevel <= 1) { 1339703Slinton classname = "S"; 1349703Slinton } else { 1359703Slinton classname = "V"; 1369703Slinton } 1379703Slinton break; 1389703Slinton 1399703Slinton case EXTDEF: 1409703Slinton case EXTERN: 1419703Slinton if (ISFTN(p->stype)) { 1429703Slinton ignore = true; 1439703Slinton } else { 1449703Slinton classname = "G"; 1459703Slinton } 1469703Slinton break; 1479703Slinton 1489703Slinton case TYPEDEF: 1499703Slinton classname = "t"; 1509703Slinton break; 1519703Slinton 1529703Slinton case PARAM: 1539703Slinton case MOS: 1549703Slinton case MOU: 1559703Slinton case MOE: 1569703Slinton ignore = true; 1579703Slinton break; 1589703Slinton 1599703Slinton case ENAME: 1609703Slinton case UNAME: 1619703Slinton case STNAME: 1629703Slinton entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 1639703Slinton ignore = true; 1649703Slinton break; 1659703Slinton 1669703Slinton default: 1679703Slinton if ((p->sclass&FIELD) == 0) { 1689703Slinton printf("/* no info for %s (%d) */\n", p->sname, p->sclass); 1699703Slinton } 1709703Slinton ignore = true; 1719703Slinton break; 1729703Slinton } 1739703Slinton if (not ignore) { 1749703Slinton printf("\t.stabs\t\"%s:%s", p->sname, classname); 1759703Slinton gentype(p); 1769703Slinton geninfo(p); 1779703Slinton } 1789703Slinton } 1799703Slinton } 1809703Slinton 1819703Slinton /* 1829703Slinton * Since type names are lost in the travels and because C has 1839703Slinton * structural type equivalence we keep a table of type words that 1849703Slinton * we've already seen. The first time we see a type, it is assigned 1859703Slinton * (inline) a number and future references just list that number. 1869703Slinton * Structures, unions, enums, and arrays must be handled carefully 1879703Slinton * since not all the necessary information is in the type word. 1889703Slinton */ 1899703Slinton 1909703Slinton typedef struct Typeid *Typeid; 1919703Slinton 1929703Slinton struct Typeid { 1939703Slinton TWORD tword; 1949703Slinton int tarray; 1959703Slinton int tstruct; 1969703Slinton int tstrtag; 1979703Slinton int tnum; 1989703Slinton Typeid chain; 1999703Slinton }; 2009703Slinton 2019703Slinton #define TABLESIZE 2003 2029703Slinton 2039703Slinton private int tcount = 1; 2049703Slinton private int t_int, t_char; 2059703Slinton private Typeid typetable[TABLESIZE]; 2069703Slinton 2079703Slinton /* 2089703Slinton * Look for the given type word in the type table. 2099703Slinton */ 2109703Slinton 2119703Slinton private Typeid typelookup(type, arrindex, strindex, strtag) 2129703Slinton TWORD type; 2139703Slinton int arrindex; 2149703Slinton int strindex; 2159703Slinton int strtag; 2169703Slinton { 2179703Slinton register TWORD tword; 2189703Slinton register int i1, i2; 2199703Slinton Typeid t; 2209703Slinton 2219703Slinton t = typetable[type mod TABLESIZE]; 2229703Slinton while (t != nil) { 2239703Slinton if (t->tword == type and 2249703Slinton strindex == t->tstruct and strtag == t->tstrtag) { 2259703Slinton if (arrindex == NILINDEX) { 2269703Slinton break; 2279703Slinton } else { 22811872Slinton tword = type; 2299703Slinton i1 = arrindex; 2309703Slinton i2 = t->tarray; 2319703Slinton while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { 2329703Slinton ++i1; 2339703Slinton ++i2; 2349703Slinton tword >>= TSHIFT; 2359703Slinton } 2369703Slinton if (!ISARY(tword)) { 2379703Slinton break; 2389703Slinton } 2399703Slinton } 2409703Slinton } 2419703Slinton t = t->chain; 2429703Slinton } 2439703Slinton return t; 2449703Slinton } 2459703Slinton 2469703Slinton /* 2479703Slinton * Enter a type word and associated symtab indices into the type table. 2489703Slinton */ 2499703Slinton 2509703Slinton private int entertype(type, arrindex, strindex, strtag) 2519703Slinton TWORD type; 2529703Slinton int arrindex; 2539703Slinton int strindex; 2549703Slinton int strtag; 2559703Slinton { 2569703Slinton register Typeid t; 2579703Slinton register int i; 2589703Slinton 2599703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2609703Slinton t->tword = type; 2619703Slinton t->tarray = arrindex; 2629703Slinton t->tstruct = strindex; 2639703Slinton t->tstrtag = strtag; 2649703Slinton t->tnum = tcount; 2659703Slinton ++tcount; 2669703Slinton i = type mod TABLESIZE; 2679703Slinton t->chain = typetable[i]; 2689703Slinton typetable[i] = t; 2699703Slinton return t->tnum; 2709703Slinton } 2719703Slinton 2729703Slinton /* 2739703Slinton * Change the information associated with a type table entry. 2749703Slinton * Since I'm lazy this just creates a new entry with the number 2759703Slinton * as the old one. 2769703Slinton */ 2779703Slinton 2789703Slinton private reentertype(typeid, type, arrindex, strindex, strtag) 2799703Slinton Typeid typeid; 2809703Slinton TWORD type; 2819703Slinton int arrindex; 2829703Slinton int strindex; 2839703Slinton int strtag; 2849703Slinton { 2859703Slinton register Typeid t; 2869703Slinton register int i; 2879703Slinton 2889703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2899703Slinton t->tword = type; 2909703Slinton t->tarray = arrindex; 2919703Slinton t->tstruct = strindex; 2929703Slinton t->tstrtag = strtag; 2939703Slinton t->tnum = typeid->tnum; 2949703Slinton i = type mod TABLESIZE; 2959703Slinton t->chain = typetable[i]; 2969703Slinton typetable[i] = t; 2979703Slinton } 2989703Slinton 2999703Slinton /* 3009703Slinton * Initialize type table with predefined types. 3019703Slinton */ 3029703Slinton 3039703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX) 3049703Slinton 3059703Slinton private inittypes() 3069703Slinton { 3079703Slinton int t; 3089703Slinton 3099703Slinton t_int = builtintype(INT); 3109703Slinton t_char = builtintype(CHAR); 3119703Slinton maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); 3129703Slinton maketype("char", t_char, t_char, 0L, 127L); 3139703Slinton maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); 3149703Slinton maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); 3159703Slinton maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); 3169703Slinton maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); 3179703Slinton maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); 3189703Slinton maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); 3199703Slinton maketype("float", builtintype(FLOAT), t_int, 4L, 0L); 3209703Slinton maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); 3219703Slinton t = builtintype(UNDEF); 3229703Slinton printf("\t.stabs\t\"void:t%d=%d", t, t); 3239703Slinton geninfo(nil); 32410675Slinton t = builtintype(FARG); 32510675Slinton printf("\t.stabs\t\"???:t%d=%d", t, t_int); 32610675Slinton geninfo(nil); 3279703Slinton } 3289703Slinton 3299703Slinton /* 3309703Slinton * Generate info for a new range type. 3319703Slinton */ 3329703Slinton 3339703Slinton private maketype(name, tnum, eqtnum, lower, upper) 3349703Slinton char *name; 3359703Slinton int tnum, eqtnum; 3369703Slinton long lower, upper; 3379703Slinton { 3389703Slinton printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper); 3399703Slinton geninfo(nil); 3409703Slinton } 3419703Slinton 3429703Slinton /* 3439703Slinton * Generate debugging information for the given type of the given symbol. 3449703Slinton */ 3459703Slinton 3469703Slinton private gentype(sym) 3479703Slinton struct symtab *sym; 3489703Slinton { 3499703Slinton register struct symtab *p; 3509703Slinton register TWORD t; 3519703Slinton register TWORD basictype; 3529703Slinton register Typeid typeid; 3539703Slinton int i, arrindex, strindex, strtag; 3549703Slinton 3559703Slinton p = sym; 3569703Slinton t = p->stype; 3579703Slinton if (ISFTN(t)) { 3589703Slinton t = DECREF(t); 3599703Slinton } 3609703Slinton basictype = BTYPE(t); 3619703Slinton if (ISARY(t)) { 3629703Slinton arrindex = p->dimoff; 3639703Slinton } else { 3649703Slinton arrindex = NILINDEX; 3659703Slinton } 3669703Slinton if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { 3679703Slinton strindex = dimtab[p->sizoff + 1]; 3689703Slinton if (strindex == -1) { 3699703Slinton strindex = FORWARD; 3709703Slinton strtag = dimtab[p->sizoff + 3]; 3719703Slinton } else { 3729703Slinton strtag = NILINDEX; 3739703Slinton } 3749703Slinton } else { 3759703Slinton strindex = NILINDEX; 3769703Slinton strtag = NILINDEX; 3779703Slinton } 3789703Slinton i = arrindex; 3799703Slinton typeid = typelookup(t, arrindex, strindex, strtag); 3809703Slinton while (t != basictype and typeid == nil) { 3819703Slinton printf("%d=", entertype(t, i, strindex, strtag)); 3829703Slinton switch (t&TMASK) { 3839703Slinton case PTR: 3849703Slinton printf("*"); 3859703Slinton break; 3869703Slinton 3879703Slinton case FTN: 3889703Slinton printf("f"); 3899703Slinton break; 3909703Slinton 3919703Slinton case ARY: 3929703Slinton printf("ar%d;0;%d;", t_int, dimtab[i++] - 1); 3939703Slinton break; 3949703Slinton } 3959703Slinton t = DECREF(t); 3969703Slinton if (t == basictype) { 3979703Slinton typeid = typelookup(t, NILINDEX, strindex, strtag); 3989703Slinton } else { 3999703Slinton typeid = typelookup(t, i, strindex, strtag); 4009703Slinton } 4019703Slinton } 4029703Slinton if (typeid == nil) { 4039703Slinton if (strindex == FORWARD) { 4049703Slinton typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 4059703Slinton if (typeid == nil) { 4069703Slinton cerror("unbelievable forward reference"); 4079703Slinton } 4089703Slinton printf("%d", typeid->tnum); 4099703Slinton } else { 4109703Slinton genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); 4119703Slinton } 4129703Slinton } else { 4139703Slinton printf("%d", typeid->tnum); 4149703Slinton } 4159703Slinton } 4169703Slinton 4179703Slinton /* 4189703Slinton * Generate type information for structures, unions, and enumerations. 4199703Slinton */ 4209703Slinton 4219703Slinton private genstruct(t, structid, index, name, size) 4229703Slinton TWORD t; 4239703Slinton int structid; 4249703Slinton int index; 4259703Slinton char *name; 4269703Slinton int size; 4279703Slinton { 4289703Slinton register int i; 4299703Slinton register struct symtab *field; 4309703Slinton int id; 4319703Slinton 4329703Slinton if (structid == NILINDEX) { 4339703Slinton id = entertype(t, NILINDEX, index, NILINDEX); 4349703Slinton } else { 4359703Slinton id = structid; 4369703Slinton } 4379703Slinton switch (t) { 4389703Slinton case STRTY: 4399703Slinton case UNIONTY: 4409703Slinton printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); 4419703Slinton i = index; 4429703Slinton while (dimtab[i] != -1) { 4439703Slinton field = &stab[dimtab[i]]; 4449703Slinton printf("%s:", field->sname); 4459703Slinton gentype(field); 4469703Slinton if (field->sclass > FIELD) { 4479703Slinton printf(",%d,%d;", field->offset, field->sclass - FIELD); 4489703Slinton } else { 4499703Slinton printf(",%d,%d;", field->offset, 4509703Slinton tsize(field->stype, field->dimoff, field->sizoff)); 4519703Slinton } 4529703Slinton ++i; 4539703Slinton } 4549703Slinton putchar(';'); 4559703Slinton break; 4569703Slinton 4579703Slinton case ENUMTY: 4589703Slinton printf("%d=e", id); 4599703Slinton i = index; 4609703Slinton while (dimtab[i] != -1) { 4619703Slinton field = &stab[dimtab[i]]; 4629703Slinton printf("%s:%d,", field->sname, field->offset); 4639703Slinton i++; 4649703Slinton } 4659703Slinton break; 4669703Slinton 4679703Slinton default: 4689703Slinton cerror("couldn't find basic type %d for %s\n", t, name); 4699703Slinton break; 4709703Slinton } 4719703Slinton } 4729703Slinton 4739703Slinton /* 4749703Slinton * Generate offset and size info. 4759703Slinton */ 4769703Slinton 4779703Slinton private geninfo(p) 4789703Slinton register struct symtab *p; 4799703Slinton { 4809703Slinton if (p == nil) { 4819703Slinton printf("\",0x%x,0,0,0\n", N_LSYM); 4829703Slinton } else { 4839703Slinton switch (p->sclass) { 4849703Slinton case EXTERN: 4859703Slinton case EXTDEF: 4869703Slinton if (ISFTN(p->stype)) { 4879703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4889703Slinton } else { 48910675Slinton printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p)); 4909703Slinton } 4919703Slinton break; 4929703Slinton 4939703Slinton case STATIC: 4949703Slinton if (ISFTN(p->stype)) { 4959703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4969703Slinton } else if (p->slevel > 1) { 49712061Slinton printf("\",0x%x,0,%d,L%d\n", N_LCSYM, bsize(p), p->offset); 4989703Slinton } else { 4999703Slinton printf("\",0x%x,0,%d,_%s\n", N_LCSYM, bsize(p), p->sname); 5009703Slinton } 5019703Slinton break; 5029703Slinton 5039703Slinton case REGISTER: 5049703Slinton printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); 5059703Slinton break; 5069703Slinton 5079703Slinton case PARAM: 5089703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 5099703Slinton break; 5109703Slinton 5119703Slinton default: 5129703Slinton printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); 5139703Slinton break; 5149703Slinton } 5159703Slinton } 5169703Slinton } 5179703Slinton 5189703Slinton /* 5199703Slinton * Generate information for a newly-defined structure. 5209703Slinton */ 5219703Slinton 5229703Slinton outstruct(szindex, paramindex) 5239703Slinton int szindex, paramindex; 5249703Slinton { 5259703Slinton register Typeid typeid; 5269703Slinton register struct symtab *p; 5279703Slinton register int i, t, strindex; 5289703Slinton 5299814Slinton if (oldway) { 5309814Slinton /* do nothing */; 5319814Slinton } else if (gdebug) { 5329703Slinton i = dimtab[szindex + 3]; 5339703Slinton p = &stab[i]; 5349703Slinton if (p->sname != nil) { 5359703Slinton strindex = dimtab[p->sizoff + 1]; 5369703Slinton typeid = typelookup(p->stype, NILINDEX, FORWARD, i); 5379703Slinton if (typeid == nil) { 5389703Slinton t = 0; 5399703Slinton } else { 5409703Slinton t = typeid->tnum; 5419703Slinton reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); 5429703Slinton } 5439703Slinton printf("\t.stabs\t\"%s:T", p->sname); 5449703Slinton genstruct(p->stype, t, strindex, p->sname, bsize(p)); 5459703Slinton geninfo(p); 5469703Slinton } 5479703Slinton } 5489703Slinton } 5499703Slinton 5509703Slinton pstab(name, type) 5519703Slinton char *name; 5529703Slinton int type; 5539703Slinton { 5549703Slinton register int i; 5559703Slinton register char c; 5569814Slinton 5579814Slinton if (!gdebug) { 5589814Slinton return; 5599814Slinton } else if (oldway) { 5609814Slinton old_pstab(name, type); 5619814Slinton return; 5629814Slinton } 5639703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5649703Slinton #ifdef ASSTRINGS 5659703Slinton if ( name[0] == '\0') 5669703Slinton printf("\t.stabn\t"); 5679703Slinton else 5689703Slinton #ifndef FLEXNAMES 5699703Slinton printf("\t.stabs\t\"%.8s\",", name); 5709703Slinton #else 5719703Slinton printf("\t.stabs\t\"%s\",", name); 5729703Slinton #endif 5739703Slinton #else 5749703Slinton printf(" .stab "); 5759703Slinton for(i=0; i<8; i++) 5769703Slinton if (c = name[i]) printf("'%c,", c); 5779703Slinton else printf("0,"); 5789703Slinton #endif 5799703Slinton printf("0%o,", type); 5809703Slinton } 5819703Slinton 5829703Slinton #ifdef STABDOT 5839703Slinton pstabdot(type, value) 5849703Slinton int type; 5859703Slinton int value; 5869703Slinton { 5879814Slinton if ( ! gdebug) { 5889814Slinton return; 5899814Slinton } else if (oldway) { 5909814Slinton old_pstabdot(type, value); 5919814Slinton return; 5929814Slinton } 5939703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5949703Slinton printf("\t.stabd\t"); 5959703Slinton printf("0%o,0,0%o\n",type, value); 5969703Slinton } 5979703Slinton #endif 5989703Slinton 5999703Slinton extern char NULLNAME[8]; 6009703Slinton extern int labelno; 6019703Slinton extern int fdefflag; 6029703Slinton 6039703Slinton psline() 6049703Slinton { 6059703Slinton static int lastlineno; 6069703Slinton register char *cp, *cq; 6079703Slinton register int i; 6089703Slinton 6099814Slinton if (!gdebug) { 6109814Slinton return; 6119814Slinton } else if (oldway) { 6129814Slinton old_psline(); 6139814Slinton return; 6149814Slinton } 6159703Slinton 6169703Slinton cq = ititle; 6179703Slinton cp = ftitle; 6189703Slinton 6199703Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 6209703Slinton if ( *cp == '\0' ) goto eq; 6219703Slinton 6229703Slinton neq: for (i=0; i<100; i++) 6239703Slinton ititle[i] = '\0'; 6249703Slinton cp = ftitle; 6259703Slinton cq = ititle; 6269703Slinton while ( *cp ) 6279703Slinton *cq++ = *cp++; 6289703Slinton *cq = '\0'; 6299703Slinton *--cq = '\0'; 6309703Slinton #ifndef FLEXNAMES 6319703Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 6329703Slinton pstab(cp, N_SOL); 6339703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6349703Slinton } 6359703Slinton #else 6369703Slinton pstab(ititle+1, N_SOL); 6379703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6389703Slinton #endif 6399703Slinton *cq = '"'; 6409703Slinton printf("LL%d:\n", labelno++); 6419703Slinton 6429703Slinton eq: if (lineno == lastlineno) return; 6439703Slinton lastlineno = lineno; 6449703Slinton 6459703Slinton if (fdefflag) { 6469703Slinton #ifdef STABDOT 6479703Slinton pstabdot(N_SLINE, lineno); 6489703Slinton #else 6499703Slinton pstab(NULLNAME, N_SLINE); 6509703Slinton printf("0,%d,LL%d\n", lineno, labelno); 6519703Slinton printf("LL%d:\n", labelno++); 6529703Slinton #endif 6539703Slinton } 6549703Slinton } 6559703Slinton 6569703Slinton plcstab(level) 6579703Slinton int level; 6589703Slinton { 6599814Slinton if (!gdebug) { 6609814Slinton return; 6619814Slinton } else if (oldway) { 6629814Slinton old_plcstab(level); 6639814Slinton return; 6649814Slinton } 6659703Slinton #ifdef STABDOT 6669703Slinton pstabdot(N_LBRAC, level); 6679703Slinton #else 6689703Slinton pstab(NULLNAME, N_LBRAC); 6699703Slinton printf("0,%d,LL%d\n", level, labelno); 6709703Slinton printf("LL%d:\n", labelno++); 6719703Slinton #endif 6729703Slinton } 6739703Slinton 6749703Slinton prcstab(level) 6759703Slinton int level; 6769703Slinton { 6779814Slinton if (!gdebug) { 6789814Slinton return; 6799814Slinton } else if (oldway) { 6809814Slinton old_prcstab(level); 6819814Slinton return; 6829814Slinton } 6839703Slinton #ifdef STABDOT 6849703Slinton pstabdot(N_RBRAC, level); 6859703Slinton #else 6869703Slinton pstab(NULLNAME, N_RBRAC); 6879703Slinton printf("0,%d,LL%d\n", level, labelno); 6889703Slinton printf("LL%d:\n", labelno++); 6899703Slinton #endif 6909703Slinton } 6919703Slinton 6929703Slinton pfstab(sname) 6939703Slinton char *sname; 6949703Slinton { 6959703Slinton register struct symtab *p; 6969703Slinton 6979703Slinton if (gdebug) { 6989814Slinton if (oldway) { 6999814Slinton old_pfstab(sname); 7009814Slinton } else { 7019814Slinton p = &stab[lookup(sname, 0)]; 7029814Slinton printf("\t.stabs\t\"%s:", p->sname); 7039814Slinton putchar((p->sclass == STATIC) ? 'f' : 'F'); 7049814Slinton gentype(p); 7059814Slinton geninfo(p); 7069814Slinton } 7079703Slinton } 7089703Slinton } 7099814Slinton 7109814Slinton /* 7119814Slinton * Old way of doing things. 7129814Slinton */ 7139814Slinton 7149814Slinton private old_fixarg(p) 7159814Slinton struct symtab *p; { 7169814Slinton if (gdebug) { 7179814Slinton old_pstab(p->sname, N_PSYM); 7189814Slinton if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); 7199814Slinton old_poffs(p); 7209814Slinton } 7219814Slinton } 7229814Slinton 7239814Slinton private old_outstab(p) 7249814Slinton struct symtab *p; { 7259814Slinton register TWORD ptype; 7269814Slinton register char *pname; 7279814Slinton register char pclass; 7289814Slinton register int poffset; 7299814Slinton 7309814Slinton if (!gdebug) return; 7319814Slinton 7329814Slinton ptype = p->stype; 7339814Slinton pname = p->sname; 7349814Slinton pclass = p->sclass; 7359814Slinton poffset = p->offset; 7369814Slinton 7379814Slinton if (ISFTN(ptype)) { 7389814Slinton return; 7399814Slinton } 7409814Slinton 7419814Slinton switch (pclass) { 7429814Slinton 7439814Slinton case AUTO: 7449814Slinton old_pstab(pname, N_LSYM); 7459814Slinton printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); 7469814Slinton old_poffs(p); 7479814Slinton return; 7489814Slinton 7499814Slinton case EXTDEF: 7509814Slinton case EXTERN: 7519814Slinton old_pstab(pname, N_GSYM); 7529814Slinton printf("0,%d,0\n", ptype); 7539814Slinton old_poffs(p); 7549814Slinton return; 7559814Slinton 7569814Slinton case STATIC: 7579814Slinton #ifdef LCOMM 7589814Slinton /* stabLCSYM is 1 during nidcl so we can get stab type right */ 7599814Slinton old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); 7609814Slinton #else 7619814Slinton old_pstab(pname, N_STSYM); 7629814Slinton #endif 7639814Slinton if (p->slevel > 1) { 7649814Slinton printf("0,%d,L%d\n", ptype, poffset); 7659814Slinton } else { 7669814Slinton printf("0,%d,%s\n", ptype, exname(pname)); 7679814Slinton } 7689814Slinton old_poffs(p); 7699814Slinton return; 7709814Slinton 7719814Slinton case REGISTER: 7729814Slinton old_pstab(pname, N_RSYM); 7739814Slinton printf("0,%d,%d\n", ptype, poffset); 7749814Slinton old_poffs(p); 7759814Slinton return; 7769814Slinton 7779814Slinton case MOS: 7789814Slinton case MOU: 7799814Slinton old_pstab(pname, N_SSYM); 7809814Slinton printf("0,%d,%d\n", ptype, poffset/SZCHAR); 7819814Slinton old_poffs(p); 7829814Slinton return; 7839814Slinton 7849814Slinton case PARAM: 7859814Slinton /* parameter stab entries are processed in dclargs() */ 7869814Slinton return; 7879814Slinton 7889814Slinton default: 7899814Slinton #ifndef FLEXNAMES 7909814Slinton if (ddebug) printf(" No .stab for %.8s\n", pname); 7919814Slinton #else 7929814Slinton if (ddebug) printf(" No .stab for %s\n", pname); 7939814Slinton #endif 7949814Slinton 7959814Slinton } 7969814Slinton } 7979814Slinton 7989814Slinton private old_pstab(name, type) 7999814Slinton char *name; 8009814Slinton int type; { 8019814Slinton register int i; 8029814Slinton register char c; 8039814Slinton if (!gdebug) return; 8049814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8059814Slinton #ifdef ASSTRINGS 8069814Slinton if ( name[0] == '\0') 8079814Slinton printf("\t.stabn\t"); 8089814Slinton else 8099814Slinton #ifndef FLEXNAMES 8109814Slinton printf("\t.stabs\t\"%.8s\", ", name); 8119814Slinton #else 8129814Slinton printf("\t.stabs\t\"%s\", ", name); 8139814Slinton #endif 8149814Slinton #else 8159814Slinton printf(" .stab "); 8169814Slinton for(i=0; i<8; i++) 8179814Slinton if (c = name[i]) printf("'%c,", c); 8189814Slinton else printf("0,"); 8199814Slinton #endif 8209814Slinton printf("0%o,", type); 8219814Slinton } 8229814Slinton 8239814Slinton #ifdef STABDOT 8249814Slinton private old_pstabdot(type, value) 8259814Slinton int type; 8269814Slinton int value; 8279814Slinton { 8289814Slinton if ( ! gdebug) return; 8299814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 8309814Slinton printf("\t.stabd\t"); 8319814Slinton printf("0%o,0,0%o\n",type, value); 8329814Slinton } 8339814Slinton #endif 8349814Slinton 8359814Slinton private old_poffs(p) 8369814Slinton register struct symtab *p; { 8379814Slinton int s; 8389814Slinton if (!gdebug) return; 8399814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { 8409814Slinton old_pstab(p->sname, N_LENG); 8419814Slinton printf("1,0,%d\n", s); 8429814Slinton } 8439814Slinton } 8449814Slinton 8459814Slinton private old_psline() { 8469814Slinton static int lastlineno; 8479814Slinton register char *cp, *cq; 8489814Slinton register int i; 8499814Slinton 8509814Slinton if (!gdebug) return; 8519814Slinton 8529814Slinton cq = ititle; 8539814Slinton cp = ftitle; 8549814Slinton 8559814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 8569814Slinton if ( *cp == '\0' ) goto eq; 8579814Slinton 8589814Slinton neq: for (i=0; i<100; i++) 8599814Slinton ititle[i] = '\0'; 8609814Slinton cp = ftitle; 8619814Slinton cq = ititle; 8629814Slinton while ( *cp ) 8639814Slinton *cq++ = *cp++; 8649814Slinton *cq = '\0'; 8659814Slinton *--cq = '\0'; 8669814Slinton #ifndef FLEXNAMES 8679814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 8689814Slinton old_pstab(cp, N_SOL); 8699814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8709814Slinton } 8719814Slinton #else 8729814Slinton old_pstab(ititle+1, N_SOL); 8739814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8749814Slinton #endif 8759814Slinton *cq = '"'; 8769814Slinton printf("LL%d:\n", labelno++); 8779814Slinton 8789814Slinton eq: if (lineno == lastlineno) return; 8799814Slinton lastlineno = lineno; 8809814Slinton 8819814Slinton if (fdefflag) { 8829814Slinton #ifdef STABDOT 8839814Slinton old_pstabdot(N_SLINE, lineno); 8849814Slinton #else 8859814Slinton old_pstab(NULLNAME, N_SLINE); 8869814Slinton printf("0,%d,LL%d\n", lineno, labelno); 8879814Slinton printf("LL%d:\n", labelno++); 8889814Slinton #endif 8899814Slinton } 8909814Slinton } 8919814Slinton 8929814Slinton private old_plcstab(level) { 8939814Slinton if (!gdebug) return; 8949814Slinton #ifdef STABDOT 8959814Slinton old_pstabdot(N_LBRAC, level); 8969814Slinton #else 8979814Slinton old_pstab(NULLNAME, N_LBRAC); 8989814Slinton printf("0,%d,LL%d\n", level, labelno); 8999814Slinton printf("LL%d:\n", labelno++); 9009814Slinton #endif 9019814Slinton } 9029814Slinton 9039814Slinton private old_prcstab(level) { 9049814Slinton if (!gdebug) return; 9059814Slinton #ifdef STABDOT 9069814Slinton pstabdot(N_RBRAC, level); 9079814Slinton #else 9089814Slinton pstab(NULLNAME, N_RBRAC); 9099814Slinton printf("0,%d,LL%d\n", level, labelno); 9109814Slinton printf("LL%d:\n", labelno++); 9119814Slinton #endif 9129814Slinton } 9139814Slinton 9149814Slinton private old_pfstab(sname) 9159814Slinton char *sname; { 9169814Slinton if (!gdebug) return; 9179814Slinton pstab(sname, N_FUN); 9189814Slinton #ifndef FLEXNAMES 9199814Slinton printf("0,%d,_%.7s\n", lineno, sname); 9209814Slinton #else 9219814Slinton printf("0,%d,_%s\n", lineno, sname); 9229814Slinton #endif 9239814Slinton } 924