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