1826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*10649Speter static char sccsid[] = "@(#)stab.c 1.8 02/01/83"; 4826Speter 5772Speter /* 6826Speter * procedures to put out sdb symbol table information. 7826Speter * and stabs for separate compilation type checking. 8826Speter * these use the new .stabs, .stabn, and .stabd directives 9772Speter */ 10772Speter 11772Speter #include "whoami.h" 12772Speter #ifdef PC 13772Speter /* and the rest of the file */ 14772Speter # include "0.h" 15*10649Speter # include "objfmt.h" 16772Speter # include <stab.h> 17772Speter 18842Speter /* 19842Speter * additional symbol definition for <stab.h> 20842Speter * that is used by the separate compilation facility -- 21842Speter * eventually, <stab.h> should be updated to include this 22842Speter */ 23772Speter 24842Speter # include "pstab.h" 25772Speter # include "pc.h" 26772Speter 27772Speter /* 28826Speter * absolute value: line numbers are negative if error recovery. 29826Speter */ 30826Speter #define ABS( x ) ( x < 0 ? -x : x ) 31826Speter 32826Speter /* 332164Speter * global variables 34772Speter */ 352164Speter stabgvar( name , type , offset , length , line ) 36772Speter char *name; 37772Speter int type; 38772Speter int offset; 39772Speter int length; 40826Speter int line; 41772Speter { 42772Speter 43826Speter /* 44826Speter * for separate compilation 45826Speter */ 462164Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 472164Speter , name , N_PC , N_PGVAR , ABS( line ) ); 48826Speter /* 49826Speter * for sdb 50826Speter */ 51772Speter if ( ! opt('g') ) { 52772Speter return; 53772Speter } 54772Speter putprintf( " .stabs \"" , 1 ); 55772Speter putprintf( NAMEFORMAT , 1 , name ); 562164Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 572164Speter putprintf( " .stabs \"" , 1 ); 582164Speter putprintf( NAMEFORMAT , 1 , name ); 592164Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 602164Speter } 612164Speter 622164Speter /* 632164Speter * local variables 642164Speter */ 652164Speter stablvar( name , type , level , offset , length ) 662164Speter char *name; 672164Speter int type; 682164Speter int level; 692164Speter int offset; 702164Speter int length; 712164Speter { 722164Speter 732164Speter if ( ! opt('g') ) { 742164Speter return; 75772Speter } 76772Speter putprintf( " .stabs \"" , 1 ); 77772Speter putprintf( NAMEFORMAT , 1 , name ); 782164Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset ); 792164Speter putprintf( " .stabs \"" , 1 ); 802164Speter putprintf( NAMEFORMAT , 1 , name ); 81826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 82772Speter } 83772Speter 84772Speter 85772Speter /* 86772Speter * parameters 87772Speter */ 88772Speter stabparam( name , type , offset , length ) 89772Speter char *name; 90772Speter int type; 91772Speter int offset; 92772Speter int length; 93772Speter { 94772Speter 95772Speter if ( ! opt('g') ) { 96772Speter return; 97772Speter } 98772Speter putprintf( " .stabs \"" , 1 ); 99772Speter putprintf( NAMEFORMAT , 1 , name ); 100826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); 101772Speter putprintf( " .stabs \"" , 1 ); 102772Speter putprintf( NAMEFORMAT , 1 , name ); 103826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 104772Speter } 105772Speter 106772Speter /* 107772Speter * fields 108772Speter */ 109772Speter stabfield( name , type , offset , length ) 110772Speter char *name; 111772Speter int type; 112772Speter int offset; 113772Speter int length; 114772Speter { 115772Speter 116772Speter if ( ! opt('g') ) { 117772Speter return; 118772Speter } 119772Speter putprintf( " .stabs \"" , 1 ); 120772Speter putprintf( NAMEFORMAT , 1 , name ); 121826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset ); 122772Speter putprintf( " .stabs \"" , 1 ); 123772Speter putprintf( NAMEFORMAT , 1 , name ); 124826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 125772Speter } 126772Speter 127772Speter /* 128772Speter * left brackets 129772Speter */ 130772Speter stablbrac( level ) 131772Speter int level; 132772Speter { 133772Speter 134772Speter if ( ! opt('g') ) { 135772Speter return; 136772Speter } 137826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); 138772Speter } 139772Speter 140772Speter /* 141772Speter * right brackets 142772Speter */ 143772Speter stabrbrac( level ) 144772Speter int level; 145772Speter { 146772Speter 147772Speter if ( ! opt('g') ) { 148772Speter return; 149772Speter } 150826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); 151772Speter } 152772Speter 153772Speter /* 154772Speter * functions 155772Speter */ 1567925Smckusick stabfunc( name , typeclass , line , level ) 157772Speter char *name; 1587925Smckusick int typeclass; 159772Speter int line; 160772Speter long level; 161772Speter { 162826Speter int type; 163826Speter long i; 1643365Speter char extname[ BUFSIZ ]; 165772Speter 166826Speter /* 167826Speter * for separate compilation 168826Speter */ 169826Speter if ( level == 1 ) { 1707925Smckusick if ( typeclass == FUNC ) { 171842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 172842Speter , name , N_PC , N_PGFUNC , ABS( line ) ); 1737925Smckusick } else if ( typeclass == PROC ) { 174842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 175842Speter , name , N_PC , N_PGPROC , ABS( line ) ); 176826Speter } 177772Speter } 178826Speter /* 179826Speter * for sdb 180826Speter */ 181772Speter if ( ! opt('g') ) { 182772Speter return; 183772Speter } 184772Speter putprintf( " .stabs \"" , 1 ); 185772Speter putprintf( NAMEFORMAT , 1 , name ); 1863365Speter sextname( extname , name , level ); 1873365Speter putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname ); 188772Speter } 189772Speter 190772Speter /* 191772Speter * source line numbers 192772Speter */ 193772Speter stabline( line ) 194772Speter int line; 195772Speter { 196772Speter if ( ! opt('g') ) { 197772Speter return; 198772Speter } 199826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 200772Speter } 201772Speter 202772Speter /* 203772Speter * source files 204772Speter */ 205772Speter stabsource( filename ) 206772Speter char *filename; 207772Speter { 208826Speter int label; 209772Speter 210826Speter /* 211826Speter * for separate compilation 212826Speter */ 213842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 214842Speter , filename , N_PC , N_PSO ); 215826Speter /* 216826Speter * for sdb 217826Speter */ 218772Speter if ( ! opt('g') ) { 219772Speter return; 220772Speter } 221826Speter label = getlab(); 222772Speter putprintf( " .stabs \"" , 1 ); 223772Speter putprintf( NAMEFORMAT , 1 , filename ); 224826Speter putprintf( "\",0x%x,0,0," , 1 , N_SO ); 225772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 226772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 227772Speter putprintf( ":" , 0 ); 228772Speter } 229772Speter 230772Speter /* 231772Speter * included files get one or more of these: 232772Speter * one as they are entered by a #include, 233772Speter * and one every time they are returned to by nested #includes 234772Speter */ 235772Speter stabinclude( filename ) 236772Speter char *filename; 237772Speter { 238826Speter int label; 239772Speter 240826Speter /* 241842Speter * for separate compilation 242842Speter */ 243842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 244842Speter , filename , N_PC , N_PSOL ); 245842Speter /* 246826Speter * for sdb 247826Speter */ 248772Speter if ( ! opt('g') ) { 249772Speter return; 250772Speter } 251826Speter label = getlab(); 252772Speter putprintf( " .stabs \"" , 1 ); 253772Speter putprintf( NAMEFORMAT , 1 , filename ); 254826Speter putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 255772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 256772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 257772Speter putprintf( ":" , 0 ); 258772Speter } 259772Speter 260772Speter 261772Speter /* 262772Speter * global Pascal symbols : 263772Speter * labels, types, constants, and external procedure and function names: 264772Speter * These are used by the separate compilation facility 265772Speter * to be able to check for disjoint header files. 266772Speter */ 267772Speter 268826Speter /* 269826Speter * global labels 270826Speter */ 271842Speter stabglabel( label , line ) 272826Speter char *label; 273826Speter int line; 274772Speter { 275772Speter 276842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 277842Speter , label , N_PC , N_PGLABEL , ABS( line ) ); 278772Speter } 279772Speter 280826Speter /* 281826Speter * global constants 282826Speter */ 283842Speter stabgconst( const , line ) 284842Speter char *const; 285826Speter int line; 286772Speter { 287772Speter 288842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 289842Speter , const , N_PC , N_PGCONST , ABS( line ) ); 290772Speter } 291772Speter 292826Speter /* 293826Speter * global types 294826Speter */ 295842Speter stabgtype( type , line ) 296842Speter char *type; 297826Speter int line; 298772Speter { 299772Speter 300842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 301842Speter , type , N_PC , N_PGTYPE , ABS( line ) ); 302772Speter } 303772Speter 304772Speter 305826Speter /* 306826Speter * external functions and procedures 307826Speter */ 3087925Smckusick stabefunc( name , typeclass , line ) 309826Speter char *name; 3107925Smckusick int typeclass; 311826Speter int line; 312772Speter { 313826Speter int type; 314772Speter 3157925Smckusick if ( typeclass == FUNC ) { 316842Speter type = N_PEFUNC; 3177925Smckusick } else if ( typeclass == PROC ) { 318842Speter type = N_PEPROC; 319826Speter } else { 320826Speter return; 321772Speter } 322842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 323842Speter , name , N_PC , type , ABS( line ) ); 324772Speter } 325772Speter 326772Speter #endif PC 327