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*9814Slinton static char *sccsid ="@(#)stab.c 1.2 (Berkeley) 12/18/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 /* 39*9814Slinton * Flag for producing either sdb or dbx symbol information. 40*9814Slinton */ 41*9814Slinton 42*9814Slinton Boolean oldway = false; 43*9814Slinton 44*9814Slinton /* 459703Slinton * Generate debugging info for a parameter. 469703Slinton * The offset isn't known when it is first entered into the symbol table 479703Slinton * since the types are read later. 489703Slinton */ 499703Slinton 509703Slinton fixarg(p) 519703Slinton struct symtab *p; 529703Slinton { 53*9814Slinton if (oldway) { 54*9814Slinton old_fixarg(p); 55*9814Slinton } else if (gdebug) { 569703Slinton printf("\t.stabs\t\"%s:p", p->sname); 579703Slinton gentype(p); 589703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 599703Slinton } 609703Slinton } 619703Slinton 629703Slinton /* 639703Slinton * Generate debugging info for a given symbol. 649703Slinton */ 659703Slinton 669703Slinton outstab(sym) 679703Slinton struct symtab *sym; 689703Slinton { 699703Slinton register struct symtab *p; 709703Slinton char *classname; 719703Slinton int offset; 729703Slinton Boolean ignore; 739703Slinton static Boolean firsttime = true; 749703Slinton 75*9814Slinton if (oldway) { 76*9814Slinton old_outstab(sym); 77*9814Slinton } else if (gdebug) { 789703Slinton if (firsttime) { 799703Slinton firsttime = false; 809703Slinton inittypes(); 819703Slinton } 829703Slinton ignore = false; 839703Slinton p = sym; 849703Slinton offset = bytes(p->offset); 859703Slinton switch (p->sclass) { 869703Slinton case REGISTER: 879703Slinton classname = "r"; 889703Slinton offset = p->offset; 899703Slinton break; 909703Slinton 919703Slinton /* 929703Slinton * Locals are the default class. 939703Slinton */ 949703Slinton case AUTO: 959703Slinton classname = ""; 969703Slinton break; 979703Slinton 989703Slinton case STATIC: 999703Slinton if (ISFTN(p->stype)) { 1009703Slinton ignore = true; 1019703Slinton } else if (p->slevel <= 1) { 1029703Slinton classname = "S"; 1039703Slinton } else { 1049703Slinton classname = "V"; 1059703Slinton } 1069703Slinton break; 1079703Slinton 1089703Slinton case EXTDEF: 1099703Slinton case EXTERN: 1109703Slinton if (ISFTN(p->stype)) { 1119703Slinton ignore = true; 1129703Slinton } else { 1139703Slinton classname = "G"; 1149703Slinton } 1159703Slinton break; 1169703Slinton 1179703Slinton case TYPEDEF: 1189703Slinton classname = "t"; 1199703Slinton break; 1209703Slinton 1219703Slinton case PARAM: 1229703Slinton case MOS: 1239703Slinton case MOU: 1249703Slinton case MOE: 1259703Slinton ignore = true; 1269703Slinton break; 1279703Slinton 1289703Slinton case ENAME: 1299703Slinton case UNAME: 1309703Slinton case STNAME: 1319703Slinton entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 1329703Slinton ignore = true; 1339703Slinton break; 1349703Slinton 1359703Slinton default: 1369703Slinton if ((p->sclass&FIELD) == 0) { 1379703Slinton printf("/* no info for %s (%d) */\n", p->sname, p->sclass); 1389703Slinton } 1399703Slinton ignore = true; 1409703Slinton break; 1419703Slinton } 1429703Slinton if (not ignore) { 1439703Slinton printf("\t.stabs\t\"%s:%s", p->sname, classname); 1449703Slinton gentype(p); 1459703Slinton geninfo(p); 1469703Slinton } 1479703Slinton } 1489703Slinton } 1499703Slinton 1509703Slinton /* 1519703Slinton * Since type names are lost in the travels and because C has 1529703Slinton * structural type equivalence we keep a table of type words that 1539703Slinton * we've already seen. The first time we see a type, it is assigned 1549703Slinton * (inline) a number and future references just list that number. 1559703Slinton * Structures, unions, enums, and arrays must be handled carefully 1569703Slinton * since not all the necessary information is in the type word. 1579703Slinton */ 1589703Slinton 1599703Slinton typedef struct Typeid *Typeid; 1609703Slinton 1619703Slinton struct Typeid { 1629703Slinton TWORD tword; 1639703Slinton int tarray; 1649703Slinton int tstruct; 1659703Slinton int tstrtag; 1669703Slinton int tnum; 1679703Slinton Typeid chain; 1689703Slinton }; 1699703Slinton 1709703Slinton #define TABLESIZE 2003 1719703Slinton 1729703Slinton private int tcount = 1; 1739703Slinton private int t_int, t_char; 1749703Slinton private Typeid typetable[TABLESIZE]; 1759703Slinton 1769703Slinton /* 1779703Slinton * Look for the given type word in the type table. 1789703Slinton */ 1799703Slinton 1809703Slinton private Typeid typelookup(type, arrindex, strindex, strtag) 1819703Slinton TWORD type; 1829703Slinton int arrindex; 1839703Slinton int strindex; 1849703Slinton int strtag; 1859703Slinton { 1869703Slinton register TWORD tword; 1879703Slinton register int i1, i2; 1889703Slinton Typeid t; 1899703Slinton 1909703Slinton t = typetable[type mod TABLESIZE]; 1919703Slinton while (t != nil) { 1929703Slinton if (t->tword == type and 1939703Slinton strindex == t->tstruct and strtag == t->tstrtag) { 1949703Slinton if (arrindex == NILINDEX) { 1959703Slinton break; 1969703Slinton } else { 1979703Slinton tword = type >> TSHIFT; 1989703Slinton i1 = arrindex; 1999703Slinton i2 = t->tarray; 2009703Slinton while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { 2019703Slinton ++i1; 2029703Slinton ++i2; 2039703Slinton tword >>= TSHIFT; 2049703Slinton } 2059703Slinton if (!ISARY(tword)) { 2069703Slinton break; 2079703Slinton } 2089703Slinton } 2099703Slinton } 2109703Slinton t = t->chain; 2119703Slinton } 2129703Slinton return t; 2139703Slinton } 2149703Slinton 2159703Slinton /* 2169703Slinton * Enter a type word and associated symtab indices into the type table. 2179703Slinton */ 2189703Slinton 2199703Slinton private int entertype(type, arrindex, strindex, strtag) 2209703Slinton TWORD type; 2219703Slinton int arrindex; 2229703Slinton int strindex; 2239703Slinton int strtag; 2249703Slinton { 2259703Slinton register Typeid t; 2269703Slinton register int i; 2279703Slinton 2289703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2299703Slinton t->tword = type; 2309703Slinton t->tarray = arrindex; 2319703Slinton t->tstruct = strindex; 2329703Slinton t->tstrtag = strtag; 2339703Slinton t->tnum = tcount; 2349703Slinton ++tcount; 2359703Slinton i = type mod TABLESIZE; 2369703Slinton t->chain = typetable[i]; 2379703Slinton typetable[i] = t; 2389703Slinton return t->tnum; 2399703Slinton } 2409703Slinton 2419703Slinton /* 2429703Slinton * Change the information associated with a type table entry. 2439703Slinton * Since I'm lazy this just creates a new entry with the number 2449703Slinton * as the old one. 2459703Slinton */ 2469703Slinton 2479703Slinton private reentertype(typeid, type, arrindex, strindex, strtag) 2489703Slinton Typeid typeid; 2499703Slinton TWORD type; 2509703Slinton int arrindex; 2519703Slinton int strindex; 2529703Slinton int strtag; 2539703Slinton { 2549703Slinton register Typeid t; 2559703Slinton register int i; 2569703Slinton 2579703Slinton t = (Typeid) malloc(sizeof(struct Typeid)); 2589703Slinton t->tword = type; 2599703Slinton t->tarray = arrindex; 2609703Slinton t->tstruct = strindex; 2619703Slinton t->tstrtag = strtag; 2629703Slinton t->tnum = typeid->tnum; 2639703Slinton i = type mod TABLESIZE; 2649703Slinton t->chain = typetable[i]; 2659703Slinton typetable[i] = t; 2669703Slinton } 2679703Slinton 2689703Slinton /* 2699703Slinton * Initialize type table with predefined types. 2709703Slinton */ 2719703Slinton 2729703Slinton #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX) 2739703Slinton 2749703Slinton private inittypes() 2759703Slinton { 2769703Slinton int t; 2779703Slinton 2789703Slinton t_int = builtintype(INT); 2799703Slinton t_char = builtintype(CHAR); 2809703Slinton maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); 2819703Slinton maketype("char", t_char, t_char, 0L, 127L); 2829703Slinton maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); 2839703Slinton maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); 2849703Slinton maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); 2859703Slinton maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); 2869703Slinton maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); 2879703Slinton maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); 2889703Slinton maketype("float", builtintype(FLOAT), t_int, 4L, 0L); 2899703Slinton maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); 2909703Slinton t = builtintype(UNDEF); 2919703Slinton printf("\t.stabs\t\"void:t%d=%d", t, t); 2929703Slinton geninfo(nil); 2939703Slinton } 2949703Slinton 2959703Slinton /* 2969703Slinton * Generate info for a new range type. 2979703Slinton */ 2989703Slinton 2999703Slinton private maketype(name, tnum, eqtnum, lower, upper) 3009703Slinton char *name; 3019703Slinton int tnum, eqtnum; 3029703Slinton long lower, upper; 3039703Slinton { 3049703Slinton printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper); 3059703Slinton geninfo(nil); 3069703Slinton } 3079703Slinton 3089703Slinton /* 3099703Slinton * Generate debugging information for the given type of the given symbol. 3109703Slinton */ 3119703Slinton 3129703Slinton private gentype(sym) 3139703Slinton struct symtab *sym; 3149703Slinton { 3159703Slinton register struct symtab *p; 3169703Slinton register TWORD t; 3179703Slinton register TWORD basictype; 3189703Slinton register Typeid typeid; 3199703Slinton int i, arrindex, strindex, strtag; 3209703Slinton 3219703Slinton p = sym; 3229703Slinton t = p->stype; 3239703Slinton if (ISFTN(t)) { 3249703Slinton t = DECREF(t); 3259703Slinton } 3269703Slinton basictype = BTYPE(t); 3279703Slinton if (ISARY(t)) { 3289703Slinton arrindex = p->dimoff; 3299703Slinton } else { 3309703Slinton arrindex = NILINDEX; 3319703Slinton } 3329703Slinton if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { 3339703Slinton strindex = dimtab[p->sizoff + 1]; 3349703Slinton if (strindex == -1) { 3359703Slinton strindex = FORWARD; 3369703Slinton strtag = dimtab[p->sizoff + 3]; 3379703Slinton } else { 3389703Slinton strtag = NILINDEX; 3399703Slinton } 3409703Slinton } else { 3419703Slinton strindex = NILINDEX; 3429703Slinton strtag = NILINDEX; 3439703Slinton } 3449703Slinton i = arrindex; 3459703Slinton typeid = typelookup(t, arrindex, strindex, strtag); 3469703Slinton while (t != basictype and typeid == nil) { 3479703Slinton printf("%d=", entertype(t, i, strindex, strtag)); 3489703Slinton switch (t&TMASK) { 3499703Slinton case PTR: 3509703Slinton printf("*"); 3519703Slinton break; 3529703Slinton 3539703Slinton case FTN: 3549703Slinton printf("f"); 3559703Slinton break; 3569703Slinton 3579703Slinton case ARY: 3589703Slinton printf("ar%d;0;%d;", t_int, dimtab[i++] - 1); 3599703Slinton break; 3609703Slinton } 3619703Slinton t = DECREF(t); 3629703Slinton if (t == basictype) { 3639703Slinton typeid = typelookup(t, NILINDEX, strindex, strtag); 3649703Slinton } else { 3659703Slinton typeid = typelookup(t, i, strindex, strtag); 3669703Slinton } 3679703Slinton } 3689703Slinton if (typeid == nil) { 3699703Slinton if (strindex == FORWARD) { 3709703Slinton typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); 3719703Slinton if (typeid == nil) { 3729703Slinton cerror("unbelievable forward reference"); 3739703Slinton } 3749703Slinton printf("%d", typeid->tnum); 3759703Slinton } else { 3769703Slinton genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); 3779703Slinton } 3789703Slinton } else { 3799703Slinton printf("%d", typeid->tnum); 3809703Slinton } 3819703Slinton } 3829703Slinton 3839703Slinton /* 3849703Slinton * Generate type information for structures, unions, and enumerations. 3859703Slinton */ 3869703Slinton 3879703Slinton private genstruct(t, structid, index, name, size) 3889703Slinton TWORD t; 3899703Slinton int structid; 3909703Slinton int index; 3919703Slinton char *name; 3929703Slinton int size; 3939703Slinton { 3949703Slinton register int i; 3959703Slinton register struct symtab *field; 3969703Slinton int id; 3979703Slinton 3989703Slinton if (structid == NILINDEX) { 3999703Slinton id = entertype(t, NILINDEX, index, NILINDEX); 4009703Slinton } else { 4019703Slinton id = structid; 4029703Slinton } 4039703Slinton switch (t) { 4049703Slinton case STRTY: 4059703Slinton case UNIONTY: 4069703Slinton printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); 4079703Slinton i = index; 4089703Slinton while (dimtab[i] != -1) { 4099703Slinton field = &stab[dimtab[i]]; 4109703Slinton printf("%s:", field->sname); 4119703Slinton gentype(field); 4129703Slinton if (field->sclass > FIELD) { 4139703Slinton printf(",%d,%d;", field->offset, field->sclass - FIELD); 4149703Slinton } else { 4159703Slinton printf(",%d,%d;", field->offset, 4169703Slinton tsize(field->stype, field->dimoff, field->sizoff)); 4179703Slinton } 4189703Slinton ++i; 4199703Slinton } 4209703Slinton putchar(';'); 4219703Slinton break; 4229703Slinton 4239703Slinton case ENUMTY: 4249703Slinton printf("%d=e", id); 4259703Slinton i = index; 4269703Slinton while (dimtab[i] != -1) { 4279703Slinton field = &stab[dimtab[i]]; 4289703Slinton printf("%s:%d,", field->sname, field->offset); 4299703Slinton i++; 4309703Slinton } 4319703Slinton break; 4329703Slinton 4339703Slinton default: 4349703Slinton cerror("couldn't find basic type %d for %s\n", t, name); 4359703Slinton break; 4369703Slinton } 4379703Slinton } 4389703Slinton 4399703Slinton /* 4409703Slinton * Generate offset and size info. 4419703Slinton */ 4429703Slinton 4439703Slinton private geninfo(p) 4449703Slinton register struct symtab *p; 4459703Slinton { 4469703Slinton if (p == nil) { 4479703Slinton printf("\",0x%x,0,0,0\n", N_LSYM); 4489703Slinton } else { 4499703Slinton switch (p->sclass) { 4509703Slinton case EXTERN: 4519703Slinton case EXTDEF: 4529703Slinton if (ISFTN(p->stype)) { 4539703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4549703Slinton } else { 4559703Slinton printf("\",0x%x,0,%d,_%s\n", N_GSYM, bsize(p), p->sname); 4569703Slinton } 4579703Slinton break; 4589703Slinton 4599703Slinton case STATIC: 4609703Slinton if (ISFTN(p->stype)) { 4619703Slinton printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); 4629703Slinton } else if (p->slevel > 1) { 4639703Slinton printf("\",0x%x,0,%d,L%d\n", N_STSYM, bsize(p), p->offset); 4649703Slinton } else { 4659703Slinton printf("\",0x%x,0,%d,_%s\n", N_LCSYM, bsize(p), p->sname); 4669703Slinton } 4679703Slinton break; 4689703Slinton 4699703Slinton case REGISTER: 4709703Slinton printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); 4719703Slinton break; 4729703Slinton 4739703Slinton case PARAM: 4749703Slinton printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); 4759703Slinton break; 4769703Slinton 4779703Slinton default: 4789703Slinton printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); 4799703Slinton break; 4809703Slinton } 4819703Slinton } 4829703Slinton } 4839703Slinton 4849703Slinton /* 4859703Slinton * Generate information for a newly-defined structure. 4869703Slinton */ 4879703Slinton 4889703Slinton outstruct(szindex, paramindex) 4899703Slinton int szindex, paramindex; 4909703Slinton { 4919703Slinton register Typeid typeid; 4929703Slinton register struct symtab *p; 4939703Slinton register int i, t, strindex; 4949703Slinton 495*9814Slinton if (oldway) { 496*9814Slinton /* do nothing */; 497*9814Slinton } else if (gdebug) { 4989703Slinton i = dimtab[szindex + 3]; 4999703Slinton p = &stab[i]; 5009703Slinton if (p->sname != nil) { 5019703Slinton strindex = dimtab[p->sizoff + 1]; 5029703Slinton typeid = typelookup(p->stype, NILINDEX, FORWARD, i); 5039703Slinton if (typeid == nil) { 5049703Slinton t = 0; 5059703Slinton } else { 5069703Slinton t = typeid->tnum; 5079703Slinton reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); 5089703Slinton } 5099703Slinton printf("\t.stabs\t\"%s:T", p->sname); 5109703Slinton genstruct(p->stype, t, strindex, p->sname, bsize(p)); 5119703Slinton geninfo(p); 5129703Slinton } 5139703Slinton } 5149703Slinton } 5159703Slinton 5169703Slinton pstab(name, type) 5179703Slinton char *name; 5189703Slinton int type; 5199703Slinton { 5209703Slinton register int i; 5219703Slinton register char c; 522*9814Slinton 523*9814Slinton if (!gdebug) { 524*9814Slinton return; 525*9814Slinton } else if (oldway) { 526*9814Slinton old_pstab(name, type); 527*9814Slinton return; 528*9814Slinton } 5299703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5309703Slinton #ifdef ASSTRINGS 5319703Slinton if ( name[0] == '\0') 5329703Slinton printf("\t.stabn\t"); 5339703Slinton else 5349703Slinton #ifndef FLEXNAMES 5359703Slinton printf("\t.stabs\t\"%.8s\",", name); 5369703Slinton #else 5379703Slinton printf("\t.stabs\t\"%s\",", name); 5389703Slinton #endif 5399703Slinton #else 5409703Slinton printf(" .stab "); 5419703Slinton for(i=0; i<8; i++) 5429703Slinton if (c = name[i]) printf("'%c,", c); 5439703Slinton else printf("0,"); 5449703Slinton #endif 5459703Slinton printf("0%o,", type); 5469703Slinton } 5479703Slinton 5489703Slinton #ifdef STABDOT 5499703Slinton pstabdot(type, value) 5509703Slinton int type; 5519703Slinton int value; 5529703Slinton { 553*9814Slinton if ( ! gdebug) { 554*9814Slinton return; 555*9814Slinton } else if (oldway) { 556*9814Slinton old_pstabdot(type, value); 557*9814Slinton return; 558*9814Slinton } 5599703Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 5609703Slinton printf("\t.stabd\t"); 5619703Slinton printf("0%o,0,0%o\n",type, value); 5629703Slinton } 5639703Slinton #endif 5649703Slinton 5659703Slinton extern char NULLNAME[8]; 5669703Slinton extern int labelno; 5679703Slinton extern int fdefflag; 5689703Slinton 5699703Slinton psline() 5709703Slinton { 5719703Slinton static int lastlineno; 5729703Slinton register char *cp, *cq; 5739703Slinton register int i; 5749703Slinton 575*9814Slinton if (!gdebug) { 576*9814Slinton return; 577*9814Slinton } else if (oldway) { 578*9814Slinton old_psline(); 579*9814Slinton return; 580*9814Slinton } 5819703Slinton 5829703Slinton cq = ititle; 5839703Slinton cp = ftitle; 5849703Slinton 5859703Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 5869703Slinton if ( *cp == '\0' ) goto eq; 5879703Slinton 5889703Slinton neq: for (i=0; i<100; i++) 5899703Slinton ititle[i] = '\0'; 5909703Slinton cp = ftitle; 5919703Slinton cq = ititle; 5929703Slinton while ( *cp ) 5939703Slinton *cq++ = *cp++; 5949703Slinton *cq = '\0'; 5959703Slinton *--cq = '\0'; 5969703Slinton #ifndef FLEXNAMES 5979703Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 5989703Slinton pstab(cp, N_SOL); 5999703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6009703Slinton } 6019703Slinton #else 6029703Slinton pstab(ititle+1, N_SOL); 6039703Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 6049703Slinton #endif 6059703Slinton *cq = '"'; 6069703Slinton printf("LL%d:\n", labelno++); 6079703Slinton 6089703Slinton eq: if (lineno == lastlineno) return; 6099703Slinton lastlineno = lineno; 6109703Slinton 6119703Slinton if (fdefflag) { 6129703Slinton #ifdef STABDOT 6139703Slinton pstabdot(N_SLINE, lineno); 6149703Slinton #else 6159703Slinton pstab(NULLNAME, N_SLINE); 6169703Slinton printf("0,%d,LL%d\n", lineno, labelno); 6179703Slinton printf("LL%d:\n", labelno++); 6189703Slinton #endif 6199703Slinton } 6209703Slinton } 6219703Slinton 6229703Slinton plcstab(level) 6239703Slinton int level; 6249703Slinton { 625*9814Slinton if (!gdebug) { 626*9814Slinton return; 627*9814Slinton } else if (oldway) { 628*9814Slinton old_plcstab(level); 629*9814Slinton return; 630*9814Slinton } 6319703Slinton #ifdef STABDOT 6329703Slinton pstabdot(N_LBRAC, level); 6339703Slinton #else 6349703Slinton pstab(NULLNAME, N_LBRAC); 6359703Slinton printf("0,%d,LL%d\n", level, labelno); 6369703Slinton printf("LL%d:\n", labelno++); 6379703Slinton #endif 6389703Slinton } 6399703Slinton 6409703Slinton prcstab(level) 6419703Slinton int level; 6429703Slinton { 643*9814Slinton if (!gdebug) { 644*9814Slinton return; 645*9814Slinton } else if (oldway) { 646*9814Slinton old_prcstab(level); 647*9814Slinton return; 648*9814Slinton } 6499703Slinton #ifdef STABDOT 6509703Slinton pstabdot(N_RBRAC, level); 6519703Slinton #else 6529703Slinton pstab(NULLNAME, N_RBRAC); 6539703Slinton printf("0,%d,LL%d\n", level, labelno); 6549703Slinton printf("LL%d:\n", labelno++); 6559703Slinton #endif 6569703Slinton } 6579703Slinton 6589703Slinton pfstab(sname) 6599703Slinton char *sname; 6609703Slinton { 6619703Slinton register struct symtab *p; 6629703Slinton 6639703Slinton if (gdebug) { 664*9814Slinton if (oldway) { 665*9814Slinton old_pfstab(sname); 666*9814Slinton } else { 667*9814Slinton p = &stab[lookup(sname, 0)]; 668*9814Slinton printf("\t.stabs\t\"%s:", p->sname); 669*9814Slinton putchar((p->sclass == STATIC) ? 'f' : 'F'); 670*9814Slinton gentype(p); 671*9814Slinton geninfo(p); 672*9814Slinton } 6739703Slinton } 6749703Slinton } 675*9814Slinton 676*9814Slinton /* 677*9814Slinton * Old way of doing things. 678*9814Slinton */ 679*9814Slinton 680*9814Slinton private old_fixarg(p) 681*9814Slinton struct symtab *p; { 682*9814Slinton if (gdebug) { 683*9814Slinton old_pstab(p->sname, N_PSYM); 684*9814Slinton if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); 685*9814Slinton old_poffs(p); 686*9814Slinton } 687*9814Slinton } 688*9814Slinton 689*9814Slinton private old_outstab(p) 690*9814Slinton struct symtab *p; { 691*9814Slinton register TWORD ptype; 692*9814Slinton register char *pname; 693*9814Slinton register char pclass; 694*9814Slinton register int poffset; 695*9814Slinton 696*9814Slinton if (!gdebug) return; 697*9814Slinton 698*9814Slinton ptype = p->stype; 699*9814Slinton pname = p->sname; 700*9814Slinton pclass = p->sclass; 701*9814Slinton poffset = p->offset; 702*9814Slinton 703*9814Slinton if (ISFTN(ptype)) { 704*9814Slinton return; 705*9814Slinton } 706*9814Slinton 707*9814Slinton switch (pclass) { 708*9814Slinton 709*9814Slinton case AUTO: 710*9814Slinton old_pstab(pname, N_LSYM); 711*9814Slinton printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); 712*9814Slinton old_poffs(p); 713*9814Slinton return; 714*9814Slinton 715*9814Slinton case EXTDEF: 716*9814Slinton case EXTERN: 717*9814Slinton old_pstab(pname, N_GSYM); 718*9814Slinton printf("0,%d,0\n", ptype); 719*9814Slinton old_poffs(p); 720*9814Slinton return; 721*9814Slinton 722*9814Slinton case STATIC: 723*9814Slinton #ifdef LCOMM 724*9814Slinton /* stabLCSYM is 1 during nidcl so we can get stab type right */ 725*9814Slinton old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); 726*9814Slinton #else 727*9814Slinton old_pstab(pname, N_STSYM); 728*9814Slinton #endif 729*9814Slinton if (p->slevel > 1) { 730*9814Slinton printf("0,%d,L%d\n", ptype, poffset); 731*9814Slinton } else { 732*9814Slinton printf("0,%d,%s\n", ptype, exname(pname)); 733*9814Slinton } 734*9814Slinton old_poffs(p); 735*9814Slinton return; 736*9814Slinton 737*9814Slinton case REGISTER: 738*9814Slinton old_pstab(pname, N_RSYM); 739*9814Slinton printf("0,%d,%d\n", ptype, poffset); 740*9814Slinton old_poffs(p); 741*9814Slinton return; 742*9814Slinton 743*9814Slinton case MOS: 744*9814Slinton case MOU: 745*9814Slinton old_pstab(pname, N_SSYM); 746*9814Slinton printf("0,%d,%d\n", ptype, poffset/SZCHAR); 747*9814Slinton old_poffs(p); 748*9814Slinton return; 749*9814Slinton 750*9814Slinton case PARAM: 751*9814Slinton /* parameter stab entries are processed in dclargs() */ 752*9814Slinton return; 753*9814Slinton 754*9814Slinton default: 755*9814Slinton #ifndef FLEXNAMES 756*9814Slinton if (ddebug) printf(" No .stab for %.8s\n", pname); 757*9814Slinton #else 758*9814Slinton if (ddebug) printf(" No .stab for %s\n", pname); 759*9814Slinton #endif 760*9814Slinton 761*9814Slinton } 762*9814Slinton } 763*9814Slinton 764*9814Slinton private old_pstab(name, type) 765*9814Slinton char *name; 766*9814Slinton int type; { 767*9814Slinton register int i; 768*9814Slinton register char c; 769*9814Slinton if (!gdebug) return; 770*9814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 771*9814Slinton #ifdef ASSTRINGS 772*9814Slinton if ( name[0] == '\0') 773*9814Slinton printf("\t.stabn\t"); 774*9814Slinton else 775*9814Slinton #ifndef FLEXNAMES 776*9814Slinton printf("\t.stabs\t\"%.8s\", ", name); 777*9814Slinton #else 778*9814Slinton printf("\t.stabs\t\"%s\", ", name); 779*9814Slinton #endif 780*9814Slinton #else 781*9814Slinton printf(" .stab "); 782*9814Slinton for(i=0; i<8; i++) 783*9814Slinton if (c = name[i]) printf("'%c,", c); 784*9814Slinton else printf("0,"); 785*9814Slinton #endif 786*9814Slinton printf("0%o,", type); 787*9814Slinton } 788*9814Slinton 789*9814Slinton #ifdef STABDOT 790*9814Slinton private old_pstabdot(type, value) 791*9814Slinton int type; 792*9814Slinton int value; 793*9814Slinton { 794*9814Slinton if ( ! gdebug) return; 795*9814Slinton /* locctr(PROG); /* .stabs must appear in .text for c2 */ 796*9814Slinton printf("\t.stabd\t"); 797*9814Slinton printf("0%o,0,0%o\n",type, value); 798*9814Slinton } 799*9814Slinton #endif 800*9814Slinton 801*9814Slinton private old_poffs(p) 802*9814Slinton register struct symtab *p; { 803*9814Slinton int s; 804*9814Slinton if (!gdebug) return; 805*9814Slinton if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { 806*9814Slinton old_pstab(p->sname, N_LENG); 807*9814Slinton printf("1,0,%d\n", s); 808*9814Slinton } 809*9814Slinton } 810*9814Slinton 811*9814Slinton private old_psline() { 812*9814Slinton static int lastlineno; 813*9814Slinton register char *cp, *cq; 814*9814Slinton register int i; 815*9814Slinton 816*9814Slinton if (!gdebug) return; 817*9814Slinton 818*9814Slinton cq = ititle; 819*9814Slinton cp = ftitle; 820*9814Slinton 821*9814Slinton while ( *cq ) if ( *cp++ != *cq++ ) goto neq; 822*9814Slinton if ( *cp == '\0' ) goto eq; 823*9814Slinton 824*9814Slinton neq: for (i=0; i<100; i++) 825*9814Slinton ititle[i] = '\0'; 826*9814Slinton cp = ftitle; 827*9814Slinton cq = ititle; 828*9814Slinton while ( *cp ) 829*9814Slinton *cq++ = *cp++; 830*9814Slinton *cq = '\0'; 831*9814Slinton *--cq = '\0'; 832*9814Slinton #ifndef FLEXNAMES 833*9814Slinton for ( cp = ititle+1; *(cp-1); cp += 8 ) { 834*9814Slinton old_pstab(cp, N_SOL); 835*9814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 836*9814Slinton } 837*9814Slinton #else 838*9814Slinton old_pstab(ititle+1, N_SOL); 839*9814Slinton if (gdebug) printf("0,0,LL%d\n", labelno); 840*9814Slinton #endif 841*9814Slinton *cq = '"'; 842*9814Slinton printf("LL%d:\n", labelno++); 843*9814Slinton 844*9814Slinton eq: if (lineno == lastlineno) return; 845*9814Slinton lastlineno = lineno; 846*9814Slinton 847*9814Slinton if (fdefflag) { 848*9814Slinton #ifdef STABDOT 849*9814Slinton old_pstabdot(N_SLINE, lineno); 850*9814Slinton #else 851*9814Slinton old_pstab(NULLNAME, N_SLINE); 852*9814Slinton printf("0,%d,LL%d\n", lineno, labelno); 853*9814Slinton printf("LL%d:\n", labelno++); 854*9814Slinton #endif 855*9814Slinton } 856*9814Slinton } 857*9814Slinton 858*9814Slinton private old_plcstab(level) { 859*9814Slinton if (!gdebug) return; 860*9814Slinton #ifdef STABDOT 861*9814Slinton old_pstabdot(N_LBRAC, level); 862*9814Slinton #else 863*9814Slinton old_pstab(NULLNAME, N_LBRAC); 864*9814Slinton printf("0,%d,LL%d\n", level, labelno); 865*9814Slinton printf("LL%d:\n", labelno++); 866*9814Slinton #endif 867*9814Slinton } 868*9814Slinton 869*9814Slinton private old_prcstab(level) { 870*9814Slinton if (!gdebug) return; 871*9814Slinton #ifdef STABDOT 872*9814Slinton pstabdot(N_RBRAC, level); 873*9814Slinton #else 874*9814Slinton pstab(NULLNAME, N_RBRAC); 875*9814Slinton printf("0,%d,LL%d\n", level, labelno); 876*9814Slinton printf("LL%d:\n", labelno++); 877*9814Slinton #endif 878*9814Slinton } 879*9814Slinton 880*9814Slinton private old_pfstab(sname) 881*9814Slinton char *sname; { 882*9814Slinton if (!gdebug) return; 883*9814Slinton pstab(sname, N_FUN); 884*9814Slinton #ifndef FLEXNAMES 885*9814Slinton printf("0,%d,_%.7s\n", lineno, sname); 886*9814Slinton #else 887*9814Slinton printf("0,%d,_%s\n", lineno, sname); 888*9814Slinton #endif 889*9814Slinton } 890