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*9904Ssam static char *sccsid ="@(#)stab.c 1.3 (Berkeley) 12/24/82"; 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 309703Slinton typedef enum { false, true } Boolean; 319703Slinton 329703Slinton extern int ddebug; 339703Slinton extern int gdebug; 349703Slinton extern char *malloc(); 359703Slinton 369703Slinton int stabLCSYM; 379703Slinton 389703Slinton /* 399814Slinton * Flag for producing either sdb or dbx symbol information. 409814Slinton */ 41*9904Ssam int oldway = false; 429814Slinton 439814Slinton /* 449703Slinton * Generate debugging info for a parameter. 459703Slinton * The offset isn't known when it is first entered into the symbol table 469703Slinton * since the types are read later. 479703Slinton */ 489703Slinton 499703Slinton fixarg(p) 509703Slinton struct symtab *p; 519703Slinton { 529814Slinton if (oldway) { 539814Slinton old_fixarg(p); 549814Slinton } else if (gdebug) { 559703Slinton printf("\t.stabs\t\"%s:p", p->sname); 569703Slinton gentype(p); 579703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 589703Slinton } 599703Slinton } 609703Slinton 619703Slinton /* 629703Slinton * Generate debugging info for a given symbol. 639703Slinton */ 649703Slinton 659703Slinton outstab(sym) 669703Slinton struct symtab *sym; 679703Slinton { 689703Slinton register struct symtab *p; 699703Slinton char *classname; 709703Slinton int offset; 719703Slinton Boolean ignore; 729703Slinton static Boolean firsttime = true; 739703Slinton 749814Slinton if (oldway) { 759814Slinton old_outstab(sym); 769814Slinton } else if (gdebug) { 779703Slinton if (firsttime) { 789703Slinton firsttime = false; 799703Slinton inittypes(); 809703Slinton } 819703Slinton ignore = false; 829703Slinton p = sym; 839703Slinton offset = bytes(p->offset); 849703Slinton switch (p->sclass) { 859703Slinton case REGISTER: 869703Slinton classname = "r"; 879703Slinton offset = p->offset; 889703Slinton break; 899703Slinton 909703Slinton /* 919703Slinton * Locals are the default class. 929703Slinton */ 939703Slinton case AUTO: 949703Slinton classname = ""; 959703Slinton break; 969703Slinton 979703Slinton case STATIC: 989703Slinton if (ISFTN(p->stype)) { 999703Slinton ignore = true; 1009703Slinton } else if (p->slevel <= 1) { 1019703Slinton classname = "S"; 1029703Slinton } else { 1039703Slinton classname = "V"; 1049703Slinton } 1059703Slinton break; 1069703Slinton 1079703Slinton case EXTDEF: 1089703Slinton case EXTERN: 1099703Slinton if (ISFTN(p->stype)) { 1109703Slinton ignore = true; 1119703Slinton } else { 1129703Slinton classname = "G"; 1139703Slinton } 1149703Slinton break; 1159703Slinton 1169703Slinton case TYPEDEF: 1179703Slinton classname = "t"; 1189703Slinton break; 1199703Slinton 1209703Slinton case PARAM: 1219703Slinton case MOS: 1229703Slinton case MOU: 1239703Slinton case MOE: 1249703Slinton ignore = true; 1259703Slinton break; 1269703Slinton 1279703Slinton case ENAME: 1289703Slinton case UNAME: 1299703Slinton case STNAME: 1309703Slinton entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 1319703Slinton ignore = true; 1329703Slinton break; 1339703Slinton 1349703Slinton default: 1359703Slinton if ((p->sclass&FIELD) == 0) { 1369703Slinton printf("/* no info for %s (%d) */\n", p->sname, p->sclass); 1379703Slinton } 1389703Slinton ignore = true; 1399703Slinton break; 1409703Slinton } 1419703Slinton if (not ignore) { 1429703Slinton printf("\t.stabs\t\"%s:%s", p->sname, classname); 1439703Slinton gentype(p); 1449703Slinton geninfo(p); 1459703Slinton } 1469703Slinton } 1479703Slinton } 1489703Slinton 1499703Slinton /* 1509703Slinton * Since type names are lost in the travels and because C has 1519703Slinton * structural type equivalence we keep a table of type words that 1529703Slinton * we've already seen. The first time we see a type, it is assigned 1539703Slinton * (inline) a number and future references just list that number. 1549703Slinton * Structures, unions, enums, and arrays must be handled carefully 1559703Slinton * since not all the necessary information is in the type word. 1569703Slinton */ 1579703Slinton 1589703Slinton typedef struct Typeid *Typeid; 1599703Slinton 1609703Slinton struct Typeid { 1619703Slinton TWORD tword; 1629703Slinton int tarray; 1639703Slinton int tstruct; 1649703Slinton int tstrtag; 1659703Slinton int tnum; 1669703Slinton Typeid chain; 1679703Slinton }; 1689703Slinton 1699703Slinton #define TABLESIZE 2003 1709703Slinton 1719703Slinton private int tcount = 1; 1729703Slinton private int t_int, t_char; 1739703Slinton private Typeid typetable[TABLESIZE]; 1749703Slinton 1759703Slinton /* 1769703Slinton * Look for the given type word in the type table. 1779703Slinton */ 1789703Slinton 1799703Slinton private Typeid typelookup(type, arrindex, strindex, strtag) 1809703Slinton TWORD type; 1819703Slinton int arrindex; 1829703Slinton int strindex; 1839703Slinton int strtag; 1849703Slinton { 1859703Slinton register TWORD tword; 1869703Slinton register int i1, i2; 1879703Slinton Typeid t; 1889703Slinton 1899703Slinton t = typetable[type mod TABLESIZE]; 1909703Slinton while (t != nil) { 1919703Slinton if (t->tword == type and 1929703Slinton strindex == t->tstruct and strtag == t->tstrtag) { 1939703Slinton if (arrindex == NILINDEX) { 1949703Slinton break; 1959703Slinton } else { 1969703Slinton tword = type >> TSHIFT; 1979703Slinton i1 = arrindex; 1989703Slinton i2 = t->tarray; 1999703Slinton while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { 2009703Slinton ++i1; 2019703Slinton ++i2; 2029703Slinton tword >>= TSHIFT; 2039703Slinton } 2049703Slinton if (!ISARY(tword)) { 2059703Slinton break; 2069703Slinton } 2079703Slinton } 2089703Slinton } 2099703Slinton t = t->chain; 2109703Slinton } 2119703Slinton return t; 2129703Slinton } 2139703Slinton 2149703Slinton /* 2159703Slinton * Enter a type word and associated symtab indices into the type table. 2169703Slinton */ 2179703Slinton 2189703Slinton private int entertype(type, arrindex, strindex, strtag) 2199703Slinton TWORD type; 2209703Slinton int arrindex; 2219703Slinton int strindex; 2229703Slinton int strtag; 2239703Slinton { 2249703Slinton register Typeid t; 2259703Slinton register int i; 2269703Slinton 2279703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2289703Slinton t->tword = type; 2299703Slinton t->tarray = arrindex; 2309703Slinton t->tstruct = strindex; 2319703Slinton t->tstrtag = strtag; 2329703Slinton t->tnum = tcount; 2339703Slinton ++tcount; 2349703Slinton i = type mod TABLESIZE; 2359703Slinton t->chain = typetable[i]; 2369703Slinton typetable[i] = t; 2379703Slinton return t->tnum; 2389703Slinton } 2399703Slinton 2409703Slinton /* 2419703Slinton * Change the information associated with a type table entry. 2429703Slinton * Since I'm lazy this just creates a new entry with the number 2439703Slinton * as the old one. 2449703Slinton */ 2459703Slinton 2469703Slinton private reentertype(typeid, type, arrindex, strindex, strtag) 2479703Slinton Typeid typeid; 2489703Slinton TWORD type; 2499703Slinton int arrindex; 2509703Slinton int strindex; 2519703Slinton int strtag; 2529703Slinton { 2539703Slinton register Typeid t; 2549703Slinton register int i; 2559703Slinton 2569703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2579703Slinton t->tword = type; 2589703Slinton t->tarray = arrindex; 2599703Slinton t->tstruct = strindex; 2609703Slinton t->tstrtag = strtag; 2619703Slinton t->tnum = typeid->tnum; 2629703Slinton i = type mod TABLESIZE; 2639703Slinton t->chain = typetable[i]; 2649703Slinton typetable[i] = t; 2659703Slinton } 2669703Slinton 2679703Slinton /* 2689703Slinton * Initialize type table with predefined types. 2699703Slinton */ 2709703Slinton 2719703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX) 2729703Slinton 2739703Slinton private inittypes() 2749703Slinton { 2759703Slinton int t; 2769703Slinton 2779703Slinton t_int = builtintype(INT); 2789703Slinton t_char = builtintype(CHAR); 2799703Slinton maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); 2809703Slinton maketype("char", t_char, t_char, 0L, 127L); 2819703Slinton maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); 2829703Slinton maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); 2839703Slinton maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); 2849703Slinton maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); 2859703Slinton maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); 2869703Slinton maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); 2879703Slinton maketype("float", builtintype(FLOAT), t_int, 4L, 0L); 2889703Slinton maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); 2899703Slinton t = builtintype(UNDEF); 2909703Slinton printf("\t.stabs\t\"void:t%d=%d", t, t); 2919703Slinton geninfo(nil); 2929703Slinton } 2939703Slinton 2949703Slinton /* 2959703Slinton * Generate info for a new range type. 2969703Slinton */ 2979703Slinton 2989703Slinton private maketype(name, tnum, eqtnum, lower, upper) 2999703Slinton char *name; 3009703Slinton int tnum, eqtnum; 3019703Slinton long lower, upper; 3029703Slinton { 3039703Slinton printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper); 3049703Slinton geninfo(nil); 3059703Slinton } 3069703Slinton 3079703Slinton /* 3089703Slinton * Generate debugging information for the given type of the given symbol. 3099703Slinton */ 3109703Slinton 3119703Slinton private gentype(sym) 3129703Slinton struct symtab *sym; 3139703Slinton { 3149703Slinton register struct symtab *p; 3159703Slinton register TWORD t; 3169703Slinton register TWORD basictype; 3179703Slinton register Typeid typeid; 3189703Slinton int i, arrindex, strindex, strtag; 3199703Slinton 3209703Slinton p = sym; 3219703Slinton t = p->stype; 3229703Slinton if (ISFTN(t)) { 3239703Slinton t = DECREF(t); 3249703Slinton } 3259703Slinton basictype = BTYPE(t); 3269703Slinton if (ISARY(t)) { 3279703Slinton arrindex = p->dimoff; 3289703Slinton } else { 3299703Slinton arrindex = NILINDEX; 3309703Slinton } 3319703Slinton if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { 3329703Slinton strindex = dimtab[p->sizoff + 1]; 3339703Slinton if (strindex == -1) { 3349703Slinton strindex = FORWARD; 3359703Slinton strtag = dimtab[p->sizoff + 3]; 3369703Slinton } else { 3379703Slinton strtag = NILINDEX; 3389703Slinton } 3399703Slinton } else { 3409703Slinton strindex = NILINDEX; 3419703Slinton strtag = NILINDEX; 3429703Slinton } 3439703Slinton i = arrindex; 3449703Slinton typeid = typelookup(t, arrindex, strindex, strtag); 3459703Slinton while (t != basictype and typeid == nil) { 3469703Slinton printf("%d=", entertype(t, i, strindex, strtag)); 3479703Slinton switch (t&TMASK) { 3489703Slinton case PTR: 3499703Slinton printf("*"); 3509703Slinton break; 3519703Slinton 3529703Slinton case FTN: 3539703Slinton printf("f"); 3549703Slinton break; 3559703Slinton 3569703Slinton case ARY: 3579703Slinton printf("ar%d;0;%d;", t_int, dimtab[i++] - 1); 3589703Slinton break; 3599703Slinton } 3609703Slinton t = DECREF(t); 3619703Slinton if (t == basictype) { 3629703Slinton typeid = typelookup(t, NILINDEX, strindex, strtag); 3639703Slinton } else { 3649703Slinton typeid = typelookup(t, i, strindex, strtag); 3659703Slinton } 3669703Slinton } 3679703Slinton if (typeid == nil) { 3689703Slinton if (strindex == FORWARD) { 3699703Slinton typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 3709703Slinton if (typeid == nil) { 3719703Slinton cerror("unbelievable forward reference"); 3729703Slinton } 3739703Slinton printf("%d", typeid->tnum); 3749703Slinton } else { 3759703Slinton genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); 3769703Slinton } 3779703Slinton } else { 3789703Slinton printf("%d", typeid->tnum); 3799703Slinton } 3809703Slinton } 3819703Slinton 3829703Slinton /* 3839703Slinton * Generate type information for structures, unions, and enumerations. 3849703Slinton */ 3859703Slinton 3869703Slinton private genstruct(t, structid, index, name, size) 3879703Slinton TWORD t; 3889703Slinton int structid; 3899703Slinton int index; 3909703Slinton char *name; 3919703Slinton int size; 3929703Slinton { 3939703Slinton register int i; 3949703Slinton register struct symtab *field; 3959703Slinton int id; 3969703Slinton 3979703Slinton if (structid == NILINDEX) { 3989703Slinton id = entertype(t, NILINDEX, index, NILINDEX); 3999703Slinton } else { 4009703Slinton id = structid; 4019703Slinton } 4029703Slinton switch (t) { 4039703Slinton case STRTY: 4049703Slinton case UNIONTY: 4059703Slinton printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); 4069703Slinton i = index; 4079703Slinton while (dimtab[i] != -1) { 4089703Slinton field = &stab[dimtab[i]]; 4099703Slinton printf("%s:", field->sname); 4109703Slinton gentype(field); 4119703Slinton if (field->sclass > FIELD) { 4129703Slinton printf(",%d,%d;", field->offset, field->sclass - FIELD); 4139703Slinton } else { 4149703Slinton printf(",%d,%d;", field->offset, 4159703Slinton tsize(field->stype, field->dimoff, field->sizoff)); 4169703Slinton } 4179703Slinton ++i; 4189703Slinton } 4199703Slinton putchar(';'); 4209703Slinton break; 4219703Slinton 4229703Slinton case ENUMTY: 4239703Slinton printf("%d=e", id); 4249703Slinton i = index; 4259703Slinton while (dimtab[i] != -1) { 4269703Slinton field = &stab[dimtab[i]]; 4279703Slinton printf("%s:%d,", field->sname, field->offset); 4289703Slinton i++; 4299703Slinton } 4309703Slinton break; 4319703Slinton 4329703Slinton default: 4339703Slinton cerror("couldn't find basic type %d for %s\n", t, name); 4349703Slinton break; 4359703Slinton } 4369703Slinton } 4379703Slinton 4389703Slinton /* 4399703Slinton * Generate offset and size info. 4409703Slinton */ 4419703Slinton 4429703Slinton private geninfo(p) 4439703Slinton register struct symtab *p; 4449703Slinton { 4459703Slinton if (p == nil) { 4469703Slinton printf("\",0x%x,0,0,0\n", N_LSYM); 4479703Slinton } else { 4489703Slinton switch (p->sclass) { 4499703Slinton case EXTERN: 4509703Slinton case EXTDEF: 4519703Slinton if (ISFTN(p->stype)) { 4529703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4539703Slinton } else { 4549703Slinton printf("\",0x%x,0,%d,_%s\n", N_GSYM, bsize(p), p->sname); 4559703Slinton } 4569703Slinton break; 4579703Slinton 4589703Slinton case STATIC: 4599703Slinton if (ISFTN(p->stype)) { 4609703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4619703Slinton } else if (p->slevel > 1) { 4629703Slinton printf("\",0x%x,0,%d,L%d\n", N_STSYM, bsize(p), p->offset); 4639703Slinton } else { 4649703Slinton printf("\",0x%x,0,%d,_%s\n", N_LCSYM, bsize(p), p->sname); 4659703Slinton } 4669703Slinton break; 4679703Slinton 4689703Slinton case REGISTER: 4699703Slinton printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); 4709703Slinton break; 4719703Slinton 4729703Slinton case PARAM: 4739703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 4749703Slinton break; 4759703Slinton 4769703Slinton default: 4779703Slinton printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); 4789703Slinton break; 4799703Slinton } 4809703Slinton } 4819703Slinton } 4829703Slinton 4839703Slinton /* 4849703Slinton * Generate information for a newly-defined structure. 4859703Slinton */ 4869703Slinton 4879703Slinton outstruct(szindex, paramindex) 4889703Slinton int szindex, paramindex; 4899703Slinton { 4909703Slinton register Typeid typeid; 4919703Slinton register struct symtab *p; 4929703Slinton register int i, t, strindex; 4939703Slinton 4949814Slinton if (oldway) { 4959814Slinton /* do nothing */; 4969814Slinton } else if (gdebug) { 4979703Slinton i = dimtab[szindex + 3]; 4989703Slinton p = &stab[i]; 4999703Slinton if (p->sname != nil) { 5009703Slinton strindex = dimtab[p->sizoff + 1]; 5019703Slinton typeid = typelookup(p->stype, NILINDEX, FORWARD, i); 5029703Slinton if (typeid == nil) { 5039703Slinton t = 0; 5049703Slinton } else { 5059703Slinton t = typeid->tnum; 5069703Slinton reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); 5079703Slinton } 5089703Slinton printf("\t.stabs\t\"%s:T", p->sname); 5099703Slinton genstruct(p->stype, t, strindex, p->sname, bsize(p)); 5109703Slinton geninfo(p); 5119703Slinton } 5129703Slinton } 5139703Slinton } 5149703Slinton 5159703Slinton pstab(name, type) 5169703Slinton char *name; 5179703Slinton int type; 5189703Slinton { 5199703Slinton register int i; 5209703Slinton register char c; 5219814Slinton 5229814Slinton if (!gdebug) { 5239814Slinton return; 5249814Slinton } else if (oldway) { 5259814Slinton old_pstab(name, type); 5269814Slinton return; 5279814Slinton } 5289703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5299703Slinton #ifdef ASSTRINGS 5309703Slinton if ( name[0] == '\0') 5319703Slinton printf("\t.stabn\t"); 5329703Slinton else 5339703Slinton #ifndef FLEXNAMES 5349703Slinton printf("\t.stabs\t\"%.8s\",", name); 5359703Slinton #else 5369703Slinton printf("\t.stabs\t\"%s\",", name); 5379703Slinton #endif 5389703Slinton #else 5399703Slinton printf(" .stab "); 5409703Slinton for(i=0; i<8; i++) 5419703Slinton if (c = name[i]) printf("'%c,", c); 5429703Slinton else printf("0,"); 5439703Slinton #endif 5449703Slinton printf("0%o,", type); 5459703Slinton } 5469703Slinton 5479703Slinton #ifdef STABDOT 5489703Slinton pstabdot(type, value) 5499703Slinton int type; 5509703Slinton int value; 5519703Slinton { 5529814Slinton if ( ! gdebug) { 5539814Slinton return; 5549814Slinton } else if (oldway) { 5559814Slinton old_pstabdot(type, value); 5569814Slinton return; 5579814Slinton } 5589703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5599703Slinton printf("\t.stabd\t"); 5609703Slinton printf("0%o,0,0%o\n",type, value); 5619703Slinton } 5629703Slinton #endif 5639703Slinton 5649703Slinton extern char NULLNAME[8]; 5659703Slinton extern int labelno; 5669703Slinton extern int fdefflag; 5679703Slinton 5689703Slinton psline() 5699703Slinton { 5709703Slinton static int lastlineno; 5719703Slinton register char *cp, *cq; 5729703Slinton register int i; 5739703Slinton 5749814Slinton if (!gdebug) { 5759814Slinton return; 5769814Slinton } else if (oldway) { 5779814Slinton old_psline(); 5789814Slinton return; 5799814Slinton } 5809703Slinton 5819703Slinton cq = ititle; 5829703Slinton cp = ftitle; 5839703Slinton 5849703Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 5859703Slinton if ( *cp == '\0' ) goto eq; 5869703Slinton 5879703Slinton neq: for (i=0; i<100; i++) 5889703Slinton ititle[i] = '\0'; 5899703Slinton cp = ftitle; 5909703Slinton cq = ititle; 5919703Slinton while ( *cp ) 5929703Slinton *cq++ = *cp++; 5939703Slinton *cq = '\0'; 5949703Slinton *--cq = '\0'; 5959703Slinton #ifndef FLEXNAMES 5969703Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 5979703Slinton pstab(cp, N_SOL); 5989703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 5999703Slinton } 6009703Slinton #else 6019703Slinton pstab(ititle+1, N_SOL); 6029703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6039703Slinton #endif 6049703Slinton *cq = '"'; 6059703Slinton printf("LL%d:\n", labelno++); 6069703Slinton 6079703Slinton eq: if (lineno == lastlineno) return; 6089703Slinton lastlineno = lineno; 6099703Slinton 6109703Slinton if (fdefflag) { 6119703Slinton #ifdef STABDOT 6129703Slinton pstabdot(N_SLINE, lineno); 6139703Slinton #else 6149703Slinton pstab(NULLNAME, N_SLINE); 6159703Slinton printf("0,%d,LL%d\n", lineno, labelno); 6169703Slinton printf("LL%d:\n", labelno++); 6179703Slinton #endif 6189703Slinton } 6199703Slinton } 6209703Slinton 6219703Slinton plcstab(level) 6229703Slinton int level; 6239703Slinton { 6249814Slinton if (!gdebug) { 6259814Slinton return; 6269814Slinton } else if (oldway) { 6279814Slinton old_plcstab(level); 6289814Slinton return; 6299814Slinton } 6309703Slinton #ifdef STABDOT 6319703Slinton pstabdot(N_LBRAC, level); 6329703Slinton #else 6339703Slinton pstab(NULLNAME, N_LBRAC); 6349703Slinton printf("0,%d,LL%d\n", level, labelno); 6359703Slinton printf("LL%d:\n", labelno++); 6369703Slinton #endif 6379703Slinton } 6389703Slinton 6399703Slinton prcstab(level) 6409703Slinton int level; 6419703Slinton { 6429814Slinton if (!gdebug) { 6439814Slinton return; 6449814Slinton } else if (oldway) { 6459814Slinton old_prcstab(level); 6469814Slinton return; 6479814Slinton } 6489703Slinton #ifdef STABDOT 6499703Slinton pstabdot(N_RBRAC, level); 6509703Slinton #else 6519703Slinton pstab(NULLNAME, N_RBRAC); 6529703Slinton printf("0,%d,LL%d\n", level, labelno); 6539703Slinton printf("LL%d:\n", labelno++); 6549703Slinton #endif 6559703Slinton } 6569703Slinton 6579703Slinton pfstab(sname) 6589703Slinton char *sname; 6599703Slinton { 6609703Slinton register struct symtab *p; 6619703Slinton 6629703Slinton if (gdebug) { 6639814Slinton if (oldway) { 6649814Slinton old_pfstab(sname); 6659814Slinton } else { 6669814Slinton p = &stab[lookup(sname, 0)]; 6679814Slinton printf("\t.stabs\t\"%s:", p->sname); 6689814Slinton putchar((p->sclass == STATIC) ? 'f' : 'F'); 6699814Slinton gentype(p); 6709814Slinton geninfo(p); 6719814Slinton } 6729703Slinton } 6739703Slinton } 6749814Slinton 6759814Slinton /* 6769814Slinton * Old way of doing things. 6779814Slinton */ 6789814Slinton 6799814Slinton private old_fixarg(p) 6809814Slinton struct symtab *p; { 6819814Slinton if (gdebug) { 6829814Slinton old_pstab(p->sname, N_PSYM); 6839814Slinton if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); 6849814Slinton old_poffs(p); 6859814Slinton } 6869814Slinton } 6879814Slinton 6889814Slinton private old_outstab(p) 6899814Slinton struct symtab *p; { 6909814Slinton register TWORD ptype; 6919814Slinton register char *pname; 6929814Slinton register char pclass; 6939814Slinton register int poffset; 6949814Slinton 6959814Slinton if (!gdebug) return; 6969814Slinton 6979814Slinton ptype = p->stype; 6989814Slinton pname = p->sname; 6999814Slinton pclass = p->sclass; 7009814Slinton poffset = p->offset; 7019814Slinton 7029814Slinton if (ISFTN(ptype)) { 7039814Slinton return; 7049814Slinton } 7059814Slinton 7069814Slinton switch (pclass) { 7079814Slinton 7089814Slinton case AUTO: 7099814Slinton old_pstab(pname, N_LSYM); 7109814Slinton printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); 7119814Slinton old_poffs(p); 7129814Slinton return; 7139814Slinton 7149814Slinton case EXTDEF: 7159814Slinton case EXTERN: 7169814Slinton old_pstab(pname, N_GSYM); 7179814Slinton printf("0,%d,0\n", ptype); 7189814Slinton old_poffs(p); 7199814Slinton return; 7209814Slinton 7219814Slinton case STATIC: 7229814Slinton #ifdef LCOMM 7239814Slinton /* stabLCSYM is 1 during nidcl so we can get stab type right */ 7249814Slinton old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); 7259814Slinton #else 7269814Slinton old_pstab(pname, N_STSYM); 7279814Slinton #endif 7289814Slinton if (p->slevel > 1) { 7299814Slinton printf("0,%d,L%d\n", ptype, poffset); 7309814Slinton } else { 7319814Slinton printf("0,%d,%s\n", ptype, exname(pname)); 7329814Slinton } 7339814Slinton old_poffs(p); 7349814Slinton return; 7359814Slinton 7369814Slinton case REGISTER: 7379814Slinton old_pstab(pname, N_RSYM); 7389814Slinton printf("0,%d,%d\n", ptype, poffset); 7399814Slinton old_poffs(p); 7409814Slinton return; 7419814Slinton 7429814Slinton case MOS: 7439814Slinton case MOU: 7449814Slinton old_pstab(pname, N_SSYM); 7459814Slinton printf("0,%d,%d\n", ptype, poffset/SZCHAR); 7469814Slinton old_poffs(p); 7479814Slinton return; 7489814Slinton 7499814Slinton case PARAM: 7509814Slinton /* parameter stab entries are processed in dclargs() */ 7519814Slinton return; 7529814Slinton 7539814Slinton default: 7549814Slinton #ifndef FLEXNAMES 7559814Slinton if (ddebug) printf(" No .stab for %.8s\n", pname); 7569814Slinton #else 7579814Slinton if (ddebug) printf(" No .stab for %s\n", pname); 7589814Slinton #endif 7599814Slinton 7609814Slinton } 7619814Slinton } 7629814Slinton 7639814Slinton private old_pstab(name, type) 7649814Slinton char *name; 7659814Slinton int type; { 7669814Slinton register int i; 7679814Slinton register char c; 7689814Slinton if (!gdebug) return; 7699814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 7709814Slinton #ifdef ASSTRINGS 7719814Slinton if ( name[0] == '\0') 7729814Slinton printf("\t.stabn\t"); 7739814Slinton else 7749814Slinton #ifndef FLEXNAMES 7759814Slinton printf("\t.stabs\t\"%.8s\", ", name); 7769814Slinton #else 7779814Slinton printf("\t.stabs\t\"%s\", ", name); 7789814Slinton #endif 7799814Slinton #else 7809814Slinton printf(" .stab "); 7819814Slinton for(i=0; i<8; i++) 7829814Slinton if (c = name[i]) printf("'%c,", c); 7839814Slinton else printf("0,"); 7849814Slinton #endif 7859814Slinton printf("0%o,", type); 7869814Slinton } 7879814Slinton 7889814Slinton #ifdef STABDOT 7899814Slinton private old_pstabdot(type, value) 7909814Slinton int type; 7919814Slinton int value; 7929814Slinton { 7939814Slinton if ( ! gdebug) return; 7949814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 7959814Slinton printf("\t.stabd\t"); 7969814Slinton printf("0%o,0,0%o\n",type, value); 7979814Slinton } 7989814Slinton #endif 7999814Slinton 8009814Slinton private old_poffs(p) 8019814Slinton register struct symtab *p; { 8029814Slinton int s; 8039814Slinton if (!gdebug) return; 8049814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { 8059814Slinton old_pstab(p->sname, N_LENG); 8069814Slinton printf("1,0,%d\n", s); 8079814Slinton } 8089814Slinton } 8099814Slinton 8109814Slinton private old_psline() { 8119814Slinton static int lastlineno; 8129814Slinton register char *cp, *cq; 8139814Slinton register int i; 8149814Slinton 8159814Slinton if (!gdebug) return; 8169814Slinton 8179814Slinton cq = ititle; 8189814Slinton cp = ftitle; 8199814Slinton 8209814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 8219814Slinton if ( *cp == '\0' ) goto eq; 8229814Slinton 8239814Slinton neq: for (i=0; i<100; i++) 8249814Slinton ititle[i] = '\0'; 8259814Slinton cp = ftitle; 8269814Slinton cq = ititle; 8279814Slinton while ( *cp ) 8289814Slinton *cq++ = *cp++; 8299814Slinton *cq = '\0'; 8309814Slinton *--cq = '\0'; 8319814Slinton #ifndef FLEXNAMES 8329814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 8339814Slinton old_pstab(cp, N_SOL); 8349814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8359814Slinton } 8369814Slinton #else 8379814Slinton old_pstab(ititle+1, N_SOL); 8389814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 8399814Slinton #endif 8409814Slinton *cq = '"'; 8419814Slinton printf("LL%d:\n", labelno++); 8429814Slinton 8439814Slinton eq: if (lineno == lastlineno) return; 8449814Slinton lastlineno = lineno; 8459814Slinton 8469814Slinton if (fdefflag) { 8479814Slinton #ifdef STABDOT 8489814Slinton old_pstabdot(N_SLINE, lineno); 8499814Slinton #else 8509814Slinton old_pstab(NULLNAME, N_SLINE); 8519814Slinton printf("0,%d,LL%d\n", lineno, labelno); 8529814Slinton printf("LL%d:\n", labelno++); 8539814Slinton #endif 8549814Slinton } 8559814Slinton } 8569814Slinton 8579814Slinton private old_plcstab(level) { 8589814Slinton if (!gdebug) return; 8599814Slinton #ifdef STABDOT 8609814Slinton old_pstabdot(N_LBRAC, level); 8619814Slinton #else 8629814Slinton old_pstab(NULLNAME, N_LBRAC); 8639814Slinton printf("0,%d,LL%d\n", level, labelno); 8649814Slinton printf("LL%d:\n", labelno++); 8659814Slinton #endif 8669814Slinton } 8679814Slinton 8689814Slinton private old_prcstab(level) { 8699814Slinton if (!gdebug) return; 8709814Slinton #ifdef STABDOT 8719814Slinton pstabdot(N_RBRAC, level); 8729814Slinton #else 8739814Slinton pstab(NULLNAME, N_RBRAC); 8749814Slinton printf("0,%d,LL%d\n", level, labelno); 8759814Slinton printf("LL%d:\n", labelno++); 8769814Slinton #endif 8779814Slinton } 8789814Slinton 8799814Slinton private old_pfstab(sname) 8809814Slinton char *sname; { 8819814Slinton if (!gdebug) return; 8829814Slinton pstab(sname, N_FUN); 8839814Slinton #ifndef FLEXNAMES 8849814Slinton printf("0,%d,_%.7s\n", lineno, sname); 8859814Slinton #else 8869814Slinton printf("0,%d,_%s\n", lineno, sname); 8879814Slinton #endif 8889814Slinton } 889