1*772Speter /* Copyright (c) 1979 Regents of the University of California */ 2*772Speter 3*772Speter /* 4*772Speter * procedures to put out sdb symbol table information 5*772Speter * these use the new .stabs, .stabn, and .stabd directives 6*772Speter */ 7*772Speter 8*772Speter static char sccsid[] = "@(#)stab.c 1.1 08/27/80"; 9*772Speter 10*772Speter #include "whoami.h" 11*772Speter #ifdef PC 12*772Speter /* and the rest of the file */ 13*772Speter # include "0.h" 14*772Speter # include <stab.h> 15*772Speter 16*772Speter /* 17*772Speter * here's that ugly name length limit of 8 characters 18*772Speter * until someone fixes sdb. 19*772Speter */ 20*772Speter #define SNAMELENGTH 8 21*772Speter #define SNAMEFORMAT "%.*s" 22*772Speter /* 23*772Speter * the file "p.a.out" has an additional symbol definition for "a.out.h" 24*772Speter * that is used by the separate compilation facility -- 25*772Speter * eventually, "a.out.h" must be updated to include this 26*772Speter */ 27*772Speter 28*772Speter # include "p.a.out.h" 29*772Speter # include "pc.h" 30*772Speter 31*772Speter /* 32*772Speter * variables 33*772Speter */ 34*772Speter stabvar( name , type , level , offset , length ) 35*772Speter char *name; 36*772Speter int type; 37*772Speter int level; 38*772Speter int offset; 39*772Speter int length; 40*772Speter { 41*772Speter char *nullchar; 42*772Speter char *cp; 43*772Speter 44*772Speter /* for separate compilation */ 45*772Speter 46*772Speter if ((level == 1) && (strcmp(name, DISPLAYNAME) != 0)) { 47*772Speter nullchar = name; 48*772Speter while ( *nullchar ) { 49*772Speter nullchar ++; 50*772Speter } 51*772Speter for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) { 52*772Speter putprintf( " .stabs \"" , 1 ); 53*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 54*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PGVAR , 0 ); 55*772Speter } 56*772Speter if ( cp == nullchar ) { 57*772Speter /* 58*772Speter * then the name was exactly a multiple of SNAMELENGTH long, 59*772Speter * and i have to put out a null to terminate it. 60*772Speter */ 61*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 62*772Speter , N_PGVAR, 0 ); 63*772Speter } 64*772Speter } 65*772Speter 66*772Speter /* for sdb */ 67*772Speter if ( ! opt('g') ) { 68*772Speter return; 69*772Speter } 70*772Speter putprintf( " .stabs \"" , 1 ); 71*772Speter putprintf( NAMEFORMAT , 1 , name ); 72*772Speter if ( level == 1 ) { 73*772Speter putprintf( "\",0%o,0,0%o,0" , 0 , N_GSYM , type ); 74*772Speter } else { 75*772Speter putprintf( "\",0%o,0,0%o,%d" , 0 76*772Speter , N_LSYM , type , offset); 77*772Speter } 78*772Speter putprintf( " .stabs \"" , 1 ); 79*772Speter putprintf( NAMEFORMAT , 1 , name ); 80*772Speter putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length ); 81*772Speter 82*772Speter } 83*772Speter 84*772Speter 85*772Speter /* 86*772Speter * parameters 87*772Speter */ 88*772Speter stabparam( name , type , offset , length ) 89*772Speter char *name; 90*772Speter int type; 91*772Speter int offset; 92*772Speter int length; 93*772Speter { 94*772Speter 95*772Speter if ( ! opt('g') ) { 96*772Speter return; 97*772Speter } 98*772Speter putprintf( " .stabs \"" , 1 ); 99*772Speter putprintf( NAMEFORMAT , 1 , name ); 100*772Speter putprintf( "\",0%o,0,0%o,%d" , 0 , N_PSYM , type , offset ); 101*772Speter putprintf( " .stabs \"" , 1 ); 102*772Speter putprintf( NAMEFORMAT , 1 , name ); 103*772Speter putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length ); 104*772Speter } 105*772Speter 106*772Speter /* 107*772Speter * fields 108*772Speter */ 109*772Speter stabfield( name , type , offset , length ) 110*772Speter char *name; 111*772Speter int type; 112*772Speter int offset; 113*772Speter int length; 114*772Speter { 115*772Speter 116*772Speter if ( ! opt('g') ) { 117*772Speter return; 118*772Speter } 119*772Speter putprintf( " .stabs \"" , 1 ); 120*772Speter putprintf( NAMEFORMAT , 1 , name ); 121*772Speter putprintf( "\",0%o,0,0%o,%d" , 0 , N_SSYM , type , offset ); 122*772Speter putprintf( " .stabs \"" , 1 ); 123*772Speter putprintf( NAMEFORMAT , 1 , name ); 124*772Speter putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length ); 125*772Speter } 126*772Speter 127*772Speter /* 128*772Speter * left brackets 129*772Speter */ 130*772Speter stablbrac( level ) 131*772Speter int level; 132*772Speter { 133*772Speter 134*772Speter if ( ! opt('g') ) { 135*772Speter return; 136*772Speter } 137*772Speter putprintf( " .stabd 0%o,0,%d" , 0 , N_LBRAC , level ); 138*772Speter } 139*772Speter 140*772Speter /* 141*772Speter * right brackets 142*772Speter */ 143*772Speter stabrbrac( level ) 144*772Speter int level; 145*772Speter { 146*772Speter 147*772Speter if ( ! opt('g') ) { 148*772Speter return; 149*772Speter } 150*772Speter putprintf( " .stabd 0%o,0,%d" , 0 , N_RBRAC , level ); 151*772Speter } 152*772Speter 153*772Speter /* 154*772Speter * functions 155*772Speter */ 156*772Speter stabfunc( name , line , level ) 157*772Speter char *name; 158*772Speter int line; 159*772Speter long level; 160*772Speter { 161*772Speter 162*772Speter char *nullchar; 163*772Speter char *cp; 164*772Speter int i; 165*772Speter 166*772Speter /* 167*772Speter * for separate compilation 168*772Speter */ 169*772Speter nullchar = name; 170*772Speter while ( *nullchar ) { 171*772Speter nullchar ++; 172*772Speter } 173*772Speter for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) { 174*772Speter putprintf( " .stabs \"" , 1 ); 175*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 176*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PFUN , 0 ); 177*772Speter } 178*772Speter if ( cp == nullchar ) { 179*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PFUN, 0 ); 180*772Speter } 181*772Speter 182*772Speter /* for sdb */ 183*772Speter if ( ! opt('g') ) { 184*772Speter return; 185*772Speter } 186*772Speter putprintf( " .stabs \"" , 1 ); 187*772Speter putprintf( NAMEFORMAT , 1 , name ); 188*772Speter putprintf( "\",0%o,0,%d," , 1 , N_FUN , line ); 189*772Speter for ( i = 1 ; i < level ; i++ ) { 190*772Speter putprintf( EXTFORMAT , 1 , enclosing[ i ] ); 191*772Speter } 192*772Speter putprintf( EXTFORMAT , 0 , name ); 193*772Speter } 194*772Speter 195*772Speter /* 196*772Speter * source line numbers 197*772Speter */ 198*772Speter stabline( line ) 199*772Speter int line; 200*772Speter { 201*772Speter if ( ! opt('g') ) { 202*772Speter return; 203*772Speter } 204*772Speter if ( line < 0 ) { 205*772Speter /* 206*772Speter * line numbers get to be negative if there was an error. 207*772Speter */ 208*772Speter line = -line; 209*772Speter } 210*772Speter 211*772Speter putprintf( " .stabd 0%o,0,%d" , 0 , N_SLINE , line ); 212*772Speter } 213*772Speter 214*772Speter /* 215*772Speter * source files 216*772Speter */ 217*772Speter stabsource( filename ) 218*772Speter char *filename; 219*772Speter { 220*772Speter int label = getlab(); 221*772Speter char *nullchar; 222*772Speter char *cp; 223*772Speter 224*772Speter nullchar = filename; 225*772Speter while ( *nullchar ) { 226*772Speter nullchar ++; 227*772Speter } 228*772Speter for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) { 229*772Speter putprintf( " .stabs \"" , 1 ); 230*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 231*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PSO , 0 ); 232*772Speter } 233*772Speter if ( cp == nullchar ) { 234*772Speter /* 235*772Speter * then the name was exactly a multiple of SNAMELENGTH long, 236*772Speter */ 237*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PSO, 0 ); 238*772Speter } 239*772Speter 240*772Speter /* for sdb */ 241*772Speter if ( ! opt('g') ) { 242*772Speter return; 243*772Speter } 244*772Speter putprintf( " .stabs \"" , 1 ); 245*772Speter putprintf( NAMEFORMAT , 1 , filename ); 246*772Speter putprintf( "\",0%o,0,0," , 1 , N_SO ); 247*772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 248*772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 249*772Speter putprintf( ":" , 0 ); 250*772Speter } 251*772Speter 252*772Speter /* 253*772Speter * included files get one or more of these: 254*772Speter * one as they are entered by a #include, 255*772Speter * and one every time they are returned to by nested #includes 256*772Speter */ 257*772Speter stabinclude( filename ) 258*772Speter char *filename; 259*772Speter { 260*772Speter int label = getlab(); 261*772Speter char *nullchar; 262*772Speter char *cp; 263*772Speter 264*772Speter nullchar = filename; 265*772Speter while ( *nullchar ) { 266*772Speter nullchar ++; 267*772Speter } 268*772Speter for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) { 269*772Speter putprintf( " .stabs \"" , 1 ); 270*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 271*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PSOL , 0 ); 272*772Speter } 273*772Speter if ( cp == nullchar ) { 274*772Speter /* 275*772Speter * then the name was exactly a multiple of SNAMELENGTH long, 276*772Speter */ 277*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PSOL, 0 ); 278*772Speter } 279*772Speter 280*772Speter /* for sdb */ 281*772Speter if ( ! opt('g') ) { 282*772Speter return; 283*772Speter } 284*772Speter putprintf( " .stabs \"" , 1 ); 285*772Speter putprintf( NAMEFORMAT , 1 , filename ); 286*772Speter putprintf( "\",0%o,0,0," , 1 , N_SOL ); 287*772Speter putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label ); 288*772Speter putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label ); 289*772Speter putprintf( ":" , 0 ); 290*772Speter } 291*772Speter 292*772Speter 293*772Speter /* 294*772Speter * global Pascal symbols : 295*772Speter * labels, types, constants, and external procedure and function names: 296*772Speter * These are used by the separate compilation facility 297*772Speter * to be able to check for disjoint header files. 298*772Speter * New symbol codes : (N_PGVAR, N_PFUN defined above), 299*772Speter * N_PGLAB, N_PGCON, N_PGTYP 300*772Speter * and N_PEFUN are defined for these additional global Pascal 301*772Speter * symbols in p.a.out.h so that 302*772Speter * they can be ignored by "sdb". The only information 303*772Speter * put out for constants and types is their names. 304*772Speter * For labels, the integer label is put out. For external functions 305*772Speter * and procedures, the name of the function or procedure is put out. 306*772Speter */ 307*772Speter 308*772Speter /* global constants */ 309*772Speter stabcname( name ) 310*772Speter char *name; 311*772Speter 312*772Speter { 313*772Speter char *nullchar; 314*772Speter char *cp; 315*772Speter 316*772Speter nullchar = name; 317*772Speter while ( *nullchar ) { 318*772Speter nullchar ++; 319*772Speter } 320*772Speter for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) { 321*772Speter putprintf( " .stabs \"" , 1 ); 322*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 323*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PGCON , 0 ); 324*772Speter } 325*772Speter if ( cp == nullchar ) { 326*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PGCON, 0 ); 327*772Speter } 328*772Speter 329*772Speter } 330*772Speter 331*772Speter /* global types */ 332*772Speter stabtname( name ) 333*772Speter char *name; 334*772Speter 335*772Speter { 336*772Speter char *nullchar; 337*772Speter char *cp; 338*772Speter 339*772Speter nullchar = name; 340*772Speter while ( *nullchar ) { 341*772Speter nullchar ++; 342*772Speter } 343*772Speter for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) { 344*772Speter putprintf( " .stabs \"" , 1 ); 345*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 346*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PGTYP , 0 ); 347*772Speter } 348*772Speter if ( cp == nullchar ) { 349*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PGTYP, 0 ); 350*772Speter } 351*772Speter } 352*772Speter 353*772Speter /* global labels */ 354*772Speter stabglab( label ) 355*772Speter int label; 356*772Speter 357*772Speter { 358*772Speter 359*772Speter putprintf( " .stabs \"" , 1 ); 360*772Speter putprintf( PREFIXFORMAT , 1 , PLABELPREFIX , label ); 361*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PGLAB , 0 ); 362*772Speter } 363*772Speter 364*772Speter 365*772Speter /* external functions and procedures */ 366*772Speter stabefunc( name , line ) 367*772Speter char *name; 368*772Speter int line; 369*772Speter { 370*772Speter 371*772Speter char *nullchar; 372*772Speter char *cp; 373*772Speter 374*772Speter nullchar = name; 375*772Speter while ( *nullchar ) { 376*772Speter nullchar ++; 377*772Speter } 378*772Speter for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) { 379*772Speter putprintf( " .stabs \"" , 1 ); 380*772Speter putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp ); 381*772Speter putprintf( "\",0%o,0,0,0" , 0 , N_PEFUN , 0 ); 382*772Speter } 383*772Speter if ( cp == nullchar ) { 384*772Speter putprintf( " .stabn 0%o,0,0,0" , 0 , N_PEFUN, 0 ); 385*772Speter } 386*772Speter } 387*772Speter 388*772Speter #endif PC 389*772Speter 390*772Speter 391