1826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*15942Smckusick #ifndef lint 4*15942Smckusick static char sccsid[] = "@(#)stab.c 1.8.1.1 02/04/84"; 5*15942Smckusick #endif 6826Speter 7772Speter /* 8826Speter * procedures to put out sdb symbol table information. 9826Speter * and stabs for separate compilation type checking. 10826Speter * these use the new .stabs, .stabn, and .stabd directives 11772Speter */ 12772Speter 13772Speter #include "whoami.h" 14772Speter #ifdef PC 15772Speter /* and the rest of the file */ 16772Speter # include "0.h" 1710649Speter # include "objfmt.h" 18772Speter # include <stab.h> 19772Speter 20842Speter /* 21842Speter * additional symbol definition for <stab.h> 22842Speter * that is used by the separate compilation facility -- 23842Speter * eventually, <stab.h> should be updated to include this 24842Speter */ 25772Speter 26842Speter # include "pstab.h" 27772Speter # include "pc.h" 28772Speter 29772Speter /* 30826Speter * absolute value: line numbers are negative if error recovery. 31826Speter */ 32826Speter #define ABS( x ) ( x < 0 ? -x : x ) 33826Speter 34826Speter /* 352164Speter * global variables 36772Speter */ 37*15942Smckusick /*ARGSUSED*/ 382164Speter stabgvar( name , type , offset , length , line ) 39772Speter char *name; 40772Speter int type; 41772Speter int offset; 42772Speter int length; 43826Speter int line; 44772Speter { 45772Speter 46826Speter /* 47826Speter * for separate compilation 48826Speter */ 492164Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 50*15942Smckusick , (int) name , N_PC , N_PGVAR , ABS( line ) ); 51826Speter /* 52826Speter * for sdb 53826Speter */ 54772Speter if ( ! opt('g') ) { 55772Speter return; 56772Speter } 57772Speter putprintf( " .stabs \"" , 1 ); 58*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 592164Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 602164Speter putprintf( " .stabs \"" , 1 ); 61*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 622164Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 632164Speter } 642164Speter 652164Speter /* 662164Speter * local variables 672164Speter */ 68*15942Smckusick /*ARGSUSED*/ 692164Speter stablvar( name , type , level , offset , length ) 702164Speter char *name; 712164Speter int type; 722164Speter int level; 732164Speter int offset; 742164Speter int length; 752164Speter { 762164Speter 772164Speter if ( ! opt('g') ) { 782164Speter return; 79772Speter } 80772Speter putprintf( " .stabs \"" , 1 ); 81*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 822164Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset ); 832164Speter putprintf( " .stabs \"" , 1 ); 84*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 85826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 86772Speter } 87772Speter 88772Speter 89772Speter /* 90772Speter * parameters 91772Speter */ 92772Speter stabparam( name , type , offset , length ) 93772Speter char *name; 94772Speter int type; 95772Speter int offset; 96772Speter int length; 97772Speter { 98772Speter 99772Speter if ( ! opt('g') ) { 100772Speter return; 101772Speter } 102772Speter putprintf( " .stabs \"" , 1 ); 103*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 104826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); 105772Speter putprintf( " .stabs \"" , 1 ); 106*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 107826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 108772Speter } 109772Speter 110772Speter /* 111772Speter * fields 112772Speter */ 113772Speter 114772Speter /* 115772Speter * left brackets 116772Speter */ 117772Speter stablbrac( level ) 118772Speter int level; 119772Speter { 120772Speter 121772Speter if ( ! opt('g') ) { 122772Speter return; 123772Speter } 124826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); 125772Speter } 126772Speter 127772Speter /* 128772Speter * right brackets 129772Speter */ 130772Speter stabrbrac( level ) 131772Speter int level; 132772Speter { 133772Speter 134772Speter if ( ! opt('g') ) { 135772Speter return; 136772Speter } 137826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); 138772Speter } 139772Speter 140772Speter /* 141772Speter * functions 142772Speter */ 1437925Smckusick stabfunc( name , typeclass , line , level ) 144772Speter char *name; 1457925Smckusick int typeclass; 146772Speter int line; 147772Speter long level; 148772Speter { 1493365Speter char extname[ BUFSIZ ]; 150772Speter 151826Speter /* 152826Speter * for separate compilation 153826Speter */ 154826Speter if ( level == 1 ) { 1557925Smckusick if ( typeclass == FUNC ) { 156842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 157*15942Smckusick , (int) name , N_PC , N_PGFUNC , ABS( line ) ); 1587925Smckusick } else if ( typeclass == PROC ) { 159842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 160*15942Smckusick , (int) name , N_PC , N_PGPROC , ABS( line ) ); 161826Speter } 162772Speter } 163826Speter /* 164826Speter * for sdb 165826Speter */ 166772Speter if ( ! opt('g') ) { 167772Speter return; 168772Speter } 169772Speter putprintf( " .stabs \"" , 1 ); 170*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) name ); 171*15942Smckusick sextname( extname , name , (int) level ); 172*15942Smckusick putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , (int) extname ); 173772Speter } 174772Speter 175772Speter /* 176772Speter * source line numbers 177772Speter */ 178772Speter stabline( line ) 179772Speter int line; 180772Speter { 181772Speter if ( ! opt('g') ) { 182772Speter return; 183772Speter } 184826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 185772Speter } 186772Speter 187772Speter /* 188772Speter * source files 189772Speter */ 190*15942Smckusick stabsource( filename ) 191772Speter char *filename; 192*15942Smckusick { 193*15942Smckusick int label; 194*15942Smckusick 195*15942Smckusick /* 196*15942Smckusick * for separate compilation 197*15942Smckusick */ 198*15942Smckusick putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 199*15942Smckusick , (int) filename , N_PC , N_PSO ); 200*15942Smckusick /* 201*15942Smckusick * for sdb 202*15942Smckusick */ 203*15942Smckusick if ( ! opt('g') ) { 204*15942Smckusick return; 205*15942Smckusick } 206*15942Smckusick label = (int) getlab(); 207*15942Smckusick putprintf( " .stabs \"" , 1 ); 208*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) filename ); 209*15942Smckusick putprintf( "\",0x%x,0,0," , 1 , N_SO ); 210*15942Smckusick putprintf( PREFIXFORMAT , 0 , (int) LLABELPREFIX , label ); 211*15942Smckusick putprintf( PREFIXFORMAT , 1 , (int) LLABELPREFIX , label ); 212*15942Smckusick putprintf( ":" , 0 ); 213772Speter } 214772Speter 215772Speter /* 216772Speter * included files get one or more of these: 217772Speter * one as they are entered by a #include, 218*15942Smckusick * and one every time they are returned to by nested #includes 219772Speter */ 220*15942Smckusick stabinclude( filename ) 221772Speter char *filename; 222*15942Smckusick { 223*15942Smckusick int label; 224*15942Smckusick 225*15942Smckusick /* 226*15942Smckusick * for separate compilation 227*15942Smckusick */ 228*15942Smckusick putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 229*15942Smckusick , (int) filename , N_PC , N_PSOL ); 230*15942Smckusick /* 231*15942Smckusick * for sdb 232*15942Smckusick */ 233*15942Smckusick if ( ! opt('g') ) { 234*15942Smckusick return; 235*15942Smckusick } 236*15942Smckusick label = (int) getlab(); 237*15942Smckusick putprintf( " .stabs \"" , 1 ); 238*15942Smckusick putprintf( NAMEFORMAT , 1 , (int) filename ); 239*15942Smckusick putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 240*15942Smckusick putprintf( PREFIXFORMAT , 0 , (int) LLABELPREFIX , label ); 241*15942Smckusick putprintf( PREFIXFORMAT , 1 , (int) LLABELPREFIX , label ); 242*15942Smckusick putprintf( ":" , 0 ); 24314128Speter } 24414128Speter 24514128Speter 246772Speter /* 247772Speter * global Pascal symbols : 248772Speter * labels, types, constants, and external procedure and function names: 249772Speter * These are used by the separate compilation facility 250772Speter * to be able to check for disjoint header files. 251772Speter */ 252772Speter 253826Speter /* 254826Speter * global labels 255826Speter */ 256842Speter stabglabel( label , line ) 257826Speter char *label; 258826Speter int line; 259772Speter { 260772Speter 261842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 262*15942Smckusick , (int) label , N_PC , N_PGLABEL , ABS( line ) ); 263772Speter } 264772Speter 265826Speter /* 266826Speter * global constants 267826Speter */ 268842Speter stabgconst( const , line ) 269842Speter char *const; 270826Speter int line; 271772Speter { 272772Speter 273842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 274*15942Smckusick , (int) const , N_PC , N_PGCONST , ABS( line ) ); 275772Speter } 276772Speter 277826Speter /* 278826Speter * global types 279826Speter */ 280842Speter stabgtype( type , line ) 281842Speter char *type; 282826Speter int line; 283772Speter { 284772Speter 285842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 286*15942Smckusick , (int) type , N_PC , N_PGTYPE , ABS( line ) ); 287772Speter } 288772Speter 289772Speter 290826Speter /* 291826Speter * external functions and procedures 292826Speter */ 2937925Smckusick stabefunc( name , typeclass , line ) 294826Speter char *name; 2957925Smckusick int typeclass; 296826Speter int line; 297772Speter { 298826Speter int type; 299772Speter 3007925Smckusick if ( typeclass == FUNC ) { 301842Speter type = N_PEFUNC; 3027925Smckusick } else if ( typeclass == PROC ) { 303842Speter type = N_PEPROC; 304826Speter } else { 305826Speter return; 306772Speter } 307842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 308*15942Smckusick , (int) name , N_PC , type , ABS( line ) ); 309772Speter } 310772Speter 311772Speter #endif PC 312