|
|
1.1 ! root 1: /* Copyright (c) 1980 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)stab.c 1.9 7/26/83"; ! 4: ! 5: /* ! 6: * procedures to put out sdb symbol table information. ! 7: * and stabs for separate compilation type checking. ! 8: * these use the new .stabs, .stabn, and .stabd directives ! 9: */ ! 10: ! 11: #include "whoami.h" ! 12: #ifdef PC ! 13: /* and the rest of the file */ ! 14: # include "0.h" ! 15: # include "objfmt.h" ! 16: # include "yy.h" ! 17: # include <stab.h> ! 18: ! 19: /* ! 20: * additional symbol definition for <stab.h> ! 21: * that is used by the separate compilation facility -- ! 22: * eventually, <stab.h> should be updated to include this ! 23: */ ! 24: ! 25: # include "pstab.h" ! 26: # include "pc.h" ! 27: ! 28: /* ! 29: * absolute value: line numbers are negative if error recovery. ! 30: */ ! 31: #define ABS( x ) ( x < 0 ? -x : x ) ! 32: ! 33: /* ! 34: * global variables ! 35: */ ! 36: stabgvar( name , type , offset , length , line ) ! 37: char *name; ! 38: int type; ! 39: int offset; ! 40: int length; ! 41: int line; ! 42: { ! 43: ! 44: /* ! 45: * for separate compilation ! 46: */ ! 47: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 48: , name , N_PC , N_PGVAR , ABS( line ) ); ! 49: /* ! 50: * for sdb ! 51: */ ! 52: if ( ! opt('g') ) { ! 53: return; ! 54: } ! 55: putprintf( " .stabs \"" , 1 ); ! 56: putprintf( NAMEFORMAT , 1 , name ); ! 57: putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); ! 58: putprintf( " .stabs \"" , 1 ); ! 59: putprintf( NAMEFORMAT , 1 , name ); ! 60: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); ! 61: } ! 62: ! 63: /* ! 64: * local variables ! 65: */ ! 66: stablvar( name , type , level , offset , length ) ! 67: char *name; ! 68: int type; ! 69: int level; ! 70: int offset; ! 71: int length; ! 72: { ! 73: ! 74: if ( ! opt('g') ) { ! 75: return; ! 76: } ! 77: putprintf( " .stabs \"" , 1 ); ! 78: putprintf( NAMEFORMAT , 1 , name ); ! 79: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset ); ! 80: putprintf( " .stabs \"" , 1 ); ! 81: putprintf( NAMEFORMAT , 1 , name ); ! 82: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); ! 83: } ! 84: ! 85: ! 86: /* ! 87: * parameters ! 88: */ ! 89: stabparam( name , type , offset , length ) ! 90: char *name; ! 91: int type; ! 92: int offset; ! 93: int length; ! 94: { ! 95: ! 96: if ( ! opt('g') ) { ! 97: return; ! 98: } ! 99: putprintf( " .stabs \"" , 1 ); ! 100: putprintf( NAMEFORMAT , 1 , name ); ! 101: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); ! 102: putprintf( " .stabs \"" , 1 ); ! 103: putprintf( NAMEFORMAT , 1 , name ); ! 104: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); ! 105: } ! 106: ! 107: /* ! 108: * fields ! 109: */ ! 110: stabfield( name , type , offset , length ) ! 111: char *name; ! 112: int type; ! 113: int offset; ! 114: int length; ! 115: { ! 116: ! 117: if ( ! opt('g') ) { ! 118: return; ! 119: } ! 120: putprintf( " .stabs \"" , 1 ); ! 121: putprintf( NAMEFORMAT , 1 , name ); ! 122: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset ); ! 123: putprintf( " .stabs \"" , 1 ); ! 124: putprintf( NAMEFORMAT , 1 , name ); ! 125: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); ! 126: } ! 127: ! 128: /* ! 129: * left brackets ! 130: */ ! 131: stablbrac( level ) ! 132: int level; ! 133: { ! 134: ! 135: if ( ! opt('g') ) { ! 136: return; ! 137: } ! 138: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); ! 139: } ! 140: ! 141: /* ! 142: * right brackets ! 143: */ ! 144: stabrbrac( level ) ! 145: int level; ! 146: { ! 147: ! 148: if ( ! opt('g') ) { ! 149: return; ! 150: } ! 151: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); ! 152: } ! 153: ! 154: /* ! 155: * functions ! 156: */ ! 157: stabfunc( name , typeclass , line , level ) ! 158: char *name; ! 159: int typeclass; ! 160: int line; ! 161: long level; ! 162: { ! 163: int type; ! 164: long i; ! 165: char extname[ BUFSIZ ]; ! 166: ! 167: /* ! 168: * for separate compilation ! 169: */ ! 170: if ( level == 1 ) { ! 171: if ( typeclass == FUNC ) { ! 172: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 173: , name , N_PC , N_PGFUNC , ABS( line ) ); ! 174: } else if ( typeclass == PROC ) { ! 175: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 176: , name , N_PC , N_PGPROC , ABS( line ) ); ! 177: } ! 178: } ! 179: /* ! 180: * for sdb ! 181: */ ! 182: if ( ! opt('g') ) { ! 183: return; ! 184: } ! 185: putprintf( " .stabs \"" , 1 ); ! 186: putprintf( NAMEFORMAT , 1 , name ); ! 187: sextname( extname , name , level ); ! 188: putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname ); ! 189: } ! 190: ! 191: /* ! 192: * source line numbers ! 193: */ ! 194: stabline( line ) ! 195: int line; ! 196: { ! 197: if ( ! opt('g') ) { ! 198: return; ! 199: } ! 200: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); ! 201: } ! 202: ! 203: /* ! 204: * source files ! 205: */ ! 206: stabsource(filename) ! 207: char *filename; ! 208: { ! 209: int label; ! 210: ! 211: /* ! 212: * for separate compilation ! 213: */ ! 214: putprintf(" .stabs \"%s\",0x%x,0,0x%x,0x%x", 0, ! 215: filename, N_PC, N_PSO, N_FLAGCHECKSUM); ! 216: /* ! 217: * for sdb ! 218: */ ! 219: if ( ! opt('g') ) { ! 220: return; ! 221: } ! 222: label = getlab(); ! 223: putprintf( " .stabs \"" , 1 ); ! 224: putprintf( NAMEFORMAT , 1 , filename ); ! 225: putprintf( "\",0x%x,0,0," , 1 , N_SO ); ! 226: putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); ! 227: putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); ! 228: putprintf( ":" , 0 ); ! 229: } ! 230: ! 231: /* ! 232: * included files get one or more of these: ! 233: * one as they are entered by a #include, ! 234: * and one every time they are returned to from nested #includes. ! 235: */ ! 236: stabinclude(filename, firsttime) ! 237: char *filename; ! 238: bool firsttime; ! 239: { ! 240: int label; ! 241: long check; ! 242: ! 243: /* ! 244: * for separate compilation ! 245: */ ! 246: if (firsttime) { ! 247: check = checksum(filename); ! 248: } else { ! 249: check = N_FLAGCHECKSUM; ! 250: } ! 251: putprintf(" .stabs \"%s\",0x%x,0,0x%x,0x%x", 0, ! 252: filename, N_PC, N_PSOL, check); ! 253: /* ! 254: * for sdb ! 255: */ ! 256: if ( ! opt('g') ) { ! 257: return; ! 258: } ! 259: label = getlab(); ! 260: putprintf( " .stabs \"" , 1 ); ! 261: putprintf( NAMEFORMAT , 1 , filename ); ! 262: putprintf( "\",0x%x,0,0," , 1 , N_SOL ); ! 263: putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); ! 264: putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); ! 265: putprintf( ":" , 0 ); ! 266: } ! 267: ! 268: /* ! 269: * anyone know a good checksum for ascii files? ! 270: * this does a rotate-left and then exclusive-or's in the character. ! 271: * also, it avoids returning checksums of 0. ! 272: * The rotate is implemented by shifting and adding back the ! 273: * sign bit when negative. ! 274: */ ! 275: long ! 276: checksum(filename) ! 277: char *filename; ! 278: { ! 279: FILE *filep; ! 280: register int input; ! 281: register long check; ! 282: ! 283: filep = fopen(filename, "r"); ! 284: if (filep == NULL) { ! 285: perror(filename); ! 286: pexit(DIED); ! 287: } ! 288: check = 0; ! 289: while ((input = getc(filep)) != EOF) { ! 290: if (check < 0) { ! 291: check <<= 1; ! 292: check += 1; ! 293: } else { ! 294: check <<= 1; ! 295: } ! 296: check ^= input; ! 297: } ! 298: fclose(filep); ! 299: if ((unsigned) check <= N_FLAGCHECKSUM) { ! 300: return N_FLAGCHECKSUM + 1; ! 301: } else { ! 302: return check; ! 303: } ! 304: } ! 305: ! 306: /* ! 307: * global Pascal symbols : ! 308: * labels, types, constants, and external procedure and function names: ! 309: * These are used by the separate compilation facility ! 310: * to be able to check for disjoint header files. ! 311: */ ! 312: ! 313: /* ! 314: * global labels ! 315: */ ! 316: stabglabel( label , line ) ! 317: char *label; ! 318: int line; ! 319: { ! 320: ! 321: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 322: , label , N_PC , N_PGLABEL , ABS( line ) ); ! 323: } ! 324: ! 325: /* ! 326: * global constants ! 327: */ ! 328: stabgconst( const , line ) ! 329: char *const; ! 330: int line; ! 331: { ! 332: ! 333: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 334: , const , N_PC , N_PGCONST , ABS( line ) ); ! 335: } ! 336: ! 337: /* ! 338: * global types ! 339: */ ! 340: stabgtype( type , line ) ! 341: char *type; ! 342: int line; ! 343: { ! 344: ! 345: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 346: , type , N_PC , N_PGTYPE , ABS( line ) ); ! 347: } ! 348: ! 349: ! 350: /* ! 351: * external functions and procedures ! 352: */ ! 353: stabefunc( name , typeclass , line ) ! 354: char *name; ! 355: int typeclass; ! 356: int line; ! 357: { ! 358: int type; ! 359: ! 360: if ( typeclass == FUNC ) { ! 361: type = N_PEFUNC; ! 362: } else if ( typeclass == PROC ) { ! 363: type = N_PEPROC; ! 364: } else { ! 365: return; ! 366: } ! 367: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 ! 368: , name , N_PC , type , ABS( line ) ); ! 369: } ! 370: ! 371: #endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.