|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid ="@(#)stab.c 1.4 (Berkeley) 7/31/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: if (i != NILINDEX && (p = &stab[i])->sname != nil) { ! 542: strindex = dimtab[p->sizoff + 1]; ! 543: typeid = typelookup(p->stype, NILINDEX, FORWARD, i); ! 544: if (typeid == nil) { ! 545: t = 0; ! 546: } else { ! 547: t = typeid->tnum; ! 548: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); ! 549: } ! 550: printf("\t.stabs\t\"%s:T", p->sname); ! 551: genstruct(p->stype, t, strindex, p->sname, bsize(p)); ! 552: geninfo(p); ! 553: } ! 554: } ! 555: } ! 556: ! 557: pstab(name, type) ! 558: char *name; ! 559: int type; ! 560: { ! 561: register int i; ! 562: register char c; ! 563: ! 564: if (!gdebug) { ! 565: return; ! 566: } else if (oldway) { ! 567: old_pstab(name, type); ! 568: return; ! 569: } ! 570: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 571: #ifdef ASSTRINGS ! 572: if ( name[0] == '\0') ! 573: printf("\t.stabn\t"); ! 574: else ! 575: #ifndef FLEXNAMES ! 576: printf("\t.stabs\t\"%.8s\",", name); ! 577: #else ! 578: printf("\t.stabs\t\"%s\",", name); ! 579: #endif ! 580: #else ! 581: printf(" .stab "); ! 582: for(i=0; i<8; i++) ! 583: if (c = name[i]) printf("'%c,", c); ! 584: else printf("0,"); ! 585: #endif ! 586: printf("0%o,", type); ! 587: } ! 588: ! 589: #ifdef STABDOT ! 590: pstabdot(type, value) ! 591: int type; ! 592: int value; ! 593: { ! 594: if ( ! gdebug) { ! 595: return; ! 596: } else if (oldway) { ! 597: old_pstabdot(type, value); ! 598: return; ! 599: } ! 600: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 601: printf("\t.stabd\t"); ! 602: printf("0%o,0,0%o\n",type, value); ! 603: } ! 604: #endif ! 605: ! 606: extern char NULLNAME[8]; ! 607: extern int labelno; ! 608: extern int fdefflag; ! 609: ! 610: psline() ! 611: { ! 612: static int lastlineno; ! 613: register char *cp, *cq; ! 614: register int i; ! 615: ! 616: if (!gdebug) { ! 617: return; ! 618: } else if (oldway) { ! 619: old_psline(); ! 620: return; ! 621: } ! 622: ! 623: cq = ititle; ! 624: cp = ftitle; ! 625: ! 626: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 627: if ( *cp == '\0' ) goto eq; ! 628: ! 629: neq: for (i=0; i<100; i++) ! 630: ititle[i] = '\0'; ! 631: cp = ftitle; ! 632: cq = ititle; ! 633: while ( *cp ) ! 634: *cq++ = *cp++; ! 635: *cq = '\0'; ! 636: *--cq = '\0'; ! 637: #ifndef FLEXNAMES ! 638: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 639: pstab(cp, N_SOL); ! 640: if (gdebug) printf("0,0,LL%d\n", labelno); ! 641: } ! 642: #else ! 643: pstab(ititle+1, N_SOL); ! 644: if (gdebug) printf("0,0,LL%d\n", labelno); ! 645: #endif ! 646: *cq = '"'; ! 647: printf("LL%d:\n", labelno++); ! 648: ! 649: eq: if (lineno == lastlineno) return; ! 650: lastlineno = lineno; ! 651: ! 652: if (fdefflag) { ! 653: #ifdef STABDOT ! 654: pstabdot(N_SLINE, lineno); ! 655: #else ! 656: pstab(NULLNAME, N_SLINE); ! 657: printf("0,%d,LL%d\n", lineno, labelno); ! 658: printf("LL%d:\n", labelno++); ! 659: #endif ! 660: } ! 661: } ! 662: ! 663: plcstab(level) ! 664: int level; ! 665: { ! 666: if (!gdebug) { ! 667: return; ! 668: } else if (oldway) { ! 669: old_plcstab(level); ! 670: return; ! 671: } ! 672: #ifdef STABDOT ! 673: pstabdot(N_LBRAC, level); ! 674: #else ! 675: pstab(NULLNAME, N_LBRAC); ! 676: printf("0,%d,LL%d\n", level, labelno); ! 677: printf("LL%d:\n", labelno++); ! 678: #endif ! 679: } ! 680: ! 681: prcstab(level) ! 682: int level; ! 683: { ! 684: if (!gdebug) { ! 685: return; ! 686: } else if (oldway) { ! 687: old_prcstab(level); ! 688: return; ! 689: } ! 690: #ifdef STABDOT ! 691: pstabdot(N_RBRAC, level); ! 692: #else ! 693: pstab(NULLNAME, N_RBRAC); ! 694: printf("0,%d,LL%d\n", level, labelno); ! 695: printf("LL%d:\n", labelno++); ! 696: #endif ! 697: } ! 698: ! 699: pfstab(sname) ! 700: char *sname; ! 701: { ! 702: register struct symtab *p; ! 703: ! 704: if (gdebug) { ! 705: if (oldway) { ! 706: old_pfstab(sname); ! 707: } else { ! 708: p = &stab[lookup(sname, 0)]; ! 709: printf("\t.stabs\t\"%s:", p->sname); ! 710: putchar((p->sclass == STATIC) ? 'f' : 'F'); ! 711: gentype(p); ! 712: geninfo(p); ! 713: } ! 714: } ! 715: } ! 716: ! 717: /* ! 718: * Old way of doing things. ! 719: */ ! 720: ! 721: private old_fixarg(p) ! 722: struct symtab *p; { ! 723: if (gdebug) { ! 724: old_pstab(p->sname, N_PSYM); ! 725: if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); ! 726: old_poffs(p); ! 727: } ! 728: } ! 729: ! 730: private old_outstab(p) ! 731: struct symtab *p; { ! 732: register TWORD ptype; ! 733: register char *pname; ! 734: register char pclass; ! 735: register int poffset; ! 736: ! 737: if (!gdebug) return; ! 738: ! 739: ptype = p->stype; ! 740: pname = p->sname; ! 741: pclass = p->sclass; ! 742: poffset = p->offset; ! 743: ! 744: if (ISFTN(ptype)) { ! 745: return; ! 746: } ! 747: ! 748: switch (pclass) { ! 749: ! 750: case AUTO: ! 751: old_pstab(pname, N_LSYM); ! 752: printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); ! 753: old_poffs(p); ! 754: return; ! 755: ! 756: case EXTDEF: ! 757: case EXTERN: ! 758: old_pstab(pname, N_GSYM); ! 759: printf("0,%d,0\n", ptype); ! 760: old_poffs(p); ! 761: return; ! 762: ! 763: case STATIC: ! 764: #ifdef LCOMM ! 765: /* stabLCSYM is 1 during nidcl so we can get stab type right */ ! 766: old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); ! 767: #else ! 768: old_pstab(pname, N_STSYM); ! 769: #endif ! 770: if (p->slevel > 1) { ! 771: printf("0,%d,L%d\n", ptype, poffset); ! 772: } else { ! 773: printf("0,%d,%s\n", ptype, exname(pname)); ! 774: } ! 775: old_poffs(p); ! 776: return; ! 777: ! 778: case REGISTER: ! 779: old_pstab(pname, N_RSYM); ! 780: printf("0,%d,%d\n", ptype, poffset); ! 781: old_poffs(p); ! 782: return; ! 783: ! 784: case MOS: ! 785: case MOU: ! 786: old_pstab(pname, N_SSYM); ! 787: printf("0,%d,%d\n", ptype, poffset/SZCHAR); ! 788: old_poffs(p); ! 789: return; ! 790: ! 791: case PARAM: ! 792: /* parameter stab entries are processed in dclargs() */ ! 793: return; ! 794: ! 795: default: ! 796: #ifndef FLEXNAMES ! 797: if (ddebug) printf(" No .stab for %.8s\n", pname); ! 798: #else ! 799: if (ddebug) printf(" No .stab for %s\n", pname); ! 800: #endif ! 801: ! 802: } ! 803: } ! 804: ! 805: private old_pstab(name, type) ! 806: char *name; ! 807: int type; { ! 808: register int i; ! 809: register char c; ! 810: if (!gdebug) return; ! 811: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 812: #ifdef ASSTRINGS ! 813: if ( name[0] == '\0') ! 814: printf("\t.stabn\t"); ! 815: else ! 816: #ifndef FLEXNAMES ! 817: printf("\t.stabs\t\"%.8s\", ", name); ! 818: #else ! 819: printf("\t.stabs\t\"%s\", ", name); ! 820: #endif ! 821: #else ! 822: printf(" .stab "); ! 823: for(i=0; i<8; i++) ! 824: if (c = name[i]) printf("'%c,", c); ! 825: else printf("0,"); ! 826: #endif ! 827: printf("0%o,", type); ! 828: } ! 829: ! 830: #ifdef STABDOT ! 831: private old_pstabdot(type, value) ! 832: int type; ! 833: int value; ! 834: { ! 835: if ( ! gdebug) return; ! 836: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 837: printf("\t.stabd\t"); ! 838: printf("0%o,0,0%o\n",type, value); ! 839: } ! 840: #endif ! 841: ! 842: private old_poffs(p) ! 843: register struct symtab *p; { ! 844: int s; ! 845: if (!gdebug) return; ! 846: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { ! 847: old_pstab(p->sname, N_LENG); ! 848: printf("1,0,%d\n", s); ! 849: } ! 850: } ! 851: ! 852: private old_psline() { ! 853: static int lastlineno; ! 854: register char *cp, *cq; ! 855: register int i; ! 856: ! 857: if (!gdebug) return; ! 858: ! 859: cq = ititle; ! 860: cp = ftitle; ! 861: ! 862: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 863: if ( *cp == '\0' ) goto eq; ! 864: ! 865: neq: for (i=0; i<100; i++) ! 866: ititle[i] = '\0'; ! 867: cp = ftitle; ! 868: cq = ititle; ! 869: while ( *cp ) ! 870: *cq++ = *cp++; ! 871: *cq = '\0'; ! 872: *--cq = '\0'; ! 873: #ifndef FLEXNAMES ! 874: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 875: old_pstab(cp, N_SOL); ! 876: if (gdebug) printf("0,0,LL%d\n", labelno); ! 877: } ! 878: #else ! 879: old_pstab(ititle+1, N_SOL); ! 880: if (gdebug) printf("0,0,LL%d\n", labelno); ! 881: #endif ! 882: *cq = '"'; ! 883: printf("LL%d:\n", labelno++); ! 884: ! 885: eq: if (lineno == lastlineno) return; ! 886: lastlineno = lineno; ! 887: ! 888: if (fdefflag) { ! 889: #ifdef STABDOT ! 890: old_pstabdot(N_SLINE, lineno); ! 891: #else ! 892: old_pstab(NULLNAME, N_SLINE); ! 893: printf("0,%d,LL%d\n", lineno, labelno); ! 894: printf("LL%d:\n", labelno++); ! 895: #endif ! 896: } ! 897: } ! 898: ! 899: private old_plcstab(level) { ! 900: if (!gdebug) return; ! 901: #ifdef STABDOT ! 902: old_pstabdot(N_LBRAC, level); ! 903: #else ! 904: old_pstab(NULLNAME, N_LBRAC); ! 905: printf("0,%d,LL%d\n", level, labelno); ! 906: printf("LL%d:\n", labelno++); ! 907: #endif ! 908: } ! 909: ! 910: private old_prcstab(level) { ! 911: if (!gdebug) return; ! 912: #ifdef STABDOT ! 913: pstabdot(N_RBRAC, level); ! 914: #else ! 915: pstab(NULLNAME, N_RBRAC); ! 916: printf("0,%d,LL%d\n", level, labelno); ! 917: printf("LL%d:\n", labelno++); ! 918: #endif ! 919: } ! 920: ! 921: private old_pfstab(sname) ! 922: char *sname; { ! 923: if (!gdebug) return; ! 924: pstab(sname, N_FUN); ! 925: #ifndef FLEXNAMES ! 926: printf("0,%d,_%.7s\n", lineno, sname); ! 927: #else ! 928: printf("0,%d,_%s\n", lineno, sname); ! 929: #endif ! 930: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.