date and time created 80/08/27 19:56:22 by peter
authorPeter B. Kessler <peter@ucbvax.Berkeley.EDU>
Thu, 28 Aug 1980 10:56:22 +0000 (02:56 -0800)
committerPeter B. Kessler <peter@ucbvax.Berkeley.EDU>
Thu, 28 Aug 1980 10:56:22 +0000 (02:56 -0800)
SCCS-vsn: usr.bin/pascal/src/stab.c 1.1

usr/src/usr.bin/pascal/src/stab.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/pascal/src/stab.c b/usr/src/usr.bin/pascal/src/stab.c
new file mode 100644 (file)
index 0000000..493c135
--- /dev/null
@@ -0,0 +1,390 @@
+/* Copyright (c) 1979 Regents of the University of California */
+
+    /*
+     * procedures to put out sdb symbol table information
+     *     these use the new .stabs, .stabn, and .stabd directives
+     */
+
+static char sccsid[] = "@(#)stab.c 1.1 %G%";
+
+#include       "whoami.h"
+#ifdef PC
+    /* and the rest of the file */
+#   include    "0.h"
+#   include    <stab.h>
+
+    /*
+     * here's that ugly name length limit of 8 characters
+     * until someone fixes sdb.
+     */
+#define        SNAMELENGTH     8
+#define        SNAMEFORMAT     "%.*s"
+/*
+ *  the file "p.a.out" has an additional symbol definition for "a.out.h"
+ *     that is used by the separate compilation facility --
+ *     eventually, "a.out.h" must be updated to include this 
+ */
+
+#   include    "p.a.out.h"
+#   include    "pc.h"
+
+    /*
+     * variables
+     */
+stabvar( name , type , level , offset , length )
+    char       *name;
+    int                type;
+    int                level;
+    int                offset;
+    int                length;
+    {
+       char    *nullchar;
+       char    *cp;
+
+       /* for separate compilation */
+
+       if ((level == 1) && (strcmp(name, DISPLAYNAME) != 0)) {
+               nullchar = name;
+               while ( *nullchar ) {
+                       nullchar ++;
+               }
+               for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
+                   putprintf( "        .stabs  \"" , 1 );
+                   putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+                   putprintf( "\",0%o,0,0,0" , 0 , N_PGVAR , 0 );
+               }
+               if ( cp == nullchar ) {
+               /*
+                * then the name was exactly a multiple of SNAMELENGTH long,
+                * and i have to put out a null to terminate it.
+                */
+               putprintf( "    .stabn  0%o,0,0,0" , 0
+                       , N_PGVAR, 0 );
+               }
+       }
+
+       /* for sdb */
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       if ( level == 1 ) {
+               putprintf( "\",0%o,0,0%o,0" , 0 , N_GSYM , type );
+       } else {
+               putprintf( "\",0%o,0,0%o,%d" , 0
+                               , N_LSYM , type , offset);
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
+
+}
+
+
+    /*
+     * parameters
+     */
+stabparam( name , type , offset , length )
+    char       *name;
+    int                type;
+    int                offset;
+    int                length;
+    {
+       
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,0%o,%d" , 0 , N_PSYM , type , offset );
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
+    }
+
+    /*
+     * fields
+     */
+stabfield( name , type , offset , length )
+    char       *name;
+    int                type;
+    int                offset;
+    int                length;
+    {
+       
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,0%o,%d" , 0 , N_SSYM , type , offset );
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
+    }
+
+    /*
+     * left brackets
+     */
+stablbrac( level )
+    int        level;
+    {
+
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabd  0%o,0,%d" , 0 , N_LBRAC , level );
+    }
+
+    /*
+     * right brackets
+     */
+stabrbrac( level )
+    int        level;
+    {
+
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabd  0%o,0,%d" , 0 , N_RBRAC , level );
+    }
+
+    /*
+     * functions
+     */
+stabfunc( name , line , level )
+    char       *name;
+    int                line;
+    long       level;
+    {
+
+       char    *nullchar;
+       char    *cp;
+       int     i;
+
+       /*
+        *      for separate compilation
+        */
+       nullchar = name;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
+               putprintf( "    .stabs  \"" , 1 );
+               putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+               putprintf( "\",0%o,0,0,0" , 0 , N_PFUN , 0 );
+       }
+       if ( cp == nullchar ) {
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PFUN, 0 );
+       }
+
+       /* for sdb */
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , name );
+       putprintf( "\",0%o,0,%d," , 1 , N_FUN , line );
+       for ( i = 1 ; i < level ; i++ ) {
+           putprintf( EXTFORMAT , 1 , enclosing[ i ] );
+       }
+       putprintf( EXTFORMAT , 0 , name );
+    }
+
+    /*
+     * source line numbers
+     */
+stabline( line )
+    int        line;
+    {
+       if ( ! opt('g') ) {
+               return;
+       }
+       if ( line < 0 ) {
+               /*
+                *      line numbers get to be negative if there was an error.
+                */
+           line = -line;
+       }
+       
+       putprintf( "    .stabd  0%o,0,%d" , 0 , N_SLINE , line );
+    }
+
+    /*
+     * source files
+     */
+stabsource( filename )
+    char       *filename;
+    {
+       int     label = getlab();
+       char    *nullchar;
+       char    *cp;
+       
+       nullchar = filename;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) {
+           putprintf( "        .stabs  \"" , 1 );
+           putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+           putprintf( "\",0%o,0,0,0" , 0 , N_PSO , 0 );
+       }
+       if ( cp == nullchar ) {
+       /*
+        * then the name was exactly a multiple of SNAMELENGTH long,
+        */
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PSO, 0 );
+       }
+
+       /* for sdb */
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , filename );
+       putprintf( "\",0%o,0,0," , 1 , N_SO );
+       putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
+       putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
+       putprintf( ":" , 0 );
+    }
+
+    /*
+     * included files get one or more of these:
+     * one as they are entered by a #include,
+     * and one every time they are returned to by nested #includes
+     */
+stabinclude( filename )
+    char       *filename;
+    {
+       int     label = getlab();
+       char    *nullchar;
+       char    *cp;
+       
+       nullchar = filename;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) {
+           putprintf( "        .stabs  \"" , 1 );
+           putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+           putprintf( "\",0%o,0,0,0" , 0 , N_PSOL , 0 );
+       }
+       if ( cp == nullchar ) {
+       /*
+        * then the name was exactly a multiple of SNAMELENGTH long,
+        */
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PSOL, 0 );
+       }
+
+       /* for sdb */
+       if ( ! opt('g') ) {
+               return;
+       }
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( NAMEFORMAT , 1 , filename );
+       putprintf( "\",0%o,0,0," , 1 , N_SOL );
+       putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
+       putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
+       putprintf( ":" , 0 );
+    }
+
+
+/*
+ * global Pascal symbols :
+ *   labels, types, constants, and external procedure and function names:
+ *   These are used by the separate compilation facility
+ *   to be able to check for disjoint header files.
+ *   New symbol codes : (N_PGVAR, N_PFUN defined above),
+ *   N_PGLAB, N_PGCON, N_PGTYP  
+ *   and N_PEFUN are defined for these additional global Pascal        
+ *   symbols in p.a.out.h so that 
+ *   they can be ignored by "sdb".  The only information
+ *   put out for constants and types is their names.
+ *   For labels, the integer label is put out. For external functions
+ *   and procedures, the name of the function or procedure is put out.
+ */
+
+/* global constants */
+stabcname( name )
+    char *name;
+
+    {
+       char    *nullchar;
+       char    *cp;
+
+       nullchar = name;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
+           putprintf( "        .stabs  \"" , 1 );
+           putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+           putprintf( "\",0%o,0,0,0" , 0 , N_PGCON , 0 );
+       }
+       if ( cp == nullchar ) {
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PGCON, 0 );
+       }
+
+    }
+
+/* global types */
+stabtname( name )
+    char *name;
+
+    {
+       char    *nullchar;
+       char    *cp;
+
+       nullchar = name;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
+           putprintf( "        .stabs  \"" , 1 );
+           putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+           putprintf( "\",0%o,0,0,0" , 0 , N_PGTYP , 0 );
+       }
+       if ( cp == nullchar ) {
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PGTYP, 0 );
+       }
+    }
+
+/* global labels */
+stabglab( label )
+    int label;
+
+    {
+
+       putprintf( "    .stabs  \"" , 1 );
+       putprintf( PREFIXFORMAT , 1 , PLABELPREFIX , label );
+       putprintf( "\",0%o,0,0,0" , 0 , N_PGLAB , 0 );
+    }
+
+
+/* external functions and procedures */        
+stabefunc( name , line )
+    char *name;
+    int line;
+    {
+
+       char    *nullchar;
+       char    *cp;
+
+       nullchar = name;
+       while ( *nullchar ) {
+               nullchar ++;
+       }
+       for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
+           putprintf( "        .stabs  \"" , 1 );
+           putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
+           putprintf( "\",0%o,0,0,0" , 0 , N_PEFUN , 0 );
+       }
+       if ( cp == nullchar ) {
+       putprintf( "    .stabn  0%o,0,0,0" , 0 , N_PEFUN, 0 );
+       }
+    }
+
+#endif PC
+
+