xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 7925)
1826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*7925Smckusick static	char sccsid[] = "@(#)stab.c 1.7 08/27/82";
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"
15772Speter #   include	<stab.h>
16772Speter 
17842Speter     /*
18842Speter      *  additional symbol definition for <stab.h>
19842Speter      *	that is used by the separate compilation facility --
20842Speter      *	eventually, <stab.h> should be updated to include this
21842Speter      */
22772Speter 
23842Speter #   include	"pstab.h"
24772Speter #   include	"pc.h"
25772Speter 
26772Speter     /*
27826Speter      *	absolute value: line numbers are negative if error recovery.
28826Speter      */
29826Speter #define	ABS( x )	( x < 0 ? -x : x )
30826Speter 
31826Speter     /*
322164Speter      *	global variables
33772Speter      */
342164Speter stabgvar( name , type , offset , length , line )
35772Speter     char	*name;
36772Speter     int		type;
37772Speter     int		offset;
38772Speter     int		length;
39826Speter     int		line;
40772Speter     {
41772Speter 
42826Speter 	    /*
43826Speter 	     *	for separate compilation
44826Speter 	     */
452164Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
462164Speter 		    , name , N_PC , N_PGVAR , ABS( line ) );
47826Speter 	    /*
48826Speter 	     *	for sdb
49826Speter 	     */
50772Speter 	if ( ! opt('g') ) {
51772Speter 		return;
52772Speter 	}
53772Speter 	putprintf( "	.stabs	\"" , 1 );
54772Speter 	putprintf( NAMEFORMAT , 1 , name );
552164Speter 	putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
562164Speter 	putprintf( "	.stabs	\"" , 1 );
572164Speter 	putprintf( NAMEFORMAT , 1 , name );
582164Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
592164Speter }
602164Speter 
612164Speter     /*
622164Speter      *	local variables
632164Speter      */
642164Speter stablvar( name , type , level , offset , length )
652164Speter     char	*name;
662164Speter     int		type;
672164Speter     int		level;
682164Speter     int		offset;
692164Speter     int		length;
702164Speter     {
712164Speter 
722164Speter 	if ( ! opt('g') ) {
732164Speter 		return;
74772Speter 	}
75772Speter 	putprintf( "	.stabs	\"" , 1 );
76772Speter 	putprintf( NAMEFORMAT , 1 , name );
772164Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset );
782164Speter 	putprintf( "	.stabs	\"" , 1 );
792164Speter 	putprintf( NAMEFORMAT , 1 , name );
80826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
81772Speter }
82772Speter 
83772Speter 
84772Speter     /*
85772Speter      *	parameters
86772Speter      */
87772Speter stabparam( name , type , offset , length )
88772Speter     char	*name;
89772Speter     int		type;
90772Speter     int		offset;
91772Speter     int		length;
92772Speter     {
93772Speter 
94772Speter 	if ( ! opt('g') ) {
95772Speter 		return;
96772Speter 	}
97772Speter 	putprintf( "	.stabs	\"" , 1 );
98772Speter 	putprintf( NAMEFORMAT , 1 , name );
99826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
100772Speter 	putprintf( "	.stabs	\"" , 1 );
101772Speter 	putprintf( NAMEFORMAT , 1 , name );
102826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
103772Speter     }
104772Speter 
105772Speter     /*
106772Speter      *	fields
107772Speter      */
108772Speter stabfield( name , type , offset , length )
109772Speter     char	*name;
110772Speter     int		type;
111772Speter     int		offset;
112772Speter     int		length;
113772Speter     {
114772Speter 
115772Speter 	if ( ! opt('g') ) {
116772Speter 		return;
117772Speter 	}
118772Speter 	putprintf( "	.stabs	\"" , 1 );
119772Speter 	putprintf( NAMEFORMAT , 1 , name );
120826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
121772Speter 	putprintf( "	.stabs	\"" , 1 );
122772Speter 	putprintf( NAMEFORMAT , 1 , name );
123826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
124772Speter     }
125772Speter 
126772Speter     /*
127772Speter      *	left brackets
128772Speter      */
129772Speter stablbrac( level )
130772Speter     int	level;
131772Speter     {
132772Speter 
133772Speter 	if ( ! opt('g') ) {
134772Speter 		return;
135772Speter 	}
136826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_LBRAC , level );
137772Speter     }
138772Speter 
139772Speter     /*
140772Speter      *	right brackets
141772Speter      */
142772Speter stabrbrac( level )
143772Speter     int	level;
144772Speter     {
145772Speter 
146772Speter 	if ( ! opt('g') ) {
147772Speter 		return;
148772Speter 	}
149826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_RBRAC , level );
150772Speter     }
151772Speter 
152772Speter     /*
153772Speter      *	functions
154772Speter      */
155*7925Smckusick stabfunc( name , typeclass , line , level )
156772Speter     char	*name;
157*7925Smckusick     int		typeclass;
158772Speter     int		line;
159772Speter     long	level;
160772Speter     {
161826Speter 	int	type;
162826Speter 	long	i;
1633365Speter 	char	extname[ BUFSIZ ];
164772Speter 
165826Speter 	    /*
166826Speter 	     *	for separate compilation
167826Speter 	     */
168826Speter 	if ( level == 1 ) {
169*7925Smckusick 	    if ( typeclass == FUNC ) {
170842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
171842Speter 			    , name , N_PC , N_PGFUNC , ABS( line ) );
172*7925Smckusick 	    } else if ( typeclass == PROC ) {
173842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
174842Speter 			    , name , N_PC , N_PGPROC , ABS( line ) );
175826Speter 	    }
176772Speter 	}
177826Speter 	    /*
178826Speter 	     *	for sdb
179826Speter 	     */
180772Speter 	if ( ! opt('g') ) {
181772Speter 		return;
182772Speter 	}
183772Speter 	putprintf( "	.stabs	\"" , 1 );
184772Speter 	putprintf( NAMEFORMAT , 1 , name );
1853365Speter 	sextname( extname , name , level );
1863365Speter 	putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname );
187772Speter     }
188772Speter 
189772Speter     /*
190772Speter      *	source line numbers
191772Speter      */
192772Speter stabline( line )
193772Speter     int	line;
194772Speter     {
195772Speter 	if ( ! opt('g') ) {
196772Speter 		return;
197772Speter 	}
198826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
199772Speter     }
200772Speter 
201772Speter     /*
202772Speter      *	source files
203772Speter      */
204772Speter stabsource( filename )
205772Speter     char	*filename;
206772Speter     {
207826Speter 	int	label;
208772Speter 
209826Speter 	    /*
210826Speter 	     *	for separate compilation
211826Speter 	     */
212842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
213842Speter 		    , filename , N_PC , N_PSO );
214826Speter 	    /*
215826Speter 	     *	for sdb
216826Speter 	     */
217772Speter 	if ( ! opt('g') ) {
218772Speter 		return;
219772Speter 	}
220826Speter 	label = getlab();
221772Speter 	putprintf( "	.stabs	\"" , 1 );
222772Speter 	putprintf( NAMEFORMAT , 1 , filename );
223826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
224772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
225772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
226772Speter 	putprintf( ":" , 0 );
227772Speter     }
228772Speter 
229772Speter     /*
230772Speter      *	included files get one or more of these:
231772Speter      *	one as they are entered by a #include,
232772Speter      *	and one every time they are returned to by nested #includes
233772Speter      */
234772Speter stabinclude( filename )
235772Speter     char	*filename;
236772Speter     {
237826Speter 	int	label;
238772Speter 
239826Speter 	    /*
240842Speter 	     *	for separate compilation
241842Speter 	     */
242842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
243842Speter 		    , filename , N_PC , N_PSOL );
244842Speter 	    /*
245826Speter 	     *	for sdb
246826Speter 	     */
247772Speter 	if ( ! opt('g') ) {
248772Speter 		return;
249772Speter 	}
250826Speter 	label = getlab();
251772Speter 	putprintf( "	.stabs	\"" , 1 );
252772Speter 	putprintf( NAMEFORMAT , 1 , filename );
253826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
254772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
255772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
256772Speter 	putprintf( ":" , 0 );
257772Speter     }
258772Speter 
259772Speter 
260772Speter /*
261772Speter  * global Pascal symbols :
262772Speter  *   labels, types, constants, and external procedure and function names:
263772Speter  *   These are used by the separate compilation facility
264772Speter  *   to be able to check for disjoint header files.
265772Speter  */
266772Speter 
267826Speter     /*
268826Speter      *	global labels
269826Speter      */
270842Speter stabglabel( label , line )
271826Speter     char	*label;
272826Speter     int		line;
273772Speter     {
274772Speter 
275842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
276842Speter 		    , label , N_PC , N_PGLABEL , ABS( line ) );
277772Speter     }
278772Speter 
279826Speter     /*
280826Speter      *	global constants
281826Speter      */
282842Speter stabgconst( const , line )
283842Speter     char	*const;
284826Speter     int		line;
285772Speter     {
286772Speter 
287842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
288842Speter 			, const , N_PC , N_PGCONST , ABS( line ) );
289772Speter     }
290772Speter 
291826Speter     /*
292826Speter      *	global types
293826Speter      */
294842Speter stabgtype( type , line )
295842Speter     char	*type;
296826Speter     int		line;
297772Speter     {
298772Speter 
299842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
300842Speter 			, type , N_PC , N_PGTYPE , ABS( line ) );
301772Speter     }
302772Speter 
303772Speter 
304826Speter     /*
305826Speter      *	external functions and procedures
306826Speter      */
307*7925Smckusick stabefunc( name , typeclass , line )
308826Speter     char	*name;
309*7925Smckusick     int		typeclass;
310826Speter     int		line;
311772Speter     {
312826Speter 	int	type;
313772Speter 
314*7925Smckusick 	if ( typeclass == FUNC ) {
315842Speter 	    type = N_PEFUNC;
316*7925Smckusick 	} else if ( typeclass == PROC ) {
317842Speter 	    type = N_PEPROC;
318826Speter 	} else {
319826Speter 	    return;
320772Speter 	}
321842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
322842Speter 		    , name , N_PC , type , ABS( line ) );
323772Speter     }
324772Speter 
325772Speter #endif PC
326