|
|
1.1 ! root 1: /* ! 2: * Symbolic debugging info interface. ! 3: * ! 4: * Here we generate pseudo-ops that cause the assembler to put ! 5: * symbolic debugging information into the object file. ! 6: */ ! 7: ! 8: ! 9: #ifndef lint ! 10: static char sccsid[] = "@(#)stab.c 1.1 86/02/03 SMI"; /* from UCB X.X XX/XX/XX */ ! 11: #endif ! 12: #include "cpass1.h" ! 13: ! 14: ! 15: #include <sys/types.h> ! 16: #include <a.out.h> ! 17: #include "stab.h" ! 18: ! 19: #define private static ! 20: #define and && ! 21: #define or || ! 22: #define not ! ! 23: #define div / ! 24: #define mod % ! 25: #define nil 0 ! 26: ! 27: #define bytes(bits) ((bits) / SZCHAR) ! 28: #define bsize(p) bytes(dimtab[p->sizoff]) /* size in bytes of a symbol */ ! 29: ! 30: #define NILINDEX -1 ! 31: #define FORWARD -2 ! 32: private int nfield; ! 33: #define NSTABFIELDS 7 ! 34: ! 35: typedef int Boolean; ! 36: #define false 0 ! 37: #define true 1 ! 38: ! 39: typedef enum{ xname, lname, value } Valueform; ! 40: ! 41: extern int ddebug; ! 42: extern int gdebug; ! 43: extern int optimize; ! 44: extern char *malloc(); ! 45: extern char *strcpy(); ! 46: ! 47: int stabLCSYM; ! 48: ! 49: /* the values of the stab fields we are currently working on */ ! 50: private unsigned char typeval; ! 51: private short descval; ! 52: private Valueform vform; ! 53: private unsigned valueval; ! 54: ! 55: /* ! 56: * Flag for producing either sdb or dbx symbol information. ! 57: */ ! 58: int oldway = false; ! 59: ! 60: ! 61: /* ! 62: * Since type names are lost in the travels and because C has ! 63: * structural type equivalence we keep a table of type words that ! 64: * we've already seen. The first time we see a type, it is assigned ! 65: * (inline) a number and future references just list that number. ! 66: * Structures, unions, enums, and arrays must be handled carefully ! 67: * since not all the necessary information is in the type word. ! 68: */ ! 69: ! 70: typedef struct Typeid *Typeid; ! 71: ! 72: struct Typeid { ! 73: TWORD tword; ! 74: int tarray; ! 75: int tstruct; ! 76: int tstrtag; ! 77: int f_index; /* File index */ ! 78: int tnum; /* Type number */ ! 79: Typeid chain; ! 80: }; ! 81: ! 82: Typeid entertype(); ! 83: ! 84: #define TABLESIZE 2003 ! 85: #define FTBL_SIZE 11 ! 86: ! 87: struct file { ! 88: char *ftitle; /* Copy of ftitle name */ ! 89: int f_index; /* File name index */ ! 90: int tnum; /* Next type num within this file */ ! 91: }; ! 92: ! 93: struct file dummy; ! 94: struct file *file_stack[FTBL_SIZE]; /* Hashed file table */ ! 95: struct file **stkp = file_stack; /* Stack pointer into file_stack[] */ ! 96: struct file *curfile = &dummy; /* Current file as we know it */ ! 97: int f_index; /* Next file index */ ! 98: ! 99: private int t_int, t_char; ! 100: private Typeid typetable[TABLESIZE]; ! 101: ! 102: private Boolean firsttime = true; ! 103: ! 104: /* ! 105: * Generate debugging info for a parameter. ! 106: * The offset isn't known when it is first entered into the symbol table ! 107: * since the types are read later. ! 108: */ ! 109: ! 110: fixarg(p) ! 111: struct symtab *p; ! 112: { ! 113: int offset; ! 114: if (oldway) { ! 115: old_fixarg(p); ! 116: } else if (gdebug) { ! 117: printf("\t.stabs\t\"%s:p", p->sname); ! 118: gentype(p); ! 119: offset = bytes(argoff); ! 120: #ifdef mc68000 ! 121: if ( (p->stype==STRTY || p->stype==UNIONTY) && dimtab[p->sizoff]<=2*SZCHAR ) ! 122: /* offset of itty bitty structs off by two */ ! 123: offset += 2; ! 124: #endif ! 125: printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), offset); ! 126: } ! 127: } ! 128: ! 129: /* ! 130: * Determine if the given symbol is a global array with dimension 0, ! 131: * which only makes sense if it's dimension is to be given later. ! 132: * We therefore currently do not generate symbol information for ! 133: * such entries. ! 134: */ ! 135: ! 136: #define isglobal(class) ( \ ! 137: class == EXTDEF or class == EXTERN or class == STATIC \ ! 138: ) ! 139: ! 140: private Boolean zero_length_array(p) ! 141: register struct symtab *p; ! 142: { ! 143: Boolean b; ! 144: int t; ! 145: ! 146: if (not isglobal(p->sclass)) { ! 147: b = false; ! 148: } else { ! 149: t = p->stype; ! 150: if (ISFTN(t)) { ! 151: t = DECREF(t); ! 152: } ! 153: b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0); ! 154: } ! 155: return b; ! 156: } ! 157: ! 158: /* ! 159: * for dbx, the collating sequence of registers includes two ! 160: * pseudo-registers following a0-a7. These are of no interest to ! 161: * the rest of the compiler, so the remainder of the register ! 162: * sequence (i.e., fp0-fp7) must be adjusted accordingly. ! 163: */ ! 164: #define stabregno(r) ((r) >= FP0 ? (r)+2 : (r)) ! 165: ! 166: /* ! 167: * Generate debugging info for a given symbol. ! 168: */ ! 169: ! 170: outstab(sym) ! 171: struct symtab *sym; ! 172: { ! 173: register struct symtab *p; ! 174: char *classname; ! 175: int offset; ! 176: Boolean ignore; ! 177: ! 178: if (oldway) { ! 179: old_outstab(sym); ! 180: } else if (gdebug and not zero_length_array(sym)) { ! 181: if (firsttime) { ! 182: firsttime = false; ! 183: inittypes(); ! 184: } ! 185: ignore = false; ! 186: p = sym; ! 187: offset = bytes(p->offset); ! 188: switch (p->sclass) { ! 189: case REGISTER: ! 190: classname = "r"; ! 191: offset = stabregno(p->offset); ! 192: break; ! 193: ! 194: /* ! 195: * Locals are the default class. ! 196: */ ! 197: case AUTO: ! 198: classname = ""; ! 199: break; ! 200: ! 201: case STATIC: ! 202: if (ISFTN(p->stype)) { ! 203: ignore = true; ! 204: } else if (p->slevel <= 1) { ! 205: classname = "S"; ! 206: } else { ! 207: classname = "V"; ! 208: } ! 209: break; ! 210: ! 211: case EXTDEF: ! 212: case EXTERN: ! 213: if (ISFTN(p->stype)) { ! 214: ignore = true; ! 215: } else { ! 216: classname = "G"; ! 217: } ! 218: break; ! 219: ! 220: case TYPEDEF: ! 221: classname = "t"; ! 222: break; ! 223: ! 224: case PARAM: ! 225: case MOS: ! 226: case MOU: ! 227: case MOE: ! 228: ignore = true; ! 229: break; ! 230: ! 231: case ENAME: ! 232: case UNAME: ! 233: case STNAME: ! 234: entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 235: ignore = true; ! 236: break; ! 237: ! 238: default: ! 239: if ((p->sclass&FIELD) == 0) { ! 240: printf("||| no info for %s (%d) \n", p->sname, p->sclass); ! 241: } ! 242: ignore = true; ! 243: break; ! 244: } ! 245: if ( BTYPE(p->stype) == TERROR ) { ! 246: /* don't try to output symbols entered in error */ ! 247: ignore = true; ! 248: } ! 249: if (not ignore) { ! 250: printf("\t.stabs\t\"%s:%s", p->sname, classname); ! 251: setinfo(p); ! 252: gentype(p); ! 253: geninfo(p); ! 254: } ! 255: } ! 256: } ! 257: /* ! 258: * Look for the given type word in the type table. ! 259: */ ! 260: ! 261: private Typeid typelookup(type, arrindex, strindex, strtag) ! 262: TWORD type; ! 263: int arrindex; ! 264: int strindex; ! 265: int strtag; ! 266: { ! 267: register TWORD tword; ! 268: register int i1, i2; ! 269: Typeid t; ! 270: ! 271: for (t = typetable[type mod TABLESIZE]; t != nil; t = t->chain) { ! 272: if (t->tword == type and ! 273: strindex == t->tstruct and strtag == t->tstrtag) { ! 274: if (arrindex == NILINDEX) { ! 275: break; ! 276: } else { ! 277: tword = type; ! 278: i1 = arrindex; ! 279: i2 = t->tarray; ! 280: while (ISARY(tword) and dimtab[i1] == dimtab[i2]) { ! 281: ++i1; ! 282: ++i2; ! 283: tword >>= TSHIFT; ! 284: } ! 285: if (!ISARY(tword)) { ! 286: break; ! 287: } ! 288: } ! 289: } ! 290: } ! 291: return t; ! 292: } ! 293: ! 294: /* ! 295: * Enter a type word and associated symtab indices into the type table. ! 296: */ ! 297: ! 298: private Typeid entertype(type, arrindex, strindex, strtag) ! 299: TWORD type; ! 300: int arrindex; ! 301: int strindex; ! 302: int strtag; ! 303: { ! 304: register Typeid t; ! 305: register int i; ! 306: ! 307: t = (Typeid) malloc(sizeof(struct Typeid)); ! 308: t->tword = type; ! 309: t->tarray = arrindex; ! 310: t->tstruct = strindex; ! 311: t->tstrtag = strtag; ! 312: t->f_index = curfile->f_index; ! 313: t->tnum = curfile->tnum++; ! 314: i = type mod TABLESIZE; ! 315: t->chain = typetable[i]; ! 316: typetable[i] = t; ! 317: return t; ! 318: } ! 319: ! 320: /* ! 321: * Change the information associated with a type table entry. ! 322: * Since I'm lazy this just creates a new entry with the number ! 323: * as the old one. ! 324: */ ! 325: ! 326: private reentertype(typeid, type, arrindex, strindex, strtag) ! 327: Typeid typeid; ! 328: TWORD type; ! 329: int arrindex; ! 330: int strindex; ! 331: int strtag; ! 332: { ! 333: register Typeid t; ! 334: register int i; ! 335: ! 336: t = (Typeid) malloc(sizeof(struct Typeid)); ! 337: t->tword = type; ! 338: t->tarray = arrindex; ! 339: t->tstruct = strindex; ! 340: t->tstrtag = strtag; ! 341: t->f_index = typeid->f_index; ! 342: t->tnum = typeid->tnum; ! 343: i = type mod TABLESIZE; ! 344: t->chain = typetable[i]; ! 345: typetable[i] = t; ! 346: } ! 347: ! 348: /* ! 349: * Initialize type table with predefined types. ! 350: */ ! 351: ! 352: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)->tnum ! 353: ! 354: private inittypes() ! 355: { ! 356: int t; ! 357: ! 358: t_int = builtintype(INT); ! 359: t_char = builtintype(CHAR); ! 360: maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL); ! 361: maketype("char", t_char, t_char, 0L, 127L); ! 362: maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL); ! 363: maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL); ! 364: maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L); ! 365: maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL); ! 366: maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL); ! 367: maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL); ! 368: maketype("float", builtintype(FLOAT), t_int, 4L, 0L); ! 369: maketype("double", builtintype(DOUBLE), t_int, 8L, 0L); ! 370: t = builtintype(UNDEF); ! 371: printf("\t.stabs\t\"void:t(%d,%d)=(%d,%d)", curfile->f_index, t, ! 372: curfile->f_index, t); ! 373: geninfo(nil); ! 374: t = builtintype(FARG); ! 375: printf("\t.stabs\t\"???:t(%d,%d)=(%d,%d)", curfile->f_index, t, ! 376: curfile->f_index, t_int); ! 377: geninfo(nil); ! 378: } ! 379: ! 380: /* ! 381: * Generate info for a new range type. ! 382: */ ! 383: ! 384: private maketype(name, tnum, eqtnum, lower, upper) ! 385: char *name; ! 386: int tnum, eqtnum; ! 387: long lower, upper; ! 388: { ! 389: printf("\t.stabs\t\"%s:t(%d,%d)=r(%d,%d);%d;%d;", ! 390: name, curfile->f_index, tnum, curfile->f_index, eqtnum, lower, upper); ! 391: geninfo(nil); ! 392: } ! 393: ! 394: /* ! 395: * Generate debugging information for the given type of the given symbol. ! 396: */ ! 397: ! 398: private gentype(sym) ! 399: struct symtab *sym; ! 400: { ! 401: register struct symtab *p; ! 402: register TWORD t; ! 403: register TWORD basictype; ! 404: register Typeid typeid; ! 405: int i, arrindex, strindex, strtag; ! 406: char basicchar; ! 407: ! 408: p = sym; ! 409: t = p->stype; ! 410: if (ISFTN(t)) { ! 411: t = DECREF(t); ! 412: } ! 413: basictype = BTYPE(t); ! 414: if (ISARY(t)) { ! 415: arrindex = p->dimoff; ! 416: } else { ! 417: arrindex = NILINDEX; ! 418: } ! 419: if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) { ! 420: strindex = dimtab[p->sizoff + 1]; ! 421: if (strindex == -1) { ! 422: strindex = FORWARD; ! 423: strtag = dimtab[p->sizoff + 3]; ! 424: } else { ! 425: strtag = NILINDEX; ! 426: } ! 427: } else { ! 428: strindex = NILINDEX; ! 429: strtag = NILINDEX; ! 430: } ! 431: i = arrindex; ! 432: typeid = typelookup(t, arrindex, strindex, strtag); ! 433: while (t != basictype and typeid == nil) { ! 434: typeid = entertype(t, i, strindex, strtag); ! 435: printf("(%d,%d)=", typeid->f_index, typeid->tnum); ! 436: switch (t&TMASK) { ! 437: case PTR: ! 438: printf("*"); ! 439: break; ! 440: ! 441: case FTN: ! 442: printf("f"); ! 443: break; ! 444: ! 445: case ARY: ! 446: printf("ar(0,%d);0;%d;", t_int, dimtab[i++] - 1); ! 447: break; ! 448: } ! 449: t = DECREF(t); ! 450: if (t == basictype) { ! 451: typeid = typelookup(t, NILINDEX, strindex, strtag); ! 452: } else { ! 453: typeid = typelookup(t, i, strindex, strtag); ! 454: } ! 455: } ! 456: if (typeid == nil) { ! 457: if (strindex == FORWARD) { ! 458: typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]); ! 459: if (typeid == nil) { ! 460: cerror("unbelievable forward reference"); ! 461: } ! 462: printf("(%d,%d)", typeid->f_index, typeid->tnum); ! 463: } else { ! 464: genstruct(t, NILINDEX, NILINDEX, strindex, p->sname, bsize(p)); ! 465: } ! 466: } else { ! 467: printf("(%d,%d)", typeid->f_index, typeid->tnum); ! 468: p = STP(strtag); ! 469: if (typeid->tstruct == FORWARD and (p->sflags & SPRFORWARD) == 0) { ! 470: switch (basictype) { ! 471: case STRTY: ! 472: basicchar = 's'; ! 473: break; ! 474: case UNIONTY: ! 475: basicchar = 'u'; ! 476: break; ! 477: case ENUMTY: ! 478: basicchar = 'e'; ! 479: break; ! 480: default: ! 481: cerror("Bad basic type, %d, in gentype", basictype); ! 482: basicchar = 's'; ! 483: } ! 484: printf("=x%c%s:", basicchar, STP(strtag)->sname); ! 485: p->sflags |= SPRFORWARD; ! 486: } ! 487: } ! 488: } ! 489: ! 490: /* ! 491: * Generate type information for structures, unions, and enumerations. ! 492: */ ! 493: ! 494: private genstruct(t, fileid, structid, index, name, size) ! 495: TWORD t; ! 496: int fileid; ! 497: int structid; ! 498: int index; ! 499: char *name; ! 500: int size; ! 501: { ! 502: Typeid typeid; ! 503: register int i; ! 504: register struct symtab *field; ! 505: int id; ! 506: int fid; ! 507: ! 508: if (structid == NILINDEX) { ! 509: typeid = entertype(t, NILINDEX, index, NILINDEX); ! 510: id = typeid->tnum; ! 511: fid = typeid->f_index; ! 512: } else { ! 513: id = structid; ! 514: fid = fileid; ! 515: } ! 516: switch (t) { ! 517: case STRTY: ! 518: case UNIONTY: ! 519: printf("(%d,%d)=%c%d", fid, id, t == STRTY ? 's' : 'u', size); ! 520: i = index; ! 521: while (dimtab[i] != -1) { ! 522: if (nfield > NSTABFIELDS && dimtab[i+1] != -1){ ! 523: continue_stab(); ! 524: } ! 525: field = STP(dimtab[i]); ! 526: printf("%s:", field->sname); ! 527: gentype(field); ! 528: if (field->sclass > FIELD) { ! 529: printf(",%d,%d;", field->offset, field->sclass - FIELD); ! 530: } else { ! 531: printf(",%d,%d;", field->offset, ! 532: tsize(field->stype, field->dimoff, field->sizoff)); ! 533: } ! 534: ++i; ! 535: ++nfield; ! 536: } ! 537: putchar(';'); ! 538: break; ! 539: ! 540: case ENUMTY: ! 541: printf("(%d,%d)=e", fid, id); ! 542: i = index; ! 543: while (dimtab[i] != -1 ) { ! 544: if (nfield > NSTABFIELDS && dimtab[i+1] != -1){ ! 545: continue_stab(); ! 546: } ! 547: field = STP(dimtab[i]); ! 548: printf("%s:%d,", field->sname, field->offset); ! 549: ++i; ! 550: ++nfield; ! 551: } ! 552: putchar(';'); ! 553: break; ! 554: ! 555: default: ! 556: cerror("couldn't find basic type %d for %s\n", t, name); ! 557: break; ! 558: } ! 559: } ! 560: ! 561: /* ! 562: * Generate offset and size info. ! 563: */ ! 564: ! 565: private setinfo(p) ! 566: register struct symtab *p; ! 567: { ! 568: int stabtype; ! 569: ! 570: if (p == nil) { ! 571: typeval = N_LSYM; ! 572: descval = 0; ! 573: vform = value; ! 574: valueval = 0; ! 575: } else { ! 576: descval = bsize(p); ! 577: switch (p->sclass) { ! 578: case EXTERN: ! 579: case EXTDEF: ! 580: if (ISFTN(p->stype)) { ! 581: typeval = N_FUN; ! 582: vform = xname; ! 583: valueval = (unsigned)p->sname; ! 584: } else { ! 585: typeval = N_GSYM; ! 586: vform = value; ! 587: valueval = 0; ! 588: } ! 589: break; ! 590: ! 591: case STATIC: ! 592: typeval = stabLCSYM ? N_LCSYM : N_STSYM; ! 593: vform = xname; ! 594: valueval = (unsigned)p->sname; ! 595: if (ISFTN(p->stype)) { ! 596: typeval = N_FUN; ! 597: } else if (p->slevel > 1) { ! 598: vform = lname; ! 599: valueval = p->offset; ! 600: } ! 601: break; ! 602: ! 603: case REGISTER: ! 604: typeval = N_RSYM; ! 605: vform = value; ! 606: valueval = stabregno(p->offset); ! 607: break; ! 608: ! 609: case PARAM: ! 610: typeval = N_PSYM; ! 611: vform = value; ! 612: valueval = bytes(argoff); ! 613: break; ! 614: ! 615: default: ! 616: typeval = N_LSYM; ! 617: vform = value; ! 618: valueval = bytes(p->offset); ! 619: break; ! 620: } ! 621: } ! 622: } ! 623: ! 624: private geninfo(p) ! 625: struct symtab *p; ! 626: { ! 627: setinfo( p ); ! 628: printf("\",0x%x,0,%d," , typeval, descval ); ! 629: switch (vform){ ! 630: case value: printf("%d\n", valueval); break; ! 631: case xname: printf("_%s\n", valueval); break; ! 632: case lname: printf("L%d\n", valueval); break; ! 633: } ! 634: nfield = 0; ! 635: } ! 636: ! 637: /* stab strings for structures can be very big. Sometimes we would ! 638: * like to continue them on a second line. For this case, we must ! 639: * write out a back-slash at the end of the quoted string, then ! 640: * put out the rest of the stab entry information, followed by a new ! 641: * .stabs line. The information we put must be setup in globals by ! 642: * a previous call to setinfo. ! 643: */ ! 644: ! 645: private continue_stab() ! 646: { ! 647: printf("\\\\\",0x%x,0,%d," , typeval, descval ); ! 648: switch (vform){ ! 649: case value: printf("%d\n", valueval); break; ! 650: case xname: printf("_%s\n", valueval); break; ! 651: case lname: printf("L%d\n", valueval); break; ! 652: } ! 653: printf("\t.stabs\t\""); ! 654: nfield = 0; ! 655: } ! 656: ! 657: /* ! 658: * Generate information for a newly-defined structure. ! 659: */ ! 660: ! 661: outstruct(szindex, paramindex) ! 662: int szindex, paramindex; ! 663: { ! 664: register Typeid typeid; ! 665: register struct symtab *p; ! 666: register int i, strindex; ! 667: ! 668: if (oldway) { ! 669: /* do nothing */; ! 670: } else if (gdebug) { ! 671: i = dimtab[szindex + 3]; ! 672: p = STP(i); ! 673: if (i != -1 ) { ! 674: strindex = dimtab[p->sizoff + 1]; ! 675: typeid = typelookup(p->stype, NILINDEX, FORWARD, i); ! 676: if (typeid != nil) { ! 677: if (typeid->f_index == curfile->f_index) { ! 678: reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX); ! 679: } else { ! 680: typeid = entertype(p->stype, NILINDEX, FORWARD, NILINDEX); ! 681: } ! 682: printf("\t.stabs\t\"%s:T", p->sname); ! 683: setinfo(p); ! 684: genstruct(p->stype, typeid->f_index, typeid->tnum, strindex, ! 685: p->sname, bsize(p)); ! 686: geninfo(p); ! 687: } else { ! 688: cerror("Couldn't find struct %s", p->sname); ! 689: } ! 690: } ! 691: } ! 692: } ! 693: ! 694: pstab(name, type) ! 695: char *name; ! 696: int type; ! 697: { ! 698: register int i; ! 699: register char c; ! 700: ! 701: if (!gdebug) { ! 702: return; ! 703: } else if (oldway) { ! 704: old_pstab(name, type); ! 705: return; ! 706: } ! 707: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 708: #ifdef ASSTRINGS ! 709: if ( name[0] == '\0') ! 710: printf("\t.stabn\t"); ! 711: else ! 712: #ifndef FLEXNAMES ! 713: printf("\t.stabs\t\"%.8s\",", name); ! 714: #else ! 715: printf("\t.stabs\t\"%s\",", name); ! 716: #endif ! 717: #else ! 718: printf(" .stab "); ! 719: for(i=0; i<8; i++) ! 720: if (c = name[i]) printf("'%c,", c); ! 721: else printf("0,"); ! 722: #endif ! 723: printf("0%o,", type); ! 724: } ! 725: ! 726: #ifdef STABDOT ! 727: pstabdot(type, value) ! 728: int type; ! 729: int value; ! 730: { ! 731: if ( ! gdebug) { ! 732: return; ! 733: } else if (oldway) { ! 734: old_pstabdot(type, value); ! 735: return; ! 736: } ! 737: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 738: printf("\t.stabd\t"); ! 739: printf("0%o,0,0%o\n",type, value); ! 740: } ! 741: #endif ! 742: ! 743: extern char NULLNAME[8]; ! 744: extern int labelno; ! 745: extern int fdefflag; ! 746: ! 747: psline(lineno) ! 748: int lineno; ! 749: { ! 750: static int nrecur = 0; ! 751: static int lastlineno; ! 752: register char *cp, *cq; ! 753: register int i; ! 754: int tmp; ! 755: ! 756: if (nrecur) { ! 757: /* ! 758: * N_SLINE and N_SOL .stab lines must go into .text space. ! 759: * We use locctr() to get there and back, but locctr() ! 760: * turns around and calls US, so... ! 761: */ ! 762: return; ! 763: } ! 764: if (!gdebug) { ! 765: return; ! 766: } else if (oldway) { ! 767: old_psline(lineno); ! 768: return; ! 769: } ! 770: ! 771: cq = ititle; ! 772: cp = ftitle; ! 773: ! 774: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 775: if ( *cp == '\0' ) goto eq; ! 776: ! 777: neq: for (i=0; i<100; i++) ! 778: ititle[i] = '\0'; ! 779: cp = ftitle; ! 780: cq = ititle; ! 781: while ( *cp ) ! 782: *cq++ = *cp++; ! 783: *cq = '\0'; ! 784: *--cq = '\0'; ! 785: nrecur++; tmp = locctr(PROG); ! 786: #ifndef FLEXNAMES ! 787: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 788: pstab(cp, N_SOL); ! 789: if (gdebug) printf("0,0,LL%d\n", labelno); ! 790: } ! 791: #else ! 792: pstab(ititle+1, N_SOL); ! 793: if (gdebug) printf("0,0,LL%d\n", labelno); ! 794: #endif ! 795: *cq = '"'; ! 796: printf("LL%d:\n", labelno++); ! 797: locctr(tmp); nrecur--; ! 798: ! 799: eq: if (lineno == lastlineno) return; ! 800: lastlineno = lineno; ! 801: ! 802: nrecur++; tmp = locctr(PROG); ! 803: if ((tmp == PROG) and not optimize) { ! 804: #ifdef STABDOT ! 805: pstabdot(N_SLINE, lineno); ! 806: #else ! 807: pstab(NULLNAME, N_SLINE); ! 808: printf("0,%d,LL%d\n", lineno, labelno); ! 809: printf("LL%d:\n", labelno++); ! 810: #endif ! 811: } ! 812: locctr(tmp); nrecur--; ! 813: } ! 814: ! 815: plcstab(level) ! 816: int level; ! 817: { ! 818: if (!gdebug) { ! 819: return; ! 820: } else if (oldway) { ! 821: old_plcstab(level); ! 822: return; ! 823: } ! 824: #ifdef STABDOT ! 825: pstabdot(N_LBRAC, level); ! 826: #else ! 827: pstab(NULLNAME, N_LBRAC); ! 828: printf("0,%d,LL%d\n", level, labelno); ! 829: printf("LL%d:\n", labelno++); ! 830: #endif ! 831: } ! 832: ! 833: prcstab(level) ! 834: int level; ! 835: { ! 836: if (!gdebug) { ! 837: return; ! 838: } else if (oldway) { ! 839: old_prcstab(level); ! 840: return; ! 841: } ! 842: #ifdef STABDOT ! 843: pstabdot(N_RBRAC, level); ! 844: #else ! 845: pstab(NULLNAME, N_RBRAC); ! 846: printf("0,%d,LL%d\n", level, labelno); ! 847: printf("LL%d:\n", labelno++); ! 848: #endif ! 849: } ! 850: ! 851: pfstab(sname) ! 852: char *sname; ! 853: { ! 854: register struct symtab *p; ! 855: ! 856: if (gdebug) { ! 857: if (oldway) { ! 858: old_pfstab(sname); ! 859: } else { ! 860: p = STP(lookup(sname, 0)); ! 861: printf("\t.stabs\t\"%s:", p->sname); ! 862: putchar((p->sclass == STATIC) ? 'f' : 'F'); setinfo(p); ! 863: gentype(p); ! 864: geninfo(p); ! 865: } ! 866: } ! 867: } ! 868: ! 869: /* ! 870: * Have the beginning of an include file. ! 871: * Change our notion of the current file. ! 872: */ ! 873: stab_startheader() ! 874: { ! 875: char buf[256]; ! 876: ! 877: if (!gdebug) { ! 878: return; ! 879: } ! 880: if (firsttime) { ! 881: firsttime = false; ! 882: inittypes(); ! 883: } ! 884: strcpy(buf, ftitle + 1); ! 885: buf[strlen(buf) - 1] = '\0'; ! 886: insert_filename(buf); ! 887: pstab(buf, N_BINCL); ! 888: printf("0,0,0\n"); ! 889: } ! 890: ! 891: /* ! 892: * Have the end of an include file. ! 893: */ ! 894: stab_endheader() ! 895: { ! 896: char buf[256]; ! 897: ! 898: if (!gdebug) { ! 899: return; ! 900: } ! 901: strcpy(buf, ftitle + 1); ! 902: buf[strlen(buf) - 1] = '\0'; ! 903: pstab("", N_EINCL); ! 904: printf("0,0,0\n"); ! 905: curfile = *--stkp; ! 906: } ! 907: ! 908: /* ! 909: * Old way of doing things. ! 910: */ ! 911: ! 912: private old_fixarg(p) ! 913: struct symtab *p; { ! 914: if (gdebug) { ! 915: old_pstab(p->sname, N_PSYM); ! 916: if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR); ! 917: old_poffs(p); ! 918: } ! 919: } ! 920: ! 921: private old_outstab(p) ! 922: struct symtab *p; { ! 923: register TWORD ptype; ! 924: register char *pname; ! 925: register char pclass; ! 926: register int poffset; ! 927: ! 928: if (!gdebug) return; ! 929: ! 930: ptype = p->stype; ! 931: pname = p->sname; ! 932: pclass = p->sclass; ! 933: poffset = p->offset; ! 934: ! 935: if (ISFTN(ptype)) { ! 936: return; ! 937: } ! 938: ! 939: switch (pclass) { ! 940: ! 941: case AUTO: ! 942: old_pstab(pname, N_LSYM); ! 943: printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR); ! 944: old_poffs(p); ! 945: return; ! 946: ! 947: case EXTDEF: ! 948: case EXTERN: ! 949: old_pstab(pname, N_GSYM); ! 950: printf("0,%d,0\n", ptype); ! 951: old_poffs(p); ! 952: return; ! 953: ! 954: case STATIC: ! 955: #ifdef LCOMM ! 956: /* stabLCSYM is 1 during nidcl so we can get stab type right */ ! 957: old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM); ! 958: #else ! 959: old_pstab(pname, N_STSYM); ! 960: #endif ! 961: if (p->slevel > 1) { ! 962: printf("0,%d,L%d\n", ptype, poffset); ! 963: } else { ! 964: printf("0,%d,%s\n", ptype, exname(pname)); ! 965: } ! 966: old_poffs(p); ! 967: return; ! 968: ! 969: case REGISTER: ! 970: old_pstab(pname, N_RSYM); ! 971: printf("0,%d,%d\n", ptype, poffset); ! 972: old_poffs(p); ! 973: return; ! 974: ! 975: case MOS: ! 976: case MOU: ! 977: old_pstab(pname, N_SSYM); ! 978: printf("0,%d,%d\n", ptype, poffset/SZCHAR); ! 979: old_poffs(p); ! 980: return; ! 981: ! 982: case PARAM: ! 983: /* parameter stab entries are processed in dclargs() */ ! 984: return; ! 985: ! 986: default: ! 987: #ifndef FLEXNAMES ! 988: if (ddebug) printf(" No .stab for %.8s\n", pname); ! 989: #else ! 990: if (ddebug) printf(" No .stab for %s\n", pname); ! 991: #endif ! 992: ! 993: } ! 994: } ! 995: ! 996: private old_pstab(name, type) ! 997: char *name; ! 998: int type; { ! 999: register int i; ! 1000: register char c; ! 1001: if (!gdebug) return; ! 1002: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 1003: #ifdef ASSTRINGS ! 1004: if ( name[0] == '\0') ! 1005: printf("\t.stabn\t"); ! 1006: else ! 1007: #ifndef FLEXNAMES ! 1008: printf("\t.stabs\t\"%.8s\", ", name); ! 1009: #else ! 1010: printf("\t.stabs\t\"%s\", ", name); ! 1011: #endif ! 1012: #else ! 1013: printf(" .stab "); ! 1014: for(i=0; i<8; i++) ! 1015: if (c = name[i]) printf("'%c,", c); ! 1016: else printf("0,"); ! 1017: #endif ! 1018: printf("0%o,", type); ! 1019: } ! 1020: ! 1021: #ifdef STABDOT ! 1022: private old_pstabdot(type, value) ! 1023: int type; ! 1024: int value; ! 1025: { ! 1026: if ( ! gdebug) return; ! 1027: /* locctr(PROG); /* .stabs must appear in .text for c2 */ ! 1028: printf("\t.stabd\t"); ! 1029: printf("0%o,0,0%o\n",type, value); ! 1030: } ! 1031: #endif ! 1032: ! 1033: private old_poffs(p) ! 1034: register struct symtab *p; { ! 1035: int s; ! 1036: if (!gdebug) return; ! 1037: if ((s = dimtab[p->sizoff]/SZCHAR) > 1) { ! 1038: old_pstab(p->sname, N_LENG); ! 1039: printf("1,0,%d\n", s); ! 1040: } ! 1041: } ! 1042: ! 1043: private old_psline(lineno) ! 1044: int lineno; ! 1045: { ! 1046: static int lastlineno; ! 1047: register char *cp, *cq; ! 1048: register int i; ! 1049: ! 1050: if (!gdebug) return; ! 1051: ! 1052: cq = ititle; ! 1053: cp = ftitle; ! 1054: ! 1055: while ( *cq ) if ( *cp++ != *cq++ ) goto neq; ! 1056: if ( *cp == '\0' ) goto eq; ! 1057: ! 1058: neq: for (i=0; i<100; i++) ! 1059: ititle[i] = '\0'; ! 1060: cp = ftitle; ! 1061: cq = ititle; ! 1062: while ( *cp ) ! 1063: *cq++ = *cp++; ! 1064: *cq = '\0'; ! 1065: *--cq = '\0'; ! 1066: #ifndef FLEXNAMES ! 1067: for ( cp = ititle+1; *(cp-1); cp += 8 ) { ! 1068: old_pstab(cp, N_SOL); ! 1069: if (gdebug) printf("0,0,LL%d\n", labelno); ! 1070: } ! 1071: #else ! 1072: old_pstab(ititle+1, N_SOL); ! 1073: if (gdebug) printf("0,0,LL%d\n", labelno); ! 1074: #endif ! 1075: *cq = '"'; ! 1076: printf("LL%d:\n", labelno++); ! 1077: ! 1078: eq: if (lineno == lastlineno) return; ! 1079: lastlineno = lineno; ! 1080: ! 1081: if (fdefflag) { ! 1082: #ifdef STABDOT ! 1083: old_pstabdot(N_SLINE, lineno); ! 1084: #else ! 1085: old_pstab(NULLNAME, N_SLINE); ! 1086: printf("0,%d,LL%d\n", lineno, labelno); ! 1087: printf("LL%d:\n", labelno++); ! 1088: #endif ! 1089: } ! 1090: } ! 1091: ! 1092: private old_plcstab(level) { ! 1093: if (!gdebug) return; ! 1094: #ifdef STABDOT ! 1095: old_pstabdot(N_LBRAC, level); ! 1096: #else ! 1097: old_pstab(NULLNAME, N_LBRAC); ! 1098: printf("0,%d,LL%d\n", level, labelno); ! 1099: printf("LL%d:\n", labelno++); ! 1100: #endif ! 1101: } ! 1102: ! 1103: private old_prcstab(level) { ! 1104: if (!gdebug) return; ! 1105: #ifdef STABDOT ! 1106: pstabdot(N_RBRAC, level); ! 1107: #else ! 1108: pstab(NULLNAME, N_RBRAC); ! 1109: printf("0,%d,LL%d\n", level, labelno); ! 1110: printf("LL%d:\n", labelno++); ! 1111: #endif ! 1112: } ! 1113: ! 1114: private old_pfstab(sname) ! 1115: char *sname; { ! 1116: if (!gdebug) return; ! 1117: pstab(sname, N_FUN); ! 1118: #ifndef FLEXNAMES ! 1119: printf("0,%d,_%.7s\n", lineno, sname); ! 1120: #else ! 1121: printf("0,%d,_%s\n", lineno, sname); ! 1122: #endif ! 1123: } ! 1124: ! 1125: /* ! 1126: * Have entered a new file. ! 1127: * Allocate a node for it. ! 1128: */ ! 1129: insert_filename(file) ! 1130: char *file; ! 1131: { ! 1132: *stkp++ = curfile; ! 1133: curfile = (struct file *) malloc(sizeof(struct file)); ! 1134: curfile->ftitle = strcpy(malloc(strlen(file) + 1), file); ! 1135: curfile->f_index = f_index++; ! 1136: curfile->tnum = 1; ! 1137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.