1826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*7925Smckusick static char sccsid[] = "@(#)stab.c 1.7 08/27/82"; 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" 15772Speter # include <stab.h> 16772Speter 17842Speter /* 18842Speter * additional symbol definition for <stab.h> 19842Speter * that is used by the separate compilation facility -- 20842Speter * eventually, <stab.h> should be updated to include this 21842Speter */ 22772Speter 23842Speter # include "pstab.h" 24772Speter # include "pc.h" 25772Speter 26772Speter /* 27826Speter * absolute value: line numbers are negative if error recovery. 28826Speter */ 29826Speter #define ABS( x ) ( x < 0 ? -x : x ) 30826Speter 31826Speter /* 322164Speter * global variables 33772Speter */ 342164Speter stabgvar( name , type , offset , length , line ) 35772Speter char *name; 36772Speter int type; 37772Speter int offset; 38772Speter int length; 39826Speter int line; 40772Speter { 41772Speter 42826Speter /* 43826Speter * for separate compilation 44826Speter */ 452164Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 462164Speter , name , N_PC , N_PGVAR , ABS( line ) ); 47826Speter /* 48826Speter * for sdb 49826Speter */ 50772Speter if ( ! opt('g') ) { 51772Speter return; 52772Speter } 53772Speter putprintf( " .stabs \"" , 1 ); 54772Speter putprintf( NAMEFORMAT , 1 , name ); 552164Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 562164Speter putprintf( " .stabs \"" , 1 ); 572164Speter putprintf( NAMEFORMAT , 1 , name ); 582164Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 592164Speter } 602164Speter 612164Speter /* 622164Speter * local variables 632164Speter */ 642164Speter stablvar( name , type , level , offset , length ) 652164Speter char *name; 662164Speter int type; 672164Speter int level; 682164Speter int offset; 692164Speter int length; 702164Speter { 712164Speter 722164Speter if ( ! opt('g') ) { 732164Speter return; 74772Speter } 75772Speter putprintf( " .stabs \"" , 1 ); 76772Speter putprintf( NAMEFORMAT , 1 , name ); 772164Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset ); 782164Speter putprintf( " .stabs \"" , 1 ); 792164Speter putprintf( NAMEFORMAT , 1 , name ); 80826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 81772Speter } 82772Speter 83772Speter 84772Speter /* 85772Speter * parameters 86772Speter */ 87772Speter stabparam( name , type , offset , length ) 88772Speter char *name; 89772Speter int type; 90772Speter int offset; 91772Speter int length; 92772Speter { 93772Speter 94772Speter if ( ! opt('g') ) { 95772Speter return; 96772Speter } 97772Speter putprintf( " .stabs \"" , 1 ); 98772Speter putprintf( NAMEFORMAT , 1 , name ); 99826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); 100772Speter putprintf( " .stabs \"" , 1 ); 101772Speter putprintf( NAMEFORMAT , 1 , name ); 102826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 103772Speter } 104772Speter 105772Speter /* 106772Speter * fields 107772Speter */ 108772Speter stabfield( name , type , offset , length ) 109772Speter char *name; 110772Speter int type; 111772Speter int offset; 112772Speter int length; 113772Speter { 114772Speter 115772Speter if ( ! opt('g') ) { 116772Speter return; 117772Speter } 118772Speter putprintf( " .stabs \"" , 1 ); 119772Speter putprintf( NAMEFORMAT , 1 , name ); 120826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset ); 121772Speter putprintf( " .stabs \"" , 1 ); 122772Speter putprintf( NAMEFORMAT , 1 , name ); 123826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 124772Speter } 125772Speter 126772Speter /* 127772Speter * left brackets 128772Speter */ 129772Speter stablbrac( level ) 130772Speter int level; 131772Speter { 132772Speter 133772Speter if ( ! opt('g') ) { 134772Speter return; 135772Speter } 136826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); 137772Speter } 138772Speter 139772Speter /* 140772Speter * right brackets 141772Speter */ 142772Speter stabrbrac( level ) 143772Speter int level; 144772Speter { 145772Speter 146772Speter if ( ! opt('g') ) { 147772Speter return; 148772Speter } 149826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); 150772Speter } 151772Speter 152772Speter /* 153772Speter * functions 154772Speter */ 155*7925Smckusick stabfunc( name , typeclass , line , level ) 156772Speter char *name; 157*7925Smckusick int typeclass; 158772Speter int line; 159772Speter long level; 160772Speter { 161826Speter int type; 162826Speter long i; 1633365Speter char extname[ BUFSIZ ]; 164772Speter 165826Speter /* 166826Speter * for separate compilation 167826Speter */ 168826Speter if ( level == 1 ) { 169*7925Smckusick if ( typeclass == FUNC ) { 170842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 171842Speter , name , N_PC , N_PGFUNC , ABS( line ) ); 172*7925Smckusick } else if ( typeclass == PROC ) { 173842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 174842Speter , name , N_PC , N_PGPROC , ABS( line ) ); 175826Speter } 176772Speter } 177826Speter /* 178826Speter * for sdb 179826Speter */ 180772Speter if ( ! opt('g') ) { 181772Speter return; 182772Speter } 183772Speter putprintf( " .stabs \"" , 1 ); 184772Speter putprintf( NAMEFORMAT , 1 , name ); 1853365Speter sextname( extname , name , level ); 1863365Speter putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname ); 187772Speter } 188772Speter 189772Speter /* 190772Speter * source line numbers 191772Speter */ 192772Speter stabline( line ) 193772Speter int line; 194772Speter { 195772Speter if ( ! opt('g') ) { 196772Speter return; 197772Speter } 198826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 199772Speter } 200772Speter 201772Speter /* 202772Speter * source files 203772Speter */ 204772Speter stabsource( filename ) 205772Speter char *filename; 206772Speter { 207826Speter int label; 208772Speter 209826Speter /* 210826Speter * for separate compilation 211826Speter */ 212842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 213842Speter , filename , N_PC , N_PSO ); 214826Speter /* 215826Speter * for sdb 216826Speter */ 217772Speter if ( ! opt('g') ) { 218772Speter return; 219772Speter } 220826Speter label = getlab(); 221772Speter putprintf( " .stabs \"" , 1 ); 222772Speter putprintf( NAMEFORMAT , 1 , filename ); 223826Speter putprintf( "\",0x%x,0,0," , 1 , N_SO ); 224772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 225772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 226772Speter putprintf( ":" , 0 ); 227772Speter } 228772Speter 229772Speter /* 230772Speter * included files get one or more of these: 231772Speter * one as they are entered by a #include, 232772Speter * and one every time they are returned to by nested #includes 233772Speter */ 234772Speter stabinclude( filename ) 235772Speter char *filename; 236772Speter { 237826Speter int label; 238772Speter 239826Speter /* 240842Speter * for separate compilation 241842Speter */ 242842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 243842Speter , filename , N_PC , N_PSOL ); 244842Speter /* 245826Speter * for sdb 246826Speter */ 247772Speter if ( ! opt('g') ) { 248772Speter return; 249772Speter } 250826Speter label = getlab(); 251772Speter putprintf( " .stabs \"" , 1 ); 252772Speter putprintf( NAMEFORMAT , 1 , filename ); 253826Speter putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 254772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 255772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 256772Speter putprintf( ":" , 0 ); 257772Speter } 258772Speter 259772Speter 260772Speter /* 261772Speter * global Pascal symbols : 262772Speter * labels, types, constants, and external procedure and function names: 263772Speter * These are used by the separate compilation facility 264772Speter * to be able to check for disjoint header files. 265772Speter */ 266772Speter 267826Speter /* 268826Speter * global labels 269826Speter */ 270842Speter stabglabel( label , line ) 271826Speter char *label; 272826Speter int line; 273772Speter { 274772Speter 275842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 276842Speter , label , N_PC , N_PGLABEL , ABS( line ) ); 277772Speter } 278772Speter 279826Speter /* 280826Speter * global constants 281826Speter */ 282842Speter stabgconst( const , line ) 283842Speter char *const; 284826Speter int line; 285772Speter { 286772Speter 287842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 288842Speter , const , N_PC , N_PGCONST , ABS( line ) ); 289772Speter } 290772Speter 291826Speter /* 292826Speter * global types 293826Speter */ 294842Speter stabgtype( type , line ) 295842Speter char *type; 296826Speter int line; 297772Speter { 298772Speter 299842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 300842Speter , type , N_PC , N_PGTYPE , ABS( line ) ); 301772Speter } 302772Speter 303772Speter 304826Speter /* 305826Speter * external functions and procedures 306826Speter */ 307*7925Smckusick stabefunc( name , typeclass , line ) 308826Speter char *name; 309*7925Smckusick int typeclass; 310826Speter int line; 311772Speter { 312826Speter int type; 313772Speter 314*7925Smckusick if ( typeclass == FUNC ) { 315842Speter type = N_PEFUNC; 316*7925Smckusick } else if ( typeclass == PROC ) { 317842Speter type = N_PEPROC; 318826Speter } else { 319826Speter return; 320772Speter } 321842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 322842Speter , name , N_PC , type , ABS( line ) ); 323772Speter } 324772Speter 325772Speter #endif PC 326