|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid ="@(#)stab.c 1.12 (Berkeley) 3/27/86"; ! 3: #endif ! 4: /* ! 5: * Symbolic debugging info interface. ! 6: * ! 7: * Here we generate pseudo-ops that cause the assembler to put ! 8: * symbolic debugging information into the object file. ! 9: */ ! 10: ! 11: #include "pass1.h" ! 12: ! 13: #include <sys/types.h> ! 14: #include <a.out.h> ! 15: #include <stab.h> ! 16: ! 17: #define private static ! 18: #define and && ! 19: #define or || ! 20: #define not ! ! 21: #define div / ! 22: #define mod % ! 23: #define nil 0 ! 24: ! 25: #define bytes(bits) ((bits) / SZCHAR) ! 26: #define bsize(p) bytes(dimtab[p->sizoff]) /* size in bytes of a symbol */ ! 27: ! 28: #define NILINDEX -1 ! 29: #define FORWARD -2 ! 30: ! 31: typedef int Boolean; ! 32: ! 33: #define false 0 ! 34: #define true 1 ! 35: ! 36: extern int ddebug; ! 37: extern int gdebug; ! 38: extern char *malloc(); ! 39: ! 40: int stabLCSYM; ! 41: ! 42: /* ! 43: * Flag for producing either sdb or dbx symbol information. ! 44: */ ! 45: int oldway = false; ! 46: ! 47: /* ! 48: * Generate debugging info for a parameter. ! 49: * The offset isn't known when it is first entered into the symbol table ! 50: * since the types are read later. ! 51: */ ! 52: ! 53: fixarg(p) ! 54: struct symtab *p; ! 55: { ! 56: if (oldway) { ! 57: old_fixarg(p); ! 58: } else if (gdebug) { ! 59: printf("\t.stabs\t\"%s:p", p->sname); ! 60: gentype(p); ! 61: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); ! 62: } ! 63: } ! 64: ! 65: /* ! 66: * Determine if the given symbol is a global array with dimension 0, ! 67: * which only makes sense if it's dimension is to be given later. ! 68: * We therefore currently do not generate symbol information for ! 69: * such entries. ! 70: */ ! 71: ! 72: #define isglobal(class) ( \ ! 73: class == EXTDEF or class == EXTERN or class == STATIC \ ! 74: ) ! 75: ! 76: private Boolean zero_length_array(p) ! 77: register struct symtab *p; ! 78: { ! 79: Boolean b; ! 80: int t; ! 81: ! 82: if (not isglobal(p->sclass)) { ! 83: b = false; ! 84: } else { ! 85: t = p->stype; ! 86: if (ISFTN(t)) { ! 87: t = DECREF(t); ! 88: } ! 89: b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0); ! 90: } ! 91: return b; ! 92: } ! 93: ! 94: /* ! 95: * Generate debugging info for a given symbol. ! 96: */ ! 97: ! 98: outstab(sym) ! 99: struct symtab *sym; ! 100: { ! 101: register struct symtab *p; ! 102: char *classname; ! 103: int offset; ! 104: Boolean ignore; ! 105: static Boolean firsttime = true; ! 106: ! 107: if (oldway) { ! 108: old_outstab(sym); ! 109: } else if (gdebug and not zero_length_array(sym)) { ! 110: if (firsttime) { ! 111: firsttime = false; ! 112: inittypes(); ! 113: } ! 114: ignore = false; ! 115: p = sym; ! 116: offset = bytes(p->offset); ! 117: switch (p->sclass) { ! 118: case REGISTER: ! 119: classname = "r"; ! 120: offset = p->offset; ! 121: break; ! 122: ! 123: /* ! 124: * Locals are the default class. ! 125: */ ! 126: case AUTO: ! 127: classname = ""; ! 128: break; ! 129: ! 130: case STATIC: ! 131: if (ISFTN(p->stype)) { ! 132: ignore = true; ! 133: } else if (p->slevel <= 1) { ! 134: classname = "S"; ! 135: } else { ! 136: classname = "V"; ! 137: } ! 138: break; ! 139: ! 140: case EXTDEF: ! 141: case EXTERN: ! 142: if (ISFTN(p->stype)) { ! 143: ignore = true; ! 144: } else { ! 145: classname = "G"; ! 146: } ! 147: break; ! 148: ! 149: case TYPEDEF: ! 150: classname = "t"; ! 151: break; ! 152: ! 153: case PARAM: ! 154: case MOS: ! 155: case MOU: ! 156: case MOE: ! 157: ignore = true; ! 158: break; ! 159: ! 160: case ENAME: ! 161: case UNAME: ! 162: case STNAME: ! 163: entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 164: ignore = true; ! 165: break; ! 166: ! 167: default: ! 168: if ((p->sclass&FIELD) == 0) { ! 169: printf("/* no info for %s (%d) */\n", p->sname, p->sclass); ! 170: } ! 171: ignore = true; ! 172: break; ! 173: } ! 174: if (not ignore) { ! 175: printf("\t.stabs\t\"%s:%s", p->sname, classname); ! 176: gentype(p); ! 177: geninfo(p); ! 178: } ! 179: } ! 180: } ! 181: ! 182: /* ! 183: * Since type names are lost in the travels and because C has ! 184: * structural type equivalence we keep a table of type words that ! 185: * we've already seen. The first time we see a type, it is assigned ! 186: * (inline) a number and future references just list that number. ! 187: * Structures, unions, enums, and arrays must be handled carefully ! 188: * since not all the necessary information is in the type word. ! 189: */ ! 190: ! 191: typedef struct Typeid *Typeid; ! 192: ! 193: struct Typeid { ! 194: TWORD tword; ! 195: int tarray; ! 196: int tstruct; ! 197: int tstrtag; ! 198: int tnum; ! 199: Typeid chain; ! 200: }; ! 201: ! 202: #define TABLESIZE 2003 ! 203: ! 204: private int tcount = 1; ! 205: private int t_int, t_char; ! 206: private Typeid typetable[TABLESIZE]; ! 207: ! 208: /* ! 209: * Look for the given type word in the type table. ! 210: */ ! 211: ! 212: private Typeid typelookup(type, arrindex, strindex, strtag) ! 213: TWORD type; ! 214: int arrindex; ! 215: int strindex; ! 216: int strtag; ! 217: { ! 218: register TWORD tword; ! 219: register int i1, i2; ! 220: Typeid t; ! 221: ! 222: t = typetable[type mod TABLESIZE]; ! 223: while (t != nil) { ! 224: if (t->tword == type and ! 225: strindex == t->tstruct and strtag == t->tstrtag) { ! 226: if (arrindex == NILINDEX) { ! 227: break; ! 228: } else { ! 229: tword = type; ! 230: i1 = arrindex; ! 231: i2 = t->tarray; ! 232: while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { ! 233: ++i1; ! 234: ++i2; ! 235: tword >>= TSHIFT; ! 236: } ! 237: if (!ISARY(tword)) { ! 238: break; ! 239: } ! 240: } ! 241: } ! 242: t = t->chain; ! 243: } ! 244: return t; ! 245: } ! 246: ! 247: /* ! 248: * Enter a type word and associated symtab indices into the type table. ! 249: */ ! 250: ! 251: private int entertype(type, arrindex, strindex, strtag) ! 252: TWORD type; ! 253: int arrindex; ! 254: int strindex; ! 255: int strtag; ! 256: { ! 257: register Typeid t; ! 258: register int i; ! 259: ! 260: t = (Typeid) malloc(sizeof(struct Typeid)); ! 261: t->tword = type; ! 262: t->tarray = arrindex; ! 263: t->tstruct = strindex; ! 264: t->tstrtag = strtag; ! 265: t->tnum = tcount; ! 266: ++tcount; ! 267: i = type mod TABLESIZE; ! 268: t->chain = typetable[i]; ! 269: typetable[i] = t; ! 270: return t->tnum; ! 271: } ! 272: ! 273: /* ! 274: * Change the information associated with a type table entry. ! 275: * Since I'm lazy this just creates a new entry with the number ! 276: * as the old one. ! 277: */ ! 278: ! 279: private reentertype(typeid, type, arrindex, strindex, strtag) ! 280: Typeid typeid; ! 281: TWORD type; ! 282: int arrindex; ! 283: int strindex; ! 284: int strtag; ! 285: { ! 286: register Typeid t; ! 287: register int i; ! 288: ! 289: t = (Typeid) malloc(sizeof(struct Typeid)); ! 290: t->tword = type; ! 291: t->tarray = arrindex; ! 292: t->tstruct = strindex; ! 293: t->tstrtag = strtag; ! 294: t->tnum = typeid->tnum; ! 295: i = type mod TABLESIZE; ! 296: t->chain = typetable[i]; ! 297: typetable[i] = t; ! 298: } ! 299: ! 300: /* ! 301: * Initialize type table with predefined types. ! 302: */ ! 303: ! 304: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX) ! 305: ! 306: private inittypes() ! 307: { ! 308: int t; ! 309: ! 310: t_int = builtintype(INT); ! 311: t_char = builtintype(CHAR); ! 312: maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); ! 313: maketype("char", t_char, t_char, 0L, 127L); ! 314: maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); ! 315: maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); ! 316: maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); ! 317: maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); ! 318: maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); ! 319: maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); ! 320: maketype("float", builtintype(FLOAT), t_int, 4L, 0L); ! 321: maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); ! 322: t = builtintype(UNDEF); ! 323: printf("\t.stabs\t\"void:t%d=%d", t, t); ! 324: geninfo(nil); ! 325: t = builtintype(FARG); ! 326: printf("\t.stabs\t\"???:t%d=%d", t, t_int); ! 327: geninfo(nil); ! 328: } ! 329: ! 330: /* ! 331: * Generate info for a new range type. ! 332: */ ! 333: ! 334: private maketype(name, tnum, eqtnum, lower, upper) ! 335: char *name; ! 336: int tnum, eqtnum; ! 337: long lower, upper; ! 338: { ! 339: printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper); ! 340: geninfo(nil); ! 341: } ! 342: ! 343: /* ! 344: * Generate debugging information for the given type of the given symbol. ! 345: */ ! 346: ! 347: private gentype(sym) ! 348: struct symtab *sym; ! 349: { ! 350: register struct symtab *p; ! 351: register TWORD t; ! 352: register TWORD basictype; ! 353: register Typeid typeid; ! 354: int i, arrindex, strindex, strtag; ! 355: ! 356: p = sym; ! 357: t = p->stype; ! 358: if (ISFTN(t)) { ! 359: t = DECREF(t); ! 360: } ! 361: basictype = BTYPE(t); ! 362: if (ISARY(t)) { ! 363: arrindex = p->dimoff; ! 364: } else { ! 365: arrindex = NILINDEX; ! 366: } ! 367: if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { ! 368: strindex = dimtab[p->sizoff + 1]; ! 369: if (strindex == -1) { ! 370: strindex = FORWARD; ! 371: strtag = dimtab[p->sizoff + 3]; ! 372: } else { ! 373: strtag = NILINDEX; ! 374: } ! 375: } else { ! 376: strindex = NILINDEX; ! 377: strtag = NILINDEX; ! 378: } ! 379: i = arrindex; ! 380: typeid = typelookup(t, arrindex, strindex, strtag); ! 381: while (t != basictype and typeid == nil) { ! 382: printf("%d=", entertype(t, i, strindex, strtag)); ! 383: switch (t&TMASK) { ! 384: case PTR: ! 385: printf("*"); ! 386: break; ! 387: ! 388: case FTN: ! 389: printf("f"); ! 390: break; ! 391: ! 392: case ARY: ! 393: printf("ar%d;0;%d;", t_int, dimtab[i++] - 1); ! 394: break; ! 395: } ! 396: t = DECREF(t); ! 397: if (i == NILINDEX && ISARY(t)) { ! 398: i = p->dimoff; ! 399: } ! 400: if (t == basictype) { ! 401: typeid = typelookup(t, NILINDEX, strindex, strtag); ! 402: } else { ! 403: typeid = typelookup(t, i, strindex, strtag); ! 404: } ! 405: } ! 406: if (typeid == nil) { ! 407: if (strindex == FORWARD) { ! 408: typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 409: if (typeid == nil) { ! 410: cerror("unbelievable forward reference"); ! 411: } ! 412: printf("%d", typeid->tnum); ! 413: } else { ! 414: genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); ! 415: } ! 416: } else { ! 417: printf("%d", typeid->tnum); ! 418: } ! 419: } ! 420: ! 421: /* ! 422: * Generate type information for structures, unions, and enumerations. ! 423: */ ! 424: ! 425: private genstruct(t, structid, index, name, size) ! 426: TWORD t; ! 427: int structid; ! 428: int index; ! 429: char *name; ! 430: int size; ! 431: { ! 432: register int i; ! 433: register struct symtab *field; ! 434: int id; ! 435: ! 436: if (structid == NILINDEX) { ! 437: id = entertype(t, NILINDEX, index, NILINDEX); ! 438: } else { ! 439: id = structid; ! 440: } ! 441: switch (t) { ! 442: case STRTY: ! 443: case UNIONTY: ! 444: printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); ! 445: i = index; ! 446: while (dimtab[i] != -1) { ! 447: field = &stab[dimtab[i]]; ! 448: printf("%s:", field->sname); ! 449: gentype(field); ! 450: if (field->sclass > FIELD) { ! 451: printf(",%d,%d;", field->offset, field->sclass - FIELD); ! 452: } else { ! 453: printf(",%d,%d;", field->offset, ! 454: tsize(field->stype, field->dimoff, field->sizoff)); ! 455: } ! 456: ++i; ! 457: } ! 458: putchar(';'); ! 459: break; ! 460: ! 461: case ENUMTY: ! 462: printf("%d=e", id); ! 463: i = index; ! 464: while (dimtab[i] != -1) { ! 465: field = &stab[dimtab[i]]; ! 466: printf("%s:%d,", field->sname, field->offset); ! 467: i++; ! 468: } ! 469: putchar(';'); ! 470: break; ! 471: ! 472: default: ! 473: cerror("couldn't find basic type %d for %s\n", t, name); ! 474: break; ! 475: } ! 476: } ! 477: ! 478: /* ! 479: * Generate offset and size info. ! 480: */ ! 481: ! 482: private geninfo(p) ! 483: register struct symtab *p; ! 484: { ! 485: int stabtype; ! 486: ! 487: if (p == nil) { ! 488: printf("\",0x%x,0,0,0\n", N_LSYM); ! 489: } else { ! 490: switch (p->sclass) { ! 491: case EXTERN: ! 492: case EXTDEF: ! 493: if (ISFTN(p->stype)) { ! 494: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); ! 495: } else { ! 496: printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p)); ! 497: } ! 498: break; ! 499: ! 500: case STATIC: ! 501: stabtype = stabLCSYM ? N_LCSYM : N_STSYM; ! 502: if (ISFTN(p->stype)) { ! 503: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); ! 504: } else if (p->slevel > 1) { ! 505: printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset); ! 506: } else { ! 507: printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname); ! 508: } ! 509: break; ! 510: ! 511: case REGISTER: ! 512: printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); ! 513: break; ! 514: ! 515: case PARAM: ! 516: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); ! 517: break; ! 518: ! 519: default: ! 520: printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); ! 521: break; ! 522: } ! 523: } ! 524: } ! 525: ! 526: /* ! 527: * Generate information for a newly-defined structure. ! 528: */ ! 529: ! 530: outstruct(szindex, paramindex) ! 531: int szindex, paramindex; ! 532: { ! 533: register Typeid typeid; ! 534: register struct symtab *p; ! 535: register int i, t, strindex; ! 536: ! 537: if (oldway) { ! 538: /* do nothing */; ! 539: } else if (gdebug) { ! 540: i = dimtab[szindex + 3]; ! 541: p = &stab[i]; ! 542: if (p->sname != nil) { ! 543: strindex = dimtab[p->sizoff + 1]; ! 544: typeid = typelookup(p->stype, NILINDEX, FORWARD, i); ! 545: if (typeid == nil) { ! 546: t = 0; ! 547: } else { ! 548: t = typeid->tnum; ! 549: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); ! 550: } ! 551: printf("\t.stabs\t\"%s:T", p->sname); ! 552: genstruct(p->stype, t, strindex, p->sname, bsize(p)); ! 553: geninfo(p); ! 554: } ! 555: } ! 556: } ! 557: ! 558: pstab(name, type) ! 559: char *name; ! 560: int type; ! 561: { ! 562: register int i; ! 563: register char c; ! 564: ! 565: if (!gdebug) { ! 566: return; ! 567: } else if (oldway) { ! 568: old_pstab(name, type); ! 569: return; ! 570: } ! 571: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 572: #ifdef ASSTRINGS ! 573: if ( name[0] == '\0') ! 574: printf("\t.stabn\t"); ! 575: else ! 576: #ifndef FLEXNAMES ! 577: printf("\t.stabs\t\"%.8s\",", name); ! 578: #else ! 579: printf("\t.stabs\t\"%s\",", name); ! 580: #endif ! 581: #else ! 582: printf(" .stab "); ! 583: for(i=0; i<8; i++) ! 584: if (c = name[i]) printf("'%c,", c); ! 585: else printf("0,"); ! 586: #endif ! 587: printf("0%o,", type); ! 588: } ! 589: ! 590: #ifdef STABDOT ! 591: pstabdot(type, value) ! 592: int type; ! 593: int value; ! 594: { ! 595: if ( ! gdebug) { ! 596: return; ! 597: } else if (oldway) { ! 598: old_pstabdot(type, value); ! 599: return; ! 600: } ! 601: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 602: printf("\t.stabd\t"); ! 603: printf("0%o,0,0%o\n",type, value); ! 604: } ! 605: #endif ! 606: ! 607: extern char NULLNAME[8]; ! 608: extern int labelno; ! 609: extern int fdefflag; ! 610: ! 611: psline() ! 612: { ! 613: static int lastlineno; ! 614: register char *cp, *cq; ! 615: register int i; ! 616: ! 617: if (!gdebug) { ! 618: return; ! 619: } else if (oldway) { ! 620: old_psline(); ! 621: return; ! 622: } ! 623: ! 624: cq = ititle; ! 625: cp = ftitle; ! 626: ! 627: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 628: if ( *cp == '\0' ) goto eq; ! 629: ! 630: neq: for (i=0; i<100; i++) ! 631: ititle[i] = '\0'; ! 632: cp = ftitle; ! 633: cq = ititle; ! 634: while ( *cp ) ! 635: *cq++ = *cp++; ! 636: *cq = '\0'; ! 637: *--cq = '\0'; ! 638: #ifndef FLEXNAMES ! 639: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 640: pstab(cp, N_SOL); ! 641: if (gdebug) printf("0,0,LL%d\n", labelno); ! 642: } ! 643: #else ! 644: pstab(ititle+1, N_SOL); ! 645: if (gdebug) printf("0,0,LL%d\n", labelno); ! 646: #endif ! 647: *cq = '"'; ! 648: printf("LL%d:\n", labelno++); ! 649: ! 650: eq: if (lineno == lastlineno) return; ! 651: lastlineno = lineno; ! 652: ! 653: if (fdefflag) { ! 654: #ifdef STABDOT ! 655: pstabdot(N_SLINE, lineno); ! 656: #else ! 657: pstab(NULLNAME, N_SLINE); ! 658: printf("0,%d,LL%d\n", lineno, labelno); ! 659: printf("LL%d:\n", labelno++); ! 660: #endif ! 661: } ! 662: } ! 663: ! 664: plcstab(level) ! 665: int level; ! 666: { ! 667: if (!gdebug) { ! 668: return; ! 669: } else if (oldway) { ! 670: old_plcstab(level); ! 671: return; ! 672: } ! 673: #ifdef STABDOT ! 674: pstabdot(N_LBRAC, level); ! 675: #else ! 676: pstab(NULLNAME, N_LBRAC); ! 677: printf("0,%d,LL%d\n", level, labelno); ! 678: printf("LL%d:\n", labelno++); ! 679: #endif ! 680: } ! 681: ! 682: prcstab(level) ! 683: int level; ! 684: { ! 685: if (!gdebug) { ! 686: return; ! 687: } else if (oldway) { ! 688: old_prcstab(level); ! 689: return; ! 690: } ! 691: #ifdef STABDOT ! 692: pstabdot(N_RBRAC, level); ! 693: #else ! 694: pstab(NULLNAME, N_RBRAC); ! 695: printf("0,%d,LL%d\n", level, labelno); ! 696: printf("LL%d:\n", labelno++); ! 697: #endif ! 698: } ! 699: ! 700: pfstab(sname) ! 701: char *sname; ! 702: { ! 703: register struct symtab *p; ! 704: ! 705: if (gdebug) { ! 706: if (oldway) { ! 707: old_pfstab(sname); ! 708: } else { ! 709: p = &stab[lookup(sname, 0)]; ! 710: printf("\t.stabs\t\"%s:", p->sname); ! 711: putchar((p->sclass == STATIC) ? 'f' : 'F'); ! 712: gentype(p); ! 713: geninfo(p); ! 714: } ! 715: } ! 716: } ! 717: ! 718: /* ! 719: * Old way of doing things. ! 720: */ ! 721: ! 722: private old_fixarg(p) ! 723: struct symtab *p; { ! 724: if (gdebug) { ! 725: old_pstab(p->sname, N_PSYM); ! 726: if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); ! 727: old_poffs(p); ! 728: } ! 729: } ! 730: ! 731: private old_outstab(p) ! 732: struct symtab *p; { ! 733: register TWORD ptype; ! 734: register char *pname; ! 735: register char pclass; ! 736: register int poffset; ! 737: ! 738: if (!gdebug) return; ! 739: ! 740: ptype = p->stype; ! 741: pname = p->sname; ! 742: pclass = p->sclass; ! 743: poffset = p->offset; ! 744: ! 745: if (ISFTN(ptype)) { ! 746: return; ! 747: } ! 748: ! 749: switch (pclass) { ! 750: ! 751: case AUTO: ! 752: old_pstab(pname, N_LSYM); ! 753: printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); ! 754: old_poffs(p); ! 755: return; ! 756: ! 757: case EXTDEF: ! 758: case EXTERN: ! 759: old_pstab(pname, N_GSYM); ! 760: printf("0,%d,0\n", ptype); ! 761: old_poffs(p); ! 762: return; ! 763: ! 764: case STATIC: ! 765: #ifdef LCOMM ! 766: /* stabLCSYM is 1 during nidcl so we can get stab type right */ ! 767: old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); ! 768: #else ! 769: old_pstab(pname, N_STSYM); ! 770: #endif ! 771: if (p->slevel > 1) { ! 772: printf("0,%d,L%d\n", ptype, poffset); ! 773: } else { ! 774: printf("0,%d,%s\n", ptype, exname(pname)); ! 775: } ! 776: old_poffs(p); ! 777: return; ! 778: ! 779: case REGISTER: ! 780: old_pstab(pname, N_RSYM); ! 781: printf("0,%d,%d\n", ptype, poffset); ! 782: old_poffs(p); ! 783: return; ! 784: ! 785: case MOS: ! 786: case MOU: ! 787: old_pstab(pname, N_SSYM); ! 788: printf("0,%d,%d\n", ptype, poffset/SZCHAR); ! 789: old_poffs(p); ! 790: return; ! 791: ! 792: case PARAM: ! 793: /* parameter stab entries are processed in dclargs() */ ! 794: return; ! 795: ! 796: default: ! 797: #ifndef FLEXNAMES ! 798: if (ddebug) printf(" No .stab for %.8s\n", pname); ! 799: #else ! 800: if (ddebug) printf(" No .stab for %s\n", pname); ! 801: #endif ! 802: ! 803: } ! 804: } ! 805: ! 806: private old_pstab(name, type) ! 807: char *name; ! 808: int type; { ! 809: register int i; ! 810: register char c; ! 811: if (!gdebug) return; ! 812: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 813: #ifdef ASSTRINGS ! 814: if ( name[0] == '\0') ! 815: printf("\t.stabn\t"); ! 816: else ! 817: #ifndef FLEXNAMES ! 818: printf("\t.stabs\t\"%.8s\", ", name); ! 819: #else ! 820: printf("\t.stabs\t\"%s\", ", name); ! 821: #endif ! 822: #else ! 823: printf(" .stab "); ! 824: for(i=0; i<8; i++) ! 825: if (c = name[i]) printf("'%c,", c); ! 826: else printf("0,"); ! 827: #endif ! 828: printf("0%o,", type); ! 829: } ! 830: ! 831: #ifdef STABDOT ! 832: private old_pstabdot(type, value) ! 833: int type; ! 834: int value; ! 835: { ! 836: if ( ! gdebug) return; ! 837: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 838: printf("\t.stabd\t"); ! 839: printf("0%o,0,0%o\n",type, value); ! 840: } ! 841: #endif ! 842: ! 843: private old_poffs(p) ! 844: register struct symtab *p; { ! 845: int s; ! 846: if (!gdebug) return; ! 847: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { ! 848: old_pstab(p->sname, N_LENG); ! 849: printf("1,0,%d\n", s); ! 850: } ! 851: } ! 852: ! 853: private old_psline() { ! 854: static int lastlineno; ! 855: register char *cp, *cq; ! 856: register int i; ! 857: ! 858: if (!gdebug) return; ! 859: ! 860: cq = ititle; ! 861: cp = ftitle; ! 862: ! 863: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 864: if ( *cp == '\0' ) goto eq; ! 865: ! 866: neq: for (i=0; i<100; i++) ! 867: ititle[i] = '\0'; ! 868: cp = ftitle; ! 869: cq = ititle; ! 870: while ( *cp ) ! 871: *cq++ = *cp++; ! 872: *cq = '\0'; ! 873: *--cq = '\0'; ! 874: #ifndef FLEXNAMES ! 875: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 876: old_pstab(cp, N_SOL); ! 877: if (gdebug) printf("0,0,LL%d\n", labelno); ! 878: } ! 879: #else ! 880: old_pstab(ititle+1, N_SOL); ! 881: if (gdebug) printf("0,0,LL%d\n", labelno); ! 882: #endif ! 883: *cq = '"'; ! 884: printf("LL%d:\n", labelno++); ! 885: ! 886: eq: if (lineno == lastlineno) return; ! 887: lastlineno = lineno; ! 888: ! 889: if (fdefflag) { ! 890: #ifdef STABDOT ! 891: old_pstabdot(N_SLINE, lineno); ! 892: #else ! 893: old_pstab(NULLNAME, N_SLINE); ! 894: printf("0,%d,LL%d\n", lineno, labelno); ! 895: printf("LL%d:\n", labelno++); ! 896: #endif ! 897: } ! 898: } ! 899: ! 900: private old_plcstab(level) { ! 901: if (!gdebug) return; ! 902: #ifdef STABDOT ! 903: old_pstabdot(N_LBRAC, level); ! 904: #else ! 905: old_pstab(NULLNAME, N_LBRAC); ! 906: printf("0,%d,LL%d\n", level, labelno); ! 907: printf("LL%d:\n", labelno++); ! 908: #endif ! 909: } ! 910: ! 911: private old_prcstab(level) { ! 912: if (!gdebug) return; ! 913: #ifdef STABDOT ! 914: pstabdot(N_RBRAC, level); ! 915: #else ! 916: pstab(NULLNAME, N_RBRAC); ! 917: printf("0,%d,LL%d\n", level, labelno); ! 918: printf("LL%d:\n", labelno++); ! 919: #endif ! 920: } ! 921: ! 922: private old_pfstab(sname) ! 923: char *sname; { ! 924: if (!gdebug) return; ! 925: pstab(sname, N_FUN); ! 926: #ifndef FLEXNAMES ! 927: printf("0,%d,_%.7s\n", lineno, sname); ! 928: #else ! 929: printf("0,%d,_%s\n", lineno, sname); ! 930: #endif ! 931: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.