xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 15942)
1826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*15942Smckusick #ifndef lint
4*15942Smckusick static	char sccsid[] = "@(#)stab.c 1.8.1.1 02/04/84";
5*15942Smckusick #endif
6826Speter 
7772Speter     /*
8826Speter      *	procedures to put out sdb symbol table information.
9826Speter      *	and stabs for separate compilation type checking.
10826Speter      *	these use the new .stabs, .stabn, and .stabd directives
11772Speter      */
12772Speter 
13772Speter #include	"whoami.h"
14772Speter #ifdef	PC
15772Speter     /*	and the rest of the file */
16772Speter #   include	"0.h"
1710649Speter #   include	"objfmt.h"
18772Speter #   include	<stab.h>
19772Speter 
20842Speter     /*
21842Speter      *  additional symbol definition for <stab.h>
22842Speter      *	that is used by the separate compilation facility --
23842Speter      *	eventually, <stab.h> should be updated to include this
24842Speter      */
25772Speter 
26842Speter #   include	"pstab.h"
27772Speter #   include	"pc.h"
28772Speter 
29772Speter     /*
30826Speter      *	absolute value: line numbers are negative if error recovery.
31826Speter      */
32826Speter #define	ABS( x )	( x < 0 ? -x : x )
33826Speter 
34826Speter     /*
352164Speter      *	global variables
36772Speter      */
37*15942Smckusick /*ARGSUSED*/
382164Speter stabgvar( name , type , offset , length , line )
39772Speter     char	*name;
40772Speter     int		type;
41772Speter     int		offset;
42772Speter     int		length;
43826Speter     int		line;
44772Speter     {
45772Speter 
46826Speter 	    /*
47826Speter 	     *	for separate compilation
48826Speter 	     */
492164Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
50*15942Smckusick 		    , (int) name , N_PC , N_PGVAR , ABS( line ) );
51826Speter 	    /*
52826Speter 	     *	for sdb
53826Speter 	     */
54772Speter 	if ( ! opt('g') ) {
55772Speter 		return;
56772Speter 	}
57772Speter 	putprintf( "	.stabs	\"" , 1 );
58*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
592164Speter 	putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
602164Speter 	putprintf( "	.stabs	\"" , 1 );
61*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
622164Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
632164Speter }
642164Speter 
652164Speter     /*
662164Speter      *	local variables
672164Speter      */
68*15942Smckusick /*ARGSUSED*/
692164Speter stablvar( name , type , level , offset , length )
702164Speter     char	*name;
712164Speter     int		type;
722164Speter     int		level;
732164Speter     int		offset;
742164Speter     int		length;
752164Speter     {
762164Speter 
772164Speter 	if ( ! opt('g') ) {
782164Speter 		return;
79772Speter 	}
80772Speter 	putprintf( "	.stabs	\"" , 1 );
81*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
822164Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset );
832164Speter 	putprintf( "	.stabs	\"" , 1 );
84*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
85826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
86772Speter }
87772Speter 
88772Speter 
89772Speter     /*
90772Speter      *	parameters
91772Speter      */
92772Speter stabparam( name , type , offset , length )
93772Speter     char	*name;
94772Speter     int		type;
95772Speter     int		offset;
96772Speter     int		length;
97772Speter     {
98772Speter 
99772Speter 	if ( ! opt('g') ) {
100772Speter 		return;
101772Speter 	}
102772Speter 	putprintf( "	.stabs	\"" , 1 );
103*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
104826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
105772Speter 	putprintf( "	.stabs	\"" , 1 );
106*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
107826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
108772Speter     }
109772Speter 
110772Speter     /*
111772Speter      *	fields
112772Speter      */
113772Speter 
114772Speter     /*
115772Speter      *	left brackets
116772Speter      */
117772Speter stablbrac( level )
118772Speter     int	level;
119772Speter     {
120772Speter 
121772Speter 	if ( ! opt('g') ) {
122772Speter 		return;
123772Speter 	}
124826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_LBRAC , level );
125772Speter     }
126772Speter 
127772Speter     /*
128772Speter      *	right brackets
129772Speter      */
130772Speter stabrbrac( level )
131772Speter     int	level;
132772Speter     {
133772Speter 
134772Speter 	if ( ! opt('g') ) {
135772Speter 		return;
136772Speter 	}
137826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_RBRAC , level );
138772Speter     }
139772Speter 
140772Speter     /*
141772Speter      *	functions
142772Speter      */
1437925Smckusick stabfunc( name , typeclass , line , level )
144772Speter     char	*name;
1457925Smckusick     int		typeclass;
146772Speter     int		line;
147772Speter     long	level;
148772Speter     {
1493365Speter 	char	extname[ BUFSIZ ];
150772Speter 
151826Speter 	    /*
152826Speter 	     *	for separate compilation
153826Speter 	     */
154826Speter 	if ( level == 1 ) {
1557925Smckusick 	    if ( typeclass == FUNC ) {
156842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
157*15942Smckusick 			    , (int) name , N_PC , N_PGFUNC , ABS( line ) );
1587925Smckusick 	    } else if ( typeclass == PROC ) {
159842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
160*15942Smckusick 			    , (int) name , N_PC , N_PGPROC , ABS( line ) );
161826Speter 	    }
162772Speter 	}
163826Speter 	    /*
164826Speter 	     *	for sdb
165826Speter 	     */
166772Speter 	if ( ! opt('g') ) {
167772Speter 		return;
168772Speter 	}
169772Speter 	putprintf( "	.stabs	\"" , 1 );
170*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) name );
171*15942Smckusick 	sextname( extname , name , (int) level );
172*15942Smckusick 	putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , (int) extname );
173772Speter     }
174772Speter 
175772Speter     /*
176772Speter      *	source line numbers
177772Speter      */
178772Speter stabline( line )
179772Speter     int	line;
180772Speter     {
181772Speter 	if ( ! opt('g') ) {
182772Speter 		return;
183772Speter 	}
184826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
185772Speter     }
186772Speter 
187772Speter     /*
188772Speter      *	source files
189772Speter      */
190*15942Smckusick stabsource( filename )
191772Speter     char	*filename;
192*15942Smckusick     {
193*15942Smckusick 	int	label;
194*15942Smckusick 
195*15942Smckusick 	    /*
196*15942Smckusick 	     *	for separate compilation
197*15942Smckusick 	     */
198*15942Smckusick 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
199*15942Smckusick 		    , (int) filename , N_PC , N_PSO );
200*15942Smckusick 	    /*
201*15942Smckusick 	     *	for sdb
202*15942Smckusick 	     */
203*15942Smckusick 	if ( ! opt('g') ) {
204*15942Smckusick 		return;
205*15942Smckusick 	}
206*15942Smckusick 	label = (int) getlab();
207*15942Smckusick 	putprintf( "	.stabs	\"" , 1 );
208*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) filename );
209*15942Smckusick 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
210*15942Smckusick 	putprintf( PREFIXFORMAT , 0 , (int) LLABELPREFIX , label );
211*15942Smckusick 	putprintf( PREFIXFORMAT , 1 , (int) LLABELPREFIX , label );
212*15942Smckusick 	putprintf( ":" , 0 );
213772Speter     }
214772Speter 
215772Speter     /*
216772Speter      *	included files get one or more of these:
217772Speter      *	one as they are entered by a #include,
218*15942Smckusick      *	and one every time they are returned to by nested #includes
219772Speter      */
220*15942Smckusick stabinclude( filename )
221772Speter     char	*filename;
222*15942Smckusick     {
223*15942Smckusick 	int	label;
224*15942Smckusick 
225*15942Smckusick 	    /*
226*15942Smckusick 	     *	for separate compilation
227*15942Smckusick 	     */
228*15942Smckusick 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
229*15942Smckusick 		    , (int) filename , N_PC , N_PSOL );
230*15942Smckusick 	    /*
231*15942Smckusick 	     *	for sdb
232*15942Smckusick 	     */
233*15942Smckusick 	if ( ! opt('g') ) {
234*15942Smckusick 		return;
235*15942Smckusick 	}
236*15942Smckusick 	label = (int) getlab();
237*15942Smckusick 	putprintf( "	.stabs	\"" , 1 );
238*15942Smckusick 	putprintf( NAMEFORMAT , 1 , (int) filename );
239*15942Smckusick 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
240*15942Smckusick 	putprintf( PREFIXFORMAT , 0 , (int) LLABELPREFIX , label );
241*15942Smckusick 	putprintf( PREFIXFORMAT , 1 , (int) LLABELPREFIX , label );
242*15942Smckusick 	putprintf( ":" , 0 );
24314128Speter     }
24414128Speter 
24514128Speter 
246772Speter /*
247772Speter  * global Pascal symbols :
248772Speter  *   labels, types, constants, and external procedure and function names:
249772Speter  *   These are used by the separate compilation facility
250772Speter  *   to be able to check for disjoint header files.
251772Speter  */
252772Speter 
253826Speter     /*
254826Speter      *	global labels
255826Speter      */
256842Speter stabglabel( label , line )
257826Speter     char	*label;
258826Speter     int		line;
259772Speter     {
260772Speter 
261842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
262*15942Smckusick 		    , (int) label , N_PC , N_PGLABEL , ABS( line ) );
263772Speter     }
264772Speter 
265826Speter     /*
266826Speter      *	global constants
267826Speter      */
268842Speter stabgconst( const , line )
269842Speter     char	*const;
270826Speter     int		line;
271772Speter     {
272772Speter 
273842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
274*15942Smckusick 			, (int) const , N_PC , N_PGCONST , ABS( line ) );
275772Speter     }
276772Speter 
277826Speter     /*
278826Speter      *	global types
279826Speter      */
280842Speter stabgtype( type , line )
281842Speter     char	*type;
282826Speter     int		line;
283772Speter     {
284772Speter 
285842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
286*15942Smckusick 			, (int) type , N_PC , N_PGTYPE , ABS( line ) );
287772Speter     }
288772Speter 
289772Speter 
290826Speter     /*
291826Speter      *	external functions and procedures
292826Speter      */
2937925Smckusick stabefunc( name , typeclass , line )
294826Speter     char	*name;
2957925Smckusick     int		typeclass;
296826Speter     int		line;
297772Speter     {
298826Speter 	int	type;
299772Speter 
3007925Smckusick 	if ( typeclass == FUNC ) {
301842Speter 	    type = N_PEFUNC;
3027925Smckusick 	} else if ( typeclass == PROC ) {
303842Speter 	    type = N_PEPROC;
304826Speter 	} else {
305826Speter 	    return;
306772Speter 	}
307842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
308*15942Smckusick 		    , (int) name , N_PC , type , ABS( line ) );
309772Speter     }
310772Speter 
311772Speter #endif PC
312