xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 842)
1826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*842Speter static	char sccsid[] = "@(#)stab.c 1.3 09/04/80";
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 
17*842Speter     /*
18*842Speter      *  additional symbol definition for <stab.h>
19*842Speter      *	that is used by the separate compilation facility --
20*842Speter      *	eventually, <stab.h> should be updated to include this
21*842Speter      */
22772Speter 
23*842Speter #   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     /*
32772Speter      *	variables
33772Speter      */
34826Speter stabvar( name , type , level , offset , length , line )
35772Speter     char	*name;
36772Speter     int		type;
37772Speter     int		level;
38772Speter     int		offset;
39772Speter     int		length;
40826Speter     int		line;
41772Speter     {
42772Speter 
43826Speter 	    /*
44826Speter 	     *	for separate compilation
45826Speter 	     */
46826Speter 	if ( level == 1 ) {
47*842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
48*842Speter 			, name , N_PC , N_PGVAR , ABS( line ) );
49772Speter     	}
50826Speter 	    /*
51826Speter 	     *	for sdb
52826Speter 	     */
53772Speter 	if ( ! opt('g') ) {
54772Speter 		return;
55772Speter 	}
56772Speter 	putprintf( "	.stabs	\"" , 1 );
57772Speter 	putprintf( NAMEFORMAT , 1 , name );
58772Speter 	if ( level == 1 ) {
59826Speter 		putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
60772Speter 	} else {
61826Speter 		putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , offset );
62772Speter 	}
63772Speter 	putprintf( "	.stabs	\"" , 1 );
64772Speter 	putprintf( NAMEFORMAT , 1 , name );
65826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
66772Speter 
67772Speter }
68772Speter 
69772Speter 
70772Speter     /*
71772Speter      *	parameters
72772Speter      */
73772Speter stabparam( name , type , offset , length )
74772Speter     char	*name;
75772Speter     int		type;
76772Speter     int		offset;
77772Speter     int		length;
78772Speter     {
79772Speter 
80772Speter 	if ( ! opt('g') ) {
81772Speter 		return;
82772Speter 	}
83772Speter 	putprintf( "	.stabs	\"" , 1 );
84772Speter 	putprintf( NAMEFORMAT , 1 , name );
85826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
86772Speter 	putprintf( "	.stabs	\"" , 1 );
87772Speter 	putprintf( NAMEFORMAT , 1 , name );
88826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
89772Speter     }
90772Speter 
91772Speter     /*
92772Speter      *	fields
93772Speter      */
94772Speter stabfield( name , type , offset , length )
95772Speter     char	*name;
96772Speter     int		type;
97772Speter     int		offset;
98772Speter     int		length;
99772Speter     {
100772Speter 
101772Speter 	if ( ! opt('g') ) {
102772Speter 		return;
103772Speter 	}
104772Speter 	putprintf( "	.stabs	\"" , 1 );
105772Speter 	putprintf( NAMEFORMAT , 1 , name );
106826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
107772Speter 	putprintf( "	.stabs	\"" , 1 );
108772Speter 	putprintf( NAMEFORMAT , 1 , name );
109826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
110772Speter     }
111772Speter 
112772Speter     /*
113772Speter      *	left brackets
114772Speter      */
115772Speter stablbrac( level )
116772Speter     int	level;
117772Speter     {
118772Speter 
119772Speter 	if ( ! opt('g') ) {
120772Speter 		return;
121772Speter 	}
122826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_LBRAC , level );
123772Speter     }
124772Speter 
125772Speter     /*
126772Speter      *	right brackets
127772Speter      */
128772Speter stabrbrac( level )
129772Speter     int	level;
130772Speter     {
131772Speter 
132772Speter 	if ( ! opt('g') ) {
133772Speter 		return;
134772Speter 	}
135826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_RBRAC , level );
136772Speter     }
137772Speter 
138772Speter     /*
139772Speter      *	functions
140772Speter      */
141826Speter stabfunc( name , class , line , level )
142772Speter     char	*name;
143826Speter     int		class;
144772Speter     int		line;
145772Speter     long	level;
146772Speter     {
147826Speter 	int	type;
148826Speter 	long	i;
149772Speter 
150826Speter 	    /*
151826Speter 	     *	for separate compilation
152826Speter 	     */
153826Speter 	if ( level == 1 ) {
154826Speter 	    if ( class == FUNC ) {
155*842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
156*842Speter 			    , name , N_PC , N_PGFUNC , ABS( line ) );
157826Speter 	    } else if ( class == PROC ) {
158*842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
159*842Speter 			    , name , N_PC , N_PGPROC , ABS( line ) );
160826Speter 	    }
161772Speter 	}
162826Speter 	    /*
163826Speter 	     *	for sdb
164826Speter 	     */
165772Speter 	if ( ! opt('g') ) {
166772Speter 		return;
167772Speter 	}
168772Speter 	putprintf( "	.stabs	\"" , 1 );
169772Speter 	putprintf( NAMEFORMAT , 1 , name );
170826Speter 	putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line );
171772Speter 	for ( i = 1 ; i < level ; i++ ) {
172772Speter 	    putprintf( EXTFORMAT , 1 , enclosing[ i ] );
173772Speter 	}
174772Speter 	putprintf( EXTFORMAT , 0 , name );
175772Speter     }
176772Speter 
177772Speter     /*
178772Speter      *	source line numbers
179772Speter      */
180772Speter stabline( line )
181772Speter     int	line;
182772Speter     {
183772Speter 	if ( ! opt('g') ) {
184772Speter 		return;
185772Speter 	}
186826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
187772Speter     }
188772Speter 
189772Speter     /*
190772Speter      *	source files
191772Speter      */
192772Speter stabsource( filename )
193772Speter     char	*filename;
194772Speter     {
195826Speter 	int	label;
196772Speter 
197826Speter 	    /*
198826Speter 	     *	for separate compilation
199826Speter 	     */
200*842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
201*842Speter 		    , filename , N_PC , N_PSO );
202826Speter 	    /*
203826Speter 	     *	for sdb
204826Speter 	     */
205772Speter 	if ( ! opt('g') ) {
206772Speter 		return;
207772Speter 	}
208826Speter 	label = getlab();
209772Speter 	putprintf( "	.stabs	\"" , 1 );
210772Speter 	putprintf( NAMEFORMAT , 1 , filename );
211826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
212772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
213772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
214772Speter 	putprintf( ":" , 0 );
215772Speter     }
216772Speter 
217772Speter     /*
218772Speter      *	included files get one or more of these:
219772Speter      *	one as they are entered by a #include,
220772Speter      *	and one every time they are returned to by nested #includes
221772Speter      */
222772Speter stabinclude( filename )
223772Speter     char	*filename;
224772Speter     {
225826Speter 	int	label;
226772Speter 
227826Speter 	    /*
228*842Speter 	     *	for separate compilation
229*842Speter 	     */
230*842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
231*842Speter 		    , filename , N_PC , N_PSOL );
232*842Speter 	    /*
233826Speter 	     *	for sdb
234826Speter 	     */
235772Speter 	if ( ! opt('g') ) {
236772Speter 		return;
237772Speter 	}
238826Speter 	label = getlab();
239772Speter 	putprintf( "	.stabs	\"" , 1 );
240772Speter 	putprintf( NAMEFORMAT , 1 , filename );
241826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
242772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
243772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
244772Speter 	putprintf( ":" , 0 );
245772Speter     }
246772Speter 
247772Speter 
248772Speter /*
249772Speter  * global Pascal symbols :
250772Speter  *   labels, types, constants, and external procedure and function names:
251772Speter  *   These are used by the separate compilation facility
252772Speter  *   to be able to check for disjoint header files.
253772Speter  */
254772Speter 
255826Speter     /*
256826Speter      *	global labels
257826Speter      */
258*842Speter stabglabel( label , line )
259826Speter     char	*label;
260826Speter     int		line;
261772Speter     {
262772Speter 
263*842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
264*842Speter 		    , label , N_PC , N_PGLABEL , ABS( line ) );
265772Speter     }
266772Speter 
267826Speter     /*
268826Speter      *	global constants
269826Speter      */
270*842Speter stabgconst( const , line )
271*842Speter     char	*const;
272826Speter     int		line;
273772Speter     {
274772Speter 
275*842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
276*842Speter 			, const , N_PC , N_PGCONST , ABS( line ) );
277772Speter     }
278772Speter 
279826Speter     /*
280826Speter      *	global types
281826Speter      */
282*842Speter stabgtype( type , line )
283*842Speter     char	*type;
284826Speter     int		line;
285772Speter     {
286772Speter 
287*842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
288*842Speter 			, type , N_PC , N_PGTYPE , ABS( line ) );
289772Speter     }
290772Speter 
291772Speter 
292826Speter     /*
293826Speter      *	external functions and procedures
294826Speter      */
295826Speter stabefunc( name , class , line )
296826Speter     char	*name;
297826Speter     int		class;
298826Speter     int		line;
299772Speter     {
300826Speter 	int	type;
301772Speter 
302826Speter 	if ( class == FUNC ) {
303*842Speter 	    type = N_PEFUNC;
304826Speter 	} else if ( class == PROC ) {
305*842Speter 	    type = N_PEPROC;
306826Speter 	} else {
307826Speter 	    return;
308772Speter 	}
309*842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
310*842Speter 		    , name , N_PC , type , ABS( line ) );
311772Speter     }
312772Speter 
313772Speter #endif PC
314