1826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*842Speter static char sccsid[] = "@(#)stab.c 1.3 09/04/80"; 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 17*842Speter /* 18*842Speter * additional symbol definition for <stab.h> 19*842Speter * that is used by the separate compilation facility -- 20*842Speter * eventually, <stab.h> should be updated to include this 21*842Speter */ 22772Speter 23*842Speter # 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 /* 32772Speter * variables 33772Speter */ 34826Speter stabvar( name , type , level , offset , length , line ) 35772Speter char *name; 36772Speter int type; 37772Speter int level; 38772Speter int offset; 39772Speter int length; 40826Speter int line; 41772Speter { 42772Speter 43826Speter /* 44826Speter * for separate compilation 45826Speter */ 46826Speter if ( level == 1 ) { 47*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 48*842Speter , name , N_PC , N_PGVAR , ABS( line ) ); 49772Speter } 50826Speter /* 51826Speter * for sdb 52826Speter */ 53772Speter if ( ! opt('g') ) { 54772Speter return; 55772Speter } 56772Speter putprintf( " .stabs \"" , 1 ); 57772Speter putprintf( NAMEFORMAT , 1 , name ); 58772Speter if ( level == 1 ) { 59826Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 60772Speter } else { 61826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , offset ); 62772Speter } 63772Speter putprintf( " .stabs \"" , 1 ); 64772Speter putprintf( NAMEFORMAT , 1 , name ); 65826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 66772Speter 67772Speter } 68772Speter 69772Speter 70772Speter /* 71772Speter * parameters 72772Speter */ 73772Speter stabparam( name , type , offset , length ) 74772Speter char *name; 75772Speter int type; 76772Speter int offset; 77772Speter int length; 78772Speter { 79772Speter 80772Speter if ( ! opt('g') ) { 81772Speter return; 82772Speter } 83772Speter putprintf( " .stabs \"" , 1 ); 84772Speter putprintf( NAMEFORMAT , 1 , name ); 85826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); 86772Speter putprintf( " .stabs \"" , 1 ); 87772Speter putprintf( NAMEFORMAT , 1 , name ); 88826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 89772Speter } 90772Speter 91772Speter /* 92772Speter * fields 93772Speter */ 94772Speter stabfield( name , type , offset , length ) 95772Speter char *name; 96772Speter int type; 97772Speter int offset; 98772Speter int length; 99772Speter { 100772Speter 101772Speter if ( ! opt('g') ) { 102772Speter return; 103772Speter } 104772Speter putprintf( " .stabs \"" , 1 ); 105772Speter putprintf( NAMEFORMAT , 1 , name ); 106826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset ); 107772Speter putprintf( " .stabs \"" , 1 ); 108772Speter putprintf( NAMEFORMAT , 1 , name ); 109826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 110772Speter } 111772Speter 112772Speter /* 113772Speter * left brackets 114772Speter */ 115772Speter stablbrac( level ) 116772Speter int level; 117772Speter { 118772Speter 119772Speter if ( ! opt('g') ) { 120772Speter return; 121772Speter } 122826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); 123772Speter } 124772Speter 125772Speter /* 126772Speter * right brackets 127772Speter */ 128772Speter stabrbrac( level ) 129772Speter int level; 130772Speter { 131772Speter 132772Speter if ( ! opt('g') ) { 133772Speter return; 134772Speter } 135826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); 136772Speter } 137772Speter 138772Speter /* 139772Speter * functions 140772Speter */ 141826Speter stabfunc( name , class , line , level ) 142772Speter char *name; 143826Speter int class; 144772Speter int line; 145772Speter long level; 146772Speter { 147826Speter int type; 148826Speter long i; 149772Speter 150826Speter /* 151826Speter * for separate compilation 152826Speter */ 153826Speter if ( level == 1 ) { 154826Speter if ( class == FUNC ) { 155*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 156*842Speter , name , N_PC , N_PGFUNC , ABS( line ) ); 157826Speter } else if ( class == PROC ) { 158*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 159*842Speter , name , N_PC , N_PGPROC , ABS( line ) ); 160826Speter } 161772Speter } 162826Speter /* 163826Speter * for sdb 164826Speter */ 165772Speter if ( ! opt('g') ) { 166772Speter return; 167772Speter } 168772Speter putprintf( " .stabs \"" , 1 ); 169772Speter putprintf( NAMEFORMAT , 1 , name ); 170826Speter putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line ); 171772Speter for ( i = 1 ; i < level ; i++ ) { 172772Speter putprintf( EXTFORMAT , 1 , enclosing[ i ] ); 173772Speter } 174772Speter putprintf( EXTFORMAT , 0 , name ); 175772Speter } 176772Speter 177772Speter /* 178772Speter * source line numbers 179772Speter */ 180772Speter stabline( line ) 181772Speter int line; 182772Speter { 183772Speter if ( ! opt('g') ) { 184772Speter return; 185772Speter } 186826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 187772Speter } 188772Speter 189772Speter /* 190772Speter * source files 191772Speter */ 192772Speter stabsource( filename ) 193772Speter char *filename; 194772Speter { 195826Speter int label; 196772Speter 197826Speter /* 198826Speter * for separate compilation 199826Speter */ 200*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 201*842Speter , filename , N_PC , N_PSO ); 202826Speter /* 203826Speter * for sdb 204826Speter */ 205772Speter if ( ! opt('g') ) { 206772Speter return; 207772Speter } 208826Speter label = getlab(); 209772Speter putprintf( " .stabs \"" , 1 ); 210772Speter putprintf( NAMEFORMAT , 1 , filename ); 211826Speter putprintf( "\",0x%x,0,0," , 1 , N_SO ); 212772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 213772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 214772Speter putprintf( ":" , 0 ); 215772Speter } 216772Speter 217772Speter /* 218772Speter * included files get one or more of these: 219772Speter * one as they are entered by a #include, 220772Speter * and one every time they are returned to by nested #includes 221772Speter */ 222772Speter stabinclude( filename ) 223772Speter char *filename; 224772Speter { 225826Speter int label; 226772Speter 227826Speter /* 228*842Speter * for separate compilation 229*842Speter */ 230*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0 231*842Speter , filename , N_PC , N_PSOL ); 232*842Speter /* 233826Speter * for sdb 234826Speter */ 235772Speter if ( ! opt('g') ) { 236772Speter return; 237772Speter } 238826Speter label = getlab(); 239772Speter putprintf( " .stabs \"" , 1 ); 240772Speter putprintf( NAMEFORMAT , 1 , filename ); 241826Speter putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 242772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 243772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 244772Speter putprintf( ":" , 0 ); 245772Speter } 246772Speter 247772Speter 248772Speter /* 249772Speter * global Pascal symbols : 250772Speter * labels, types, constants, and external procedure and function names: 251772Speter * These are used by the separate compilation facility 252772Speter * to be able to check for disjoint header files. 253772Speter */ 254772Speter 255826Speter /* 256826Speter * global labels 257826Speter */ 258*842Speter stabglabel( label , line ) 259826Speter char *label; 260826Speter int line; 261772Speter { 262772Speter 263*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 264*842Speter , label , N_PC , N_PGLABEL , ABS( line ) ); 265772Speter } 266772Speter 267826Speter /* 268826Speter * global constants 269826Speter */ 270*842Speter stabgconst( const , line ) 271*842Speter char *const; 272826Speter int line; 273772Speter { 274772Speter 275*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 276*842Speter , const , N_PC , N_PGCONST , ABS( line ) ); 277772Speter } 278772Speter 279826Speter /* 280826Speter * global types 281826Speter */ 282*842Speter stabgtype( type , line ) 283*842Speter char *type; 284826Speter int line; 285772Speter { 286772Speter 287*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 288*842Speter , type , N_PC , N_PGTYPE , ABS( line ) ); 289772Speter } 290772Speter 291772Speter 292826Speter /* 293826Speter * external functions and procedures 294826Speter */ 295826Speter stabefunc( name , class , line ) 296826Speter char *name; 297826Speter int class; 298826Speter int line; 299772Speter { 300826Speter int type; 301772Speter 302826Speter if ( class == FUNC ) { 303*842Speter type = N_PEFUNC; 304826Speter } else if ( class == PROC ) { 305*842Speter type = N_PEPROC; 306826Speter } else { 307826Speter return; 308772Speter } 309*842Speter putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0 310*842Speter , name , N_PC , type , ABS( line ) ); 311772Speter } 312772Speter 313772Speter #endif PC 314