|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid ="@(#)stab.c 1.13 (Berkeley) 12/11/87"; ! 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: Boolean ignore; ! 104: static Boolean firsttime = true; ! 105: ! 106: if (oldway) { ! 107: old_outstab(sym); ! 108: } else if (gdebug and not zero_length_array(sym)) { ! 109: if (firsttime) { ! 110: firsttime = false; ! 111: inittypes(); ! 112: } ! 113: ignore = false; ! 114: p = sym; ! 115: switch (p->sclass) { ! 116: case REGISTER: ! 117: classname = "r"; ! 118: break; ! 119: ! 120: /* ! 121: * Locals are the default class. ! 122: */ ! 123: case AUTO: ! 124: classname = ""; ! 125: break; ! 126: ! 127: case STATIC: ! 128: if (ISFTN(p->stype)) { ! 129: ignore = true; ! 130: } else if (p->slevel <= 1) { ! 131: classname = "S"; ! 132: } else { ! 133: classname = "V"; ! 134: } ! 135: break; ! 136: ! 137: case EXTDEF: ! 138: case EXTERN: ! 139: if (ISFTN(p->stype)) { ! 140: ignore = true; ! 141: } else { ! 142: classname = "G"; ! 143: } ! 144: break; ! 145: ! 146: case TYPEDEF: ! 147: classname = "t"; ! 148: break; ! 149: ! 150: case PARAM: ! 151: case MOS: ! 152: case MOU: ! 153: case MOE: ! 154: ignore = true; ! 155: break; ! 156: ! 157: case ENAME: ! 158: case UNAME: ! 159: case STNAME: ! 160: (void) entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 161: ignore = true; ! 162: break; ! 163: ! 164: default: ! 165: if ((p->sclass&FIELD) == 0) { ! 166: printf("/* no info for %s (%d) */\n", p->sname, p->sclass); ! 167: } ! 168: ignore = true; ! 169: break; ! 170: } ! 171: if (not ignore) { ! 172: printf("\t.stabs\t\"%s:%s", p->sname, classname); ! 173: gentype(p); ! 174: geninfo(p); ! 175: } ! 176: } ! 177: } ! 178: ! 179: /* ! 180: * Since type names are lost in the travels and because C has ! 181: * structural type equivalence we keep a table of type words that ! 182: * we've already seen. The first time we see a type, it is assigned ! 183: * (inline) a number and future references just list that number. ! 184: * Structures, unions, enums, and arrays must be handled carefully ! 185: * since not all the necessary information is in the type word. ! 186: */ ! 187: ! 188: typedef struct Typeid *Typeid; ! 189: ! 190: struct Typeid { ! 191: TWORD tword; ! 192: int tarray; ! 193: int tstruct; ! 194: int tstrtag; ! 195: int tnum; ! 196: Typeid chain; ! 197: }; ! 198: ! 199: #define TABLESIZE 2003 ! 200: ! 201: private int tcount = 1; ! 202: private int t_int, t_char; ! 203: private Typeid typetable[TABLESIZE]; ! 204: ! 205: /* ! 206: * Look for the given type word in the type table. ! 207: */ ! 208: ! 209: private Typeid typelookup(type, arrindex, strindex, strtag) ! 210: TWORD type; ! 211: int arrindex; ! 212: int strindex; ! 213: int strtag; ! 214: { ! 215: register TWORD tword; ! 216: register int i1, i2; ! 217: Typeid t; ! 218: ! 219: t = typetable[type mod TABLESIZE]; ! 220: while (t != nil) { ! 221: if (t->tword == type and ! 222: strindex == t->tstruct and strtag == t->tstrtag) { ! 223: if (arrindex == NILINDEX) { ! 224: break; ! 225: } else { ! 226: tword = type; ! 227: i1 = arrindex; ! 228: i2 = t->tarray; ! 229: while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { ! 230: ++i1; ! 231: ++i2; ! 232: tword >>= TSHIFT; ! 233: } ! 234: if (!ISARY(tword)) { ! 235: break; ! 236: } ! 237: } ! 238: } ! 239: t = t->chain; ! 240: } ! 241: return t; ! 242: } ! 243: ! 244: /* ! 245: * Enter a type word and associated symtab indices into the type table. ! 246: */ ! 247: ! 248: private int entertype(type, arrindex, strindex, strtag) ! 249: TWORD type; ! 250: int arrindex; ! 251: int strindex; ! 252: int strtag; ! 253: { ! 254: register Typeid t; ! 255: register int i; ! 256: ! 257: t = (Typeid) malloc(sizeof(struct Typeid)); ! 258: t->tword = type; ! 259: t->tarray = arrindex; ! 260: t->tstruct = strindex; ! 261: t->tstrtag = strtag; ! 262: t->tnum = tcount; ! 263: ++tcount; ! 264: i = type mod TABLESIZE; ! 265: t->chain = typetable[i]; ! 266: typetable[i] = t; ! 267: return t->tnum; ! 268: } ! 269: ! 270: /* ! 271: * Change the information associated with a type table entry. ! 272: * Since I'm lazy this just creates a new entry with the number ! 273: * as the old one. ! 274: */ ! 275: ! 276: private reentertype(typeid, type, arrindex, strindex, strtag) ! 277: Typeid typeid; ! 278: TWORD type; ! 279: int arrindex; ! 280: int strindex; ! 281: int strtag; ! 282: { ! 283: register Typeid t; ! 284: register int i; ! 285: ! 286: t = (Typeid) malloc(sizeof(struct Typeid)); ! 287: t->tword = type; ! 288: t->tarray = arrindex; ! 289: t->tstruct = strindex; ! 290: t->tstrtag = strtag; ! 291: t->tnum = typeid->tnum; ! 292: i = type mod TABLESIZE; ! 293: t->chain = typetable[i]; ! 294: typetable[i] = t; ! 295: } ! 296: ! 297: /* ! 298: * Initialize type table with predefined types. ! 299: */ ! 300: ! 301: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX) ! 302: ! 303: private inittypes() ! 304: { ! 305: int t; ! 306: ! 307: t_int = builtintype(INT); ! 308: t_char = builtintype(CHAR); ! 309: maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); ! 310: maketype("char", t_char, t_char, 0L, 127L); ! 311: maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); ! 312: maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); ! 313: maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); ! 314: maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); ! 315: maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); ! 316: maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); ! 317: maketype("float", builtintype(FLOAT), t_int, 4L, 0L); ! 318: maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); ! 319: t = builtintype(UNDEF); ! 320: printf("\t.stabs\t\"void:t%d=%d", t, t); ! 321: geninfo((struct symtab *)nil); ! 322: t = builtintype(FARG); ! 323: printf("\t.stabs\t\"???:t%d=%d", t, t_int); ! 324: geninfo((struct symtab *)nil); ! 325: } ! 326: ! 327: /* ! 328: * Generate info for a new range type. ! 329: */ ! 330: ! 331: private maketype(name, tnum, eqtnum, lower, upper) ! 332: char *name; ! 333: int tnum, eqtnum; ! 334: long lower, upper; ! 335: { ! 336: printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper); ! 337: geninfo((struct symtab *)nil); ! 338: } ! 339: ! 340: /* ! 341: * Generate debugging information for the given type of the given symbol. ! 342: */ ! 343: ! 344: private gentype(sym) ! 345: struct symtab *sym; ! 346: { ! 347: register struct symtab *p; ! 348: register TWORD t; ! 349: register TWORD basictype; ! 350: register Typeid typeid; ! 351: int i, arrindex, strindex, strtag; ! 352: ! 353: p = sym; ! 354: t = p->stype; ! 355: if (ISFTN(t)) { ! 356: t = DECREF(t); ! 357: } ! 358: basictype = BTYPE(t); ! 359: if (ISARY(t)) { ! 360: arrindex = p->dimoff; ! 361: } else { ! 362: arrindex = NILINDEX; ! 363: } ! 364: if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { ! 365: strindex = dimtab[p->sizoff + 1]; ! 366: if (strindex == -1) { ! 367: strindex = FORWARD; ! 368: strtag = dimtab[p->sizoff + 3]; ! 369: } else { ! 370: strtag = NILINDEX; ! 371: } ! 372: } else { ! 373: strindex = NILINDEX; ! 374: strtag = NILINDEX; ! 375: } ! 376: i = arrindex; ! 377: typeid = typelookup(t, arrindex, strindex, strtag); ! 378: while (t != basictype and typeid == nil) { ! 379: printf("%d=", entertype(t, i, strindex, strtag)); ! 380: switch (t&TMASK) { ! 381: case PTR: ! 382: printf("*"); ! 383: break; ! 384: ! 385: case FTN: ! 386: printf("f"); ! 387: break; ! 388: ! 389: case ARY: ! 390: printf("ar%d;0;%d;", t_int, dimtab[i++] - 1); ! 391: break; ! 392: } ! 393: t = DECREF(t); ! 394: if (i == NILINDEX && ISARY(t)) { ! 395: i = p->dimoff; ! 396: } ! 397: if (t == basictype) { ! 398: typeid = typelookup(t, NILINDEX, strindex, strtag); ! 399: } else { ! 400: typeid = typelookup(t, i, strindex, strtag); ! 401: } ! 402: } ! 403: if (typeid == nil) { ! 404: if (strindex == FORWARD) { ! 405: typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 406: if (typeid == nil) { ! 407: cerror("unbelievable forward reference"); ! 408: } ! 409: printf("%d", typeid->tnum); ! 410: } else { ! 411: genstruct(t, NILINDEX, strindex, p->sname, bsize(p)); ! 412: } ! 413: } else { ! 414: printf("%d", typeid->tnum); ! 415: } ! 416: } ! 417: ! 418: /* ! 419: * Generate type information for structures, unions, and enumerations. ! 420: */ ! 421: ! 422: private genstruct(t, structid, index, name, size) ! 423: TWORD t; ! 424: int structid; ! 425: int index; ! 426: char *name; ! 427: int size; ! 428: { ! 429: register int i; ! 430: register struct symtab *field; ! 431: int id; ! 432: ! 433: if (structid == NILINDEX) { ! 434: id = entertype(t, NILINDEX, index, NILINDEX); ! 435: } else { ! 436: id = structid; ! 437: } ! 438: switch (t) { ! 439: case STRTY: ! 440: case UNIONTY: ! 441: printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size); ! 442: i = index; ! 443: while (dimtab[i] != -1) { ! 444: field = &stab[dimtab[i]]; ! 445: printf("%s:", field->sname); ! 446: gentype(field); ! 447: if (field->sclass > FIELD) { ! 448: printf(",%d,%d;", field->offset, field->sclass - FIELD); ! 449: } else { ! 450: printf(",%d,%d;", field->offset, ! 451: tsize(field->stype, field->dimoff, field->sizoff)); ! 452: } ! 453: ++i; ! 454: } ! 455: putchar(';'); ! 456: break; ! 457: ! 458: case ENUMTY: ! 459: printf("%d=e", id); ! 460: i = index; ! 461: while (dimtab[i] != -1) { ! 462: field = &stab[dimtab[i]]; ! 463: printf("%s:%d,", field->sname, field->offset); ! 464: i++; ! 465: } ! 466: putchar(';'); ! 467: break; ! 468: ! 469: default: ! 470: cerror("couldn't find basic type %d for %s\n", t, name); ! 471: break; ! 472: } ! 473: } ! 474: ! 475: /* ! 476: * Generate offset and size info. ! 477: */ ! 478: ! 479: private geninfo(p) ! 480: register struct symtab *p; ! 481: { ! 482: int stabtype; ! 483: ! 484: if (p == nil) { ! 485: printf("\",0x%x,0,0,0\n", N_LSYM); ! 486: } else { ! 487: switch (p->sclass) { ! 488: case EXTERN: ! 489: case EXTDEF: ! 490: if (ISFTN(p->stype)) { ! 491: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); ! 492: } else { ! 493: printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p)); ! 494: } ! 495: break; ! 496: ! 497: case STATIC: ! 498: stabtype = stabLCSYM ? N_LCSYM : N_STSYM; ! 499: if (ISFTN(p->stype)) { ! 500: printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname); ! 501: } else if (p->slevel > 1) { ! 502: printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset); ! 503: } else { ! 504: printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname); ! 505: } ! 506: break; ! 507: ! 508: case REGISTER: ! 509: printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset); ! 510: break; ! 511: ! 512: case PARAM: ! 513: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff)); ! 514: break; ! 515: ! 516: default: ! 517: printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset)); ! 518: break; ! 519: } ! 520: } ! 521: } ! 522: ! 523: /* ! 524: * Generate information for a newly-defined structure. ! 525: */ ! 526: ! 527: /*ARGSUSED*/ ! 528: outstruct(szindex, paramindex) ! 529: int szindex, paramindex; ! 530: { ! 531: register Typeid typeid; ! 532: register struct symtab *p; ! 533: register int i, t, strindex; ! 534: ! 535: if (oldway) { ! 536: /* do nothing */; ! 537: } else if (gdebug) { ! 538: if ((i = dimtab[szindex + 3]) >= 0 && (p = &stab[i])->sname != nil) { ! 539: strindex = dimtab[p->sizoff + 1]; ! 540: typeid = typelookup(p->stype, NILINDEX, FORWARD, i); ! 541: if (typeid == nil) { ! 542: t = 0; ! 543: } else { ! 544: t = typeid->tnum; ! 545: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); ! 546: } ! 547: printf("\t.stabs\t\"%s:T", p->sname); ! 548: genstruct(p->stype, t, strindex, p->sname, bsize(p)); ! 549: geninfo(p); ! 550: } ! 551: } ! 552: } ! 553: ! 554: pstab(name, type) ! 555: char *name; ! 556: int type; ! 557: { ! 558: #ifndef ASSTRINGS ! 559: register int i; ! 560: register char c; ! 561: #endif ! 562: ! 563: if (!gdebug) { ! 564: return; ! 565: } else if (oldway) { ! 566: old_pstab(name, type); ! 567: return; ! 568: } ! 569: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 570: #ifdef ASSTRINGS ! 571: if ( name[0] == '\0') ! 572: printf("\t.stabn\t"); ! 573: else ! 574: #ifndef FLEXNAMES ! 575: printf("\t.stabs\t\"%.8s\",", name); ! 576: #else ! 577: printf("\t.stabs\t\"%s\",", name); ! 578: #endif ! 579: #else ! 580: printf(" .stab "); ! 581: for(i=0; i<8; i++) ! 582: if (c = name[i]) printf("'%c,", c); ! 583: else printf("0,"); ! 584: #endif ! 585: printf("0%o,", type); ! 586: } ! 587: ! 588: #ifdef STABDOT ! 589: pstabdot(type, value) ! 590: int type; ! 591: int value; ! 592: { ! 593: if ( ! gdebug) { ! 594: return; ! 595: } else if (oldway) { ! 596: old_pstabdot(type, value); ! 597: return; ! 598: } ! 599: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 600: printf("\t.stabd\t"); ! 601: printf("0%o,0,0%o\n",type, value); ! 602: } ! 603: #endif ! 604: ! 605: #ifndef STABDOT ! 606: extern char NULLNAME[8]; ! 607: #endif ! 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: #ifndef ASSTRINGS ! 810: register int i; ! 811: register char c; ! 812: #endif ! 813: if (!gdebug) return; ! 814: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 815: #ifdef ASSTRINGS ! 816: if ( name[0] == '\0') ! 817: printf("\t.stabn\t"); ! 818: else ! 819: #ifndef FLEXNAMES ! 820: printf("\t.stabs\t\"%.8s\", ", name); ! 821: #else ! 822: printf("\t.stabs\t\"%s\", ", name); ! 823: #endif ! 824: #else ! 825: printf(" .stab "); ! 826: for(i=0; i<8; i++) ! 827: if (c = name[i]) printf("'%c,", c); ! 828: else printf("0,"); ! 829: #endif ! 830: printf("0%o,", type); ! 831: } ! 832: ! 833: #ifdef STABDOT ! 834: private old_pstabdot(type, value) ! 835: int type; ! 836: int value; ! 837: { ! 838: if ( ! gdebug) return; ! 839: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 840: printf("\t.stabd\t"); ! 841: printf("0%o,0,0%o\n",type, value); ! 842: } ! 843: #endif ! 844: ! 845: private old_poffs(p) ! 846: register struct symtab *p; { ! 847: int s; ! 848: if (!gdebug) return; ! 849: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { ! 850: old_pstab(p->sname, N_LENG); ! 851: printf("1,0,%d\n", s); ! 852: } ! 853: } ! 854: ! 855: private old_psline() { ! 856: static int lastlineno; ! 857: register char *cp, *cq; ! 858: register int i; ! 859: ! 860: if (!gdebug) return; ! 861: ! 862: cq = ititle; ! 863: cp = ftitle; ! 864: ! 865: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 866: if ( *cp == '\0' ) goto eq; ! 867: ! 868: neq: for (i=0; i<100; i++) ! 869: ititle[i] = '\0'; ! 870: cp = ftitle; ! 871: cq = ititle; ! 872: while ( *cp ) ! 873: *cq++ = *cp++; ! 874: *cq = '\0'; ! 875: *--cq = '\0'; ! 876: #ifndef FLEXNAMES ! 877: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 878: old_pstab(cp, N_SOL); ! 879: if (gdebug) printf("0,0,LL%d\n", labelno); ! 880: } ! 881: #else ! 882: old_pstab(ititle+1, N_SOL); ! 883: if (gdebug) printf("0,0,LL%d\n", labelno); ! 884: #endif ! 885: *cq = '"'; ! 886: printf("LL%d:\n", labelno++); ! 887: ! 888: eq: if (lineno == lastlineno) return; ! 889: lastlineno = lineno; ! 890: ! 891: if (fdefflag) { ! 892: #ifdef STABDOT ! 893: old_pstabdot(N_SLINE, lineno); ! 894: #else ! 895: old_pstab(NULLNAME, N_SLINE); ! 896: printf("0,%d,LL%d\n", lineno, labelno); ! 897: printf("LL%d:\n", labelno++); ! 898: #endif ! 899: } ! 900: } ! 901: ! 902: private old_plcstab(level) { ! 903: if (!gdebug) return; ! 904: #ifdef STABDOT ! 905: old_pstabdot(N_LBRAC, level); ! 906: #else ! 907: old_pstab(NULLNAME, N_LBRAC); ! 908: printf("0,%d,LL%d\n", level, labelno); ! 909: printf("LL%d:\n", labelno++); ! 910: #endif ! 911: } ! 912: ! 913: private old_prcstab(level) { ! 914: if (!gdebug) return; ! 915: #ifdef STABDOT ! 916: pstabdot(N_RBRAC, level); ! 917: #else ! 918: pstab(NULLNAME, N_RBRAC); ! 919: printf("0,%d,LL%d\n", level, labelno); ! 920: printf("LL%d:\n", labelno++); ! 921: #endif ! 922: } ! 923: ! 924: private old_pfstab(sname) ! 925: char *sname; { ! 926: if (!gdebug) return; ! 927: pstab(sname, N_FUN); ! 928: #ifndef FLEXNAMES ! 929: printf("0,%d,_%.7s\n", lineno, sname); ! 930: #else ! 931: printf("0,%d,_%s\n", lineno, sname); ! 932: #endif ! 933: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.