xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 10649)
1826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*10649Speter static	char sccsid[] = "@(#)stab.c 1.8 02/01/83";
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"
15*10649Speter #   include	"objfmt.h"
16772Speter #   include	<stab.h>
17772Speter 
18842Speter     /*
19842Speter      *  additional symbol definition for <stab.h>
20842Speter      *	that is used by the separate compilation facility --
21842Speter      *	eventually, <stab.h> should be updated to include this
22842Speter      */
23772Speter 
24842Speter #   include	"pstab.h"
25772Speter #   include	"pc.h"
26772Speter 
27772Speter     /*
28826Speter      *	absolute value: line numbers are negative if error recovery.
29826Speter      */
30826Speter #define	ABS( x )	( x < 0 ? -x : x )
31826Speter 
32826Speter     /*
332164Speter      *	global variables
34772Speter      */
352164Speter stabgvar( name , type , offset , length , line )
36772Speter     char	*name;
37772Speter     int		type;
38772Speter     int		offset;
39772Speter     int		length;
40826Speter     int		line;
41772Speter     {
42772Speter 
43826Speter 	    /*
44826Speter 	     *	for separate compilation
45826Speter 	     */
462164Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
472164Speter 		    , name , N_PC , N_PGVAR , ABS( line ) );
48826Speter 	    /*
49826Speter 	     *	for sdb
50826Speter 	     */
51772Speter 	if ( ! opt('g') ) {
52772Speter 		return;
53772Speter 	}
54772Speter 	putprintf( "	.stabs	\"" , 1 );
55772Speter 	putprintf( NAMEFORMAT , 1 , name );
562164Speter 	putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
572164Speter 	putprintf( "	.stabs	\"" , 1 );
582164Speter 	putprintf( NAMEFORMAT , 1 , name );
592164Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
602164Speter }
612164Speter 
622164Speter     /*
632164Speter      *	local variables
642164Speter      */
652164Speter stablvar( name , type , level , offset , length )
662164Speter     char	*name;
672164Speter     int		type;
682164Speter     int		level;
692164Speter     int		offset;
702164Speter     int		length;
712164Speter     {
722164Speter 
732164Speter 	if ( ! opt('g') ) {
742164Speter 		return;
75772Speter 	}
76772Speter 	putprintf( "	.stabs	\"" , 1 );
77772Speter 	putprintf( NAMEFORMAT , 1 , name );
782164Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset );
792164Speter 	putprintf( "	.stabs	\"" , 1 );
802164Speter 	putprintf( NAMEFORMAT , 1 , name );
81826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
82772Speter }
83772Speter 
84772Speter 
85772Speter     /*
86772Speter      *	parameters
87772Speter      */
88772Speter stabparam( name , type , offset , length )
89772Speter     char	*name;
90772Speter     int		type;
91772Speter     int		offset;
92772Speter     int		length;
93772Speter     {
94772Speter 
95772Speter 	if ( ! opt('g') ) {
96772Speter 		return;
97772Speter 	}
98772Speter 	putprintf( "	.stabs	\"" , 1 );
99772Speter 	putprintf( NAMEFORMAT , 1 , name );
100826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
101772Speter 	putprintf( "	.stabs	\"" , 1 );
102772Speter 	putprintf( NAMEFORMAT , 1 , name );
103826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
104772Speter     }
105772Speter 
106772Speter     /*
107772Speter      *	fields
108772Speter      */
109772Speter stabfield( name , type , offset , length )
110772Speter     char	*name;
111772Speter     int		type;
112772Speter     int		offset;
113772Speter     int		length;
114772Speter     {
115772Speter 
116772Speter 	if ( ! opt('g') ) {
117772Speter 		return;
118772Speter 	}
119772Speter 	putprintf( "	.stabs	\"" , 1 );
120772Speter 	putprintf( NAMEFORMAT , 1 , name );
121826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
122772Speter 	putprintf( "	.stabs	\"" , 1 );
123772Speter 	putprintf( NAMEFORMAT , 1 , name );
124826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
125772Speter     }
126772Speter 
127772Speter     /*
128772Speter      *	left brackets
129772Speter      */
130772Speter stablbrac( level )
131772Speter     int	level;
132772Speter     {
133772Speter 
134772Speter 	if ( ! opt('g') ) {
135772Speter 		return;
136772Speter 	}
137826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_LBRAC , level );
138772Speter     }
139772Speter 
140772Speter     /*
141772Speter      *	right brackets
142772Speter      */
143772Speter stabrbrac( level )
144772Speter     int	level;
145772Speter     {
146772Speter 
147772Speter 	if ( ! opt('g') ) {
148772Speter 		return;
149772Speter 	}
150826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_RBRAC , level );
151772Speter     }
152772Speter 
153772Speter     /*
154772Speter      *	functions
155772Speter      */
1567925Smckusick stabfunc( name , typeclass , line , level )
157772Speter     char	*name;
1587925Smckusick     int		typeclass;
159772Speter     int		line;
160772Speter     long	level;
161772Speter     {
162826Speter 	int	type;
163826Speter 	long	i;
1643365Speter 	char	extname[ BUFSIZ ];
165772Speter 
166826Speter 	    /*
167826Speter 	     *	for separate compilation
168826Speter 	     */
169826Speter 	if ( level == 1 ) {
1707925Smckusick 	    if ( typeclass == FUNC ) {
171842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
172842Speter 			    , name , N_PC , N_PGFUNC , ABS( line ) );
1737925Smckusick 	    } else if ( typeclass == PROC ) {
174842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
175842Speter 			    , name , N_PC , N_PGPROC , ABS( line ) );
176826Speter 	    }
177772Speter 	}
178826Speter 	    /*
179826Speter 	     *	for sdb
180826Speter 	     */
181772Speter 	if ( ! opt('g') ) {
182772Speter 		return;
183772Speter 	}
184772Speter 	putprintf( "	.stabs	\"" , 1 );
185772Speter 	putprintf( NAMEFORMAT , 1 , name );
1863365Speter 	sextname( extname , name , level );
1873365Speter 	putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname );
188772Speter     }
189772Speter 
190772Speter     /*
191772Speter      *	source line numbers
192772Speter      */
193772Speter stabline( line )
194772Speter     int	line;
195772Speter     {
196772Speter 	if ( ! opt('g') ) {
197772Speter 		return;
198772Speter 	}
199826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
200772Speter     }
201772Speter 
202772Speter     /*
203772Speter      *	source files
204772Speter      */
205772Speter stabsource( filename )
206772Speter     char	*filename;
207772Speter     {
208826Speter 	int	label;
209772Speter 
210826Speter 	    /*
211826Speter 	     *	for separate compilation
212826Speter 	     */
213842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
214842Speter 		    , filename , N_PC , N_PSO );
215826Speter 	    /*
216826Speter 	     *	for sdb
217826Speter 	     */
218772Speter 	if ( ! opt('g') ) {
219772Speter 		return;
220772Speter 	}
221826Speter 	label = getlab();
222772Speter 	putprintf( "	.stabs	\"" , 1 );
223772Speter 	putprintf( NAMEFORMAT , 1 , filename );
224826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
225772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
226772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
227772Speter 	putprintf( ":" , 0 );
228772Speter     }
229772Speter 
230772Speter     /*
231772Speter      *	included files get one or more of these:
232772Speter      *	one as they are entered by a #include,
233772Speter      *	and one every time they are returned to by nested #includes
234772Speter      */
235772Speter stabinclude( filename )
236772Speter     char	*filename;
237772Speter     {
238826Speter 	int	label;
239772Speter 
240826Speter 	    /*
241842Speter 	     *	for separate compilation
242842Speter 	     */
243842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
244842Speter 		    , filename , N_PC , N_PSOL );
245842Speter 	    /*
246826Speter 	     *	for sdb
247826Speter 	     */
248772Speter 	if ( ! opt('g') ) {
249772Speter 		return;
250772Speter 	}
251826Speter 	label = getlab();
252772Speter 	putprintf( "	.stabs	\"" , 1 );
253772Speter 	putprintf( NAMEFORMAT , 1 , filename );
254826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
255772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
256772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
257772Speter 	putprintf( ":" , 0 );
258772Speter     }
259772Speter 
260772Speter 
261772Speter /*
262772Speter  * global Pascal symbols :
263772Speter  *   labels, types, constants, and external procedure and function names:
264772Speter  *   These are used by the separate compilation facility
265772Speter  *   to be able to check for disjoint header files.
266772Speter  */
267772Speter 
268826Speter     /*
269826Speter      *	global labels
270826Speter      */
271842Speter stabglabel( label , line )
272826Speter     char	*label;
273826Speter     int		line;
274772Speter     {
275772Speter 
276842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
277842Speter 		    , label , N_PC , N_PGLABEL , ABS( line ) );
278772Speter     }
279772Speter 
280826Speter     /*
281826Speter      *	global constants
282826Speter      */
283842Speter stabgconst( const , line )
284842Speter     char	*const;
285826Speter     int		line;
286772Speter     {
287772Speter 
288842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
289842Speter 			, const , N_PC , N_PGCONST , ABS( line ) );
290772Speter     }
291772Speter 
292826Speter     /*
293826Speter      *	global types
294826Speter      */
295842Speter stabgtype( type , line )
296842Speter     char	*type;
297826Speter     int		line;
298772Speter     {
299772Speter 
300842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
301842Speter 			, type , N_PC , N_PGTYPE , ABS( line ) );
302772Speter     }
303772Speter 
304772Speter 
305826Speter     /*
306826Speter      *	external functions and procedures
307826Speter      */
3087925Smckusick stabefunc( name , typeclass , line )
309826Speter     char	*name;
3107925Smckusick     int		typeclass;
311826Speter     int		line;
312772Speter     {
313826Speter 	int	type;
314772Speter 
3157925Smckusick 	if ( typeclass == FUNC ) {
316842Speter 	    type = N_PEFUNC;
3177925Smckusick 	} else if ( typeclass == PROC ) {
318842Speter 	    type = N_PEPROC;
319826Speter 	} else {
320826Speter 	    return;
321772Speter 	}
322842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
323842Speter 		    , name , N_PC , type , ABS( line ) );
324772Speter     }
325772Speter 
326772Speter #endif PC
327