1826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*2164Speter static char sccsid[] = "@(#)stab.c 1.5 01/15/81"; 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 /* 32*2164Speter * global variables 33772Speter */ 34*2164Speter 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 */ 45*2164Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 46*2164Speter , 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 ); 55*2164Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 56*2164Speter putprintf( " .stabs \"" , 1 ); 57*2164Speter putprintf( NAMEFORMAT , 1 , name ); 58*2164Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 59*2164Speter } 60*2164Speter 61*2164Speter /* 62*2164Speter * local variables 63*2164Speter */ 64*2164Speter stablvar( name , type , level , offset , length ) 65*2164Speter char *name; 66*2164Speter int type; 67*2164Speter int level; 68*2164Speter int offset; 69*2164Speter int length; 70*2164Speter { 71*2164Speter 72*2164Speter if ( ! opt('g') ) { 73*2164Speter return; 74772Speter } 75772Speter putprintf( " .stabs \"" , 1 ); 76772Speter putprintf( NAMEFORMAT , 1 , name ); 77*2164Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset ); 78*2164Speter putprintf( " .stabs \"" , 1 ); 79*2164Speter 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 */ 155826Speter stabfunc( name , class , line , level ) 156772Speter char *name; 157826Speter int class; 158772Speter int line; 159772Speter long level; 160772Speter { 161826Speter int type; 162826Speter long i; 163772Speter 164826Speter /* 165826Speter * for separate compilation 166826Speter */ 167826Speter if ( level == 1 ) { 168826Speter if ( class == FUNC ) { 169842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 170842Speter , name , N_PC , N_PGFUNC , ABS( line ) ); 171826Speter } else if ( class == PROC ) { 172842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 173842Speter , name , N_PC , N_PGPROC , ABS( line ) ); 174826Speter } 175772Speter } 176826Speter /* 177826Speter * for sdb 178826Speter */ 179772Speter if ( ! opt('g') ) { 180772Speter return; 181772Speter } 182772Speter putprintf( " .stabs \"" , 1 ); 183772Speter putprintf( NAMEFORMAT , 1 , name ); 184826Speter putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line ); 185772Speter for ( i = 1 ; i < level ; i++ ) { 186772Speter putprintf( EXTFORMAT , 1 , enclosing[ i ] ); 187772Speter } 188772Speter putprintf( EXTFORMAT , 0 , name ); 189772Speter } 190772Speter 191772Speter /* 192772Speter * source line numbers 193772Speter */ 194772Speter stabline( line ) 195772Speter int line; 196772Speter { 197772Speter if ( ! opt('g') ) { 198772Speter return; 199772Speter } 200826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 201772Speter } 202772Speter 203772Speter /* 204772Speter * source files 205772Speter */ 206772Speter stabsource( filename ) 207772Speter char *filename; 208772Speter { 209826Speter int label; 210772Speter 211826Speter /* 212826Speter * for separate compilation 213826Speter */ 214842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 215842Speter , filename , N_PC , N_PSO ); 216826Speter /* 217826Speter * for sdb 218826Speter */ 219772Speter if ( ! opt('g') ) { 220772Speter return; 221772Speter } 222826Speter label = getlab(); 223772Speter putprintf( " .stabs \"" , 1 ); 224772Speter putprintf( NAMEFORMAT , 1 , filename ); 225826Speter putprintf( "\",0x%x,0,0," , 1 , N_SO ); 226772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 227772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 228772Speter putprintf( ":" , 0 ); 229772Speter } 230772Speter 231772Speter /* 232772Speter * included files get one or more of these: 233772Speter * one as they are entered by a #include, 234772Speter * and one every time they are returned to by nested #includes 235772Speter */ 236772Speter stabinclude( filename ) 237772Speter char *filename; 238772Speter { 239826Speter int label; 240772Speter 241826Speter /* 242842Speter * for separate compilation 243842Speter */ 244842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 245842Speter , filename , N_PC , N_PSOL ); 246842Speter /* 247826Speter * for sdb 248826Speter */ 249772Speter if ( ! opt('g') ) { 250772Speter return; 251772Speter } 252826Speter label = getlab(); 253772Speter putprintf( " .stabs \"" , 1 ); 254772Speter putprintf( NAMEFORMAT , 1 , filename ); 255826Speter putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 256772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 257772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 258772Speter putprintf( ":" , 0 ); 259772Speter } 260772Speter 261772Speter 262772Speter /* 263772Speter * global Pascal symbols : 264772Speter * labels, types, constants, and external procedure and function names: 265772Speter * These are used by the separate compilation facility 266772Speter * to be able to check for disjoint header files. 267772Speter */ 268772Speter 269826Speter /* 270826Speter * global labels 271826Speter */ 272842Speter stabglabel( label , line ) 273826Speter char *label; 274826Speter int line; 275772Speter { 276772Speter 277842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 278842Speter , label , N_PC , N_PGLABEL , ABS( line ) ); 279772Speter } 280772Speter 281826Speter /* 282826Speter * global constants 283826Speter */ 284842Speter stabgconst( const , line ) 285842Speter char *const; 286826Speter int line; 287772Speter { 288772Speter 289842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 290842Speter , const , N_PC , N_PGCONST , ABS( line ) ); 291772Speter } 292772Speter 293826Speter /* 294826Speter * global types 295826Speter */ 296842Speter stabgtype( type , line ) 297842Speter char *type; 298826Speter int line; 299772Speter { 300772Speter 301842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 302842Speter , type , N_PC , N_PGTYPE , ABS( line ) ); 303772Speter } 304772Speter 305772Speter 306826Speter /* 307826Speter * external functions and procedures 308826Speter */ 309826Speter stabefunc( name , class , line ) 310826Speter char *name; 311826Speter int class; 312826Speter int line; 313772Speter { 314826Speter int type; 315772Speter 316826Speter if ( class == FUNC ) { 317842Speter type = N_PEFUNC; 318826Speter } else if ( class == PROC ) { 319842Speter type = N_PEPROC; 320826Speter } else { 321826Speter return; 322772Speter } 323842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 324842Speter , name , N_PC , type , ABS( line ) ); 325772Speter } 326772Speter 327772Speter #endif PC 328