1*826Speter /* Copyright (c) 1980 Regents of the University of California */ 2772Speter 3*826Speter static char sccsid[] = "@(#)stab.c 1.2 08/31/80"; 4*826Speter 5772Speter /* 6*826Speter * procedures to put out sdb symbol table information. 7*826Speter * and stabs for separate compilation type checking. 8*826Speter * 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 17772Speter /* 18772Speter * the file "p.a.out" has an additional symbol definition for "a.out.h" 19772Speter * that is used by the separate compilation facility -- 20772Speter * eventually, "a.out.h" must be updated to include this 21772Speter */ 22772Speter 23772Speter # include "p.a.out.h" 24772Speter # include "pc.h" 25772Speter 26772Speter /* 27*826Speter * absolute value: line numbers are negative if error recovery. 28*826Speter */ 29*826Speter #define ABS( x ) ( x < 0 ? -x : x ) 30*826Speter 31*826Speter /* 32772Speter * variables 33772Speter */ 34*826Speter stabvar( name , type , level , offset , length , line ) 35772Speter char *name; 36772Speter int type; 37772Speter int level; 38772Speter int offset; 39772Speter int length; 40*826Speter int line; 41772Speter { 42772Speter 43*826Speter /* 44*826Speter * for separate compilation 45*826Speter */ 46*826Speter if ( level == 1 ) { 47*826Speter putprintf( " .stabs \"" , 1 ); 48*826Speter putprintf( NAMEFORMAT , 1 , name ); 49*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGVAR , ABS( line ) ); 50772Speter } 51*826Speter /* 52*826Speter * for sdb 53*826Speter */ 54772Speter if ( ! opt('g') ) { 55772Speter return; 56772Speter } 57772Speter putprintf( " .stabs \"" , 1 ); 58772Speter putprintf( NAMEFORMAT , 1 , name ); 59772Speter if ( level == 1 ) { 60*826Speter putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type ); 61772Speter } else { 62*826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , offset ); 63772Speter } 64772Speter putprintf( " .stabs \"" , 1 ); 65772Speter putprintf( NAMEFORMAT , 1 , name ); 66*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 67772Speter 68772Speter } 69772Speter 70772Speter 71772Speter /* 72772Speter * parameters 73772Speter */ 74772Speter stabparam( name , type , offset , length ) 75772Speter char *name; 76772Speter int type; 77772Speter int offset; 78772Speter int length; 79772Speter { 80772Speter 81772Speter if ( ! opt('g') ) { 82772Speter return; 83772Speter } 84772Speter putprintf( " .stabs \"" , 1 ); 85772Speter putprintf( NAMEFORMAT , 1 , name ); 86*826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset ); 87772Speter putprintf( " .stabs \"" , 1 ); 88772Speter putprintf( NAMEFORMAT , 1 , name ); 89*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 90772Speter } 91772Speter 92772Speter /* 93772Speter * fields 94772Speter */ 95772Speter stabfield( name , type , offset , length ) 96772Speter char *name; 97772Speter int type; 98772Speter int offset; 99772Speter int length; 100772Speter { 101772Speter 102772Speter if ( ! opt('g') ) { 103772Speter return; 104772Speter } 105772Speter putprintf( " .stabs \"" , 1 ); 106772Speter putprintf( NAMEFORMAT , 1 , name ); 107*826Speter putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset ); 108772Speter putprintf( " .stabs \"" , 1 ); 109772Speter putprintf( NAMEFORMAT , 1 , name ); 110*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length ); 111772Speter } 112772Speter 113772Speter /* 114772Speter * left brackets 115772Speter */ 116772Speter stablbrac( level ) 117772Speter int level; 118772Speter { 119772Speter 120772Speter if ( ! opt('g') ) { 121772Speter return; 122772Speter } 123*826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level ); 124772Speter } 125772Speter 126772Speter /* 127772Speter * right brackets 128772Speter */ 129772Speter stabrbrac( level ) 130772Speter int level; 131772Speter { 132772Speter 133772Speter if ( ! opt('g') ) { 134772Speter return; 135772Speter } 136*826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level ); 137772Speter } 138772Speter 139772Speter /* 140772Speter * functions 141772Speter */ 142*826Speter stabfunc( name , class , line , level ) 143772Speter char *name; 144*826Speter int class; 145772Speter int line; 146772Speter long level; 147772Speter { 148*826Speter int type; 149*826Speter long i; 150772Speter 151*826Speter /* 152*826Speter * for separate compilation 153*826Speter */ 154*826Speter if ( level == 1 ) { 155*826Speter if ( class == FUNC ) { 156772Speter putprintf( " .stabs \"" , 1 ); 157*826Speter putprintf( NAMEFORMAT , 1 , name ); 158*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGFUN , ABS( line ) ); 159*826Speter } else if ( class == PROC ) { 160*826Speter putprintf( " .stabs \"" , 1 ); 161*826Speter putprintf( NAMEFORMAT , 1 , name ); 162*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGPRC , ABS( line ) ); 163*826Speter } 164772Speter } 165*826Speter /* 166*826Speter * for sdb 167*826Speter */ 168772Speter if ( ! opt('g') ) { 169772Speter return; 170772Speter } 171772Speter putprintf( " .stabs \"" , 1 ); 172772Speter putprintf( NAMEFORMAT , 1 , name ); 173*826Speter putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line ); 174772Speter for ( i = 1 ; i < level ; i++ ) { 175772Speter putprintf( EXTFORMAT , 1 , enclosing[ i ] ); 176772Speter } 177772Speter putprintf( EXTFORMAT , 0 , name ); 178772Speter } 179772Speter 180772Speter /* 181772Speter * source line numbers 182772Speter */ 183772Speter stabline( line ) 184772Speter int line; 185772Speter { 186772Speter if ( ! opt('g') ) { 187772Speter return; 188772Speter } 189*826Speter putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) ); 190772Speter } 191772Speter 192772Speter /* 193772Speter * source files 194772Speter */ 195772Speter stabsource( filename ) 196772Speter char *filename; 197772Speter { 198*826Speter int label; 199772Speter 200*826Speter /* 201*826Speter * for separate compilation 202*826Speter */ 203*826Speter putprintf( " .stabs \"" , 1 ); 204*826Speter putprintf( NAMEFORMAT , 1 , filename ); 205*826Speter putprintf( "\",0x%x,0,0,0" , 0 , N_PSO ); 206*826Speter /* 207*826Speter * for sdb 208*826Speter */ 209772Speter if ( ! opt('g') ) { 210772Speter return; 211772Speter } 212*826Speter label = getlab(); 213772Speter putprintf( " .stabs \"" , 1 ); 214772Speter putprintf( NAMEFORMAT , 1 , filename ); 215*826Speter putprintf( "\",0x%x,0,0," , 1 , N_SO ); 216772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 217772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 218772Speter putprintf( ":" , 0 ); 219772Speter } 220772Speter 221772Speter /* 222772Speter * included files get one or more of these: 223772Speter * one as they are entered by a #include, 224772Speter * and one every time they are returned to by nested #includes 225772Speter */ 226772Speter stabinclude( filename ) 227772Speter char *filename; 228772Speter { 229*826Speter int label; 230772Speter 231*826Speter putprintf( " .stabs \"" , 1 ); 232*826Speter putprintf( NAMEFORMAT , 1 , filename ); 233*826Speter putprintf( "\",0x%x,0,0,0" , 0 , N_PSOL ); 234*826Speter /* 235*826Speter * for sdb 236*826Speter */ 237772Speter if ( ! opt('g') ) { 238772Speter return; 239772Speter } 240*826Speter label = getlab(); 241772Speter putprintf( " .stabs \"" , 1 ); 242772Speter putprintf( NAMEFORMAT , 1 , filename ); 243*826Speter putprintf( "\",0x%x,0,0," , 1 , N_SOL ); 244772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 245772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 246772Speter putprintf( ":" , 0 ); 247772Speter } 248772Speter 249772Speter 250772Speter /* 251772Speter * global Pascal symbols : 252772Speter * labels, types, constants, and external procedure and function names: 253772Speter * These are used by the separate compilation facility 254772Speter * to be able to check for disjoint header files. 255772Speter */ 256772Speter 257*826Speter /* 258*826Speter * global labels 259*826Speter */ 260*826Speter stabglab( label , line ) 261*826Speter char *label; 262*826Speter int line; 263772Speter { 264772Speter 265*826Speter putprintf( " .stabs \"" , 1 ); 266*826Speter putprintf( PREFIXFORMAT , 1 , PLABELPREFIX , label ); 267*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGLAB , ABS( line ) ); 268772Speter } 269772Speter 270*826Speter /* 271*826Speter * global constants 272*826Speter */ 273*826Speter stabcname( name , line ) 274*826Speter char *name; 275*826Speter int line; 276772Speter { 277772Speter 278*826Speter putprintf( " .stabs \"" , 1 ); 279*826Speter putprintf( NAMEFORMAT , 1 , name ); 280*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGCON , ABS( line ) ); 281772Speter } 282772Speter 283*826Speter /* 284*826Speter * global types 285*826Speter */ 286*826Speter stabtname( name , line ) 287*826Speter char *name; 288*826Speter int line; 289772Speter { 290772Speter 291772Speter putprintf( " .stabs \"" , 1 ); 292*826Speter putprintf( NAMEFORMAT , 1 , name ); 293*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGTYP , ABS( line ) ); 294772Speter } 295772Speter 296772Speter 297*826Speter /* 298*826Speter * external functions and procedures 299*826Speter */ 300*826Speter stabefunc( name , class , line ) 301*826Speter char *name; 302*826Speter int class; 303*826Speter int line; 304772Speter { 305*826Speter int type; 306772Speter 307*826Speter if ( class == FUNC ) { 308*826Speter type = N_PEFUN; 309*826Speter } else if ( class == PROC ) { 310*826Speter type = N_PEPRC; 311*826Speter } else { 312*826Speter return; 313772Speter } 314*826Speter putprintf( " .stabs \"" , 1 ); 315*826Speter putprintf( NAMEFORMAT , 1 , name ); 316*826Speter putprintf( "\",0x%x,0,0,0x%x" , 0 , type , ABS( line ) ); 317772Speter } 318772Speter 319772Speter #endif PC 320