xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 2164)
1826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*2164Speter static	char sccsid[] = "@(#)stab.c 1.5 01/15/81";
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     /*
32*2164Speter      *	global variables
33772Speter      */
34*2164Speter 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 	     */
45*2164Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
46*2164Speter 		    , 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 );
55*2164Speter 	putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
56*2164Speter 	putprintf( "	.stabs	\"" , 1 );
57*2164Speter 	putprintf( NAMEFORMAT , 1 , name );
58*2164Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
59*2164Speter }
60*2164Speter 
61*2164Speter     /*
62*2164Speter      *	local variables
63*2164Speter      */
64*2164Speter stablvar( name , type , level , offset , length )
65*2164Speter     char	*name;
66*2164Speter     int		type;
67*2164Speter     int		level;
68*2164Speter     int		offset;
69*2164Speter     int		length;
70*2164Speter     {
71*2164Speter 
72*2164Speter 	if ( ! opt('g') ) {
73*2164Speter 		return;
74772Speter 	}
75772Speter 	putprintf( "	.stabs	\"" , 1 );
76772Speter 	putprintf( NAMEFORMAT , 1 , name );
77*2164Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset );
78*2164Speter 	putprintf( "	.stabs	\"" , 1 );
79*2164Speter 	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      */
155826Speter stabfunc( name , class , line , level )
156772Speter     char	*name;
157826Speter     int		class;
158772Speter     int		line;
159772Speter     long	level;
160772Speter     {
161826Speter 	int	type;
162826Speter 	long	i;
163772Speter 
164826Speter 	    /*
165826Speter 	     *	for separate compilation
166826Speter 	     */
167826Speter 	if ( level == 1 ) {
168826Speter 	    if ( class == FUNC ) {
169842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
170842Speter 			    , name , N_PC , N_PGFUNC , ABS( line ) );
171826Speter 	    } else if ( class == PROC ) {
172842Speter 		putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
173842Speter 			    , name , N_PC , N_PGPROC , ABS( line ) );
174826Speter 	    }
175772Speter 	}
176826Speter 	    /*
177826Speter 	     *	for sdb
178826Speter 	     */
179772Speter 	if ( ! opt('g') ) {
180772Speter 		return;
181772Speter 	}
182772Speter 	putprintf( "	.stabs	\"" , 1 );
183772Speter 	putprintf( NAMEFORMAT , 1 , name );
184826Speter 	putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line );
185772Speter 	for ( i = 1 ; i < level ; i++ ) {
186772Speter 	    putprintf( EXTFORMAT , 1 , enclosing[ i ] );
187772Speter 	}
188772Speter 	putprintf( EXTFORMAT , 0 , name );
189772Speter     }
190772Speter 
191772Speter     /*
192772Speter      *	source line numbers
193772Speter      */
194772Speter stabline( line )
195772Speter     int	line;
196772Speter     {
197772Speter 	if ( ! opt('g') ) {
198772Speter 		return;
199772Speter 	}
200826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
201772Speter     }
202772Speter 
203772Speter     /*
204772Speter      *	source files
205772Speter      */
206772Speter stabsource( filename )
207772Speter     char	*filename;
208772Speter     {
209826Speter 	int	label;
210772Speter 
211826Speter 	    /*
212826Speter 	     *	for separate compilation
213826Speter 	     */
214842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
215842Speter 		    , filename , N_PC , N_PSO );
216826Speter 	    /*
217826Speter 	     *	for sdb
218826Speter 	     */
219772Speter 	if ( ! opt('g') ) {
220772Speter 		return;
221772Speter 	}
222826Speter 	label = getlab();
223772Speter 	putprintf( "	.stabs	\"" , 1 );
224772Speter 	putprintf( NAMEFORMAT , 1 , filename );
225826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
226772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
227772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
228772Speter 	putprintf( ":" , 0 );
229772Speter     }
230772Speter 
231772Speter     /*
232772Speter      *	included files get one or more of these:
233772Speter      *	one as they are entered by a #include,
234772Speter      *	and one every time they are returned to by nested #includes
235772Speter      */
236772Speter stabinclude( filename )
237772Speter     char	*filename;
238772Speter     {
239826Speter 	int	label;
240772Speter 
241826Speter 	    /*
242842Speter 	     *	for separate compilation
243842Speter 	     */
244842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0" , 0
245842Speter 		    , filename , N_PC , N_PSOL );
246842Speter 	    /*
247826Speter 	     *	for sdb
248826Speter 	     */
249772Speter 	if ( ! opt('g') ) {
250772Speter 		return;
251772Speter 	}
252826Speter 	label = getlab();
253772Speter 	putprintf( "	.stabs	\"" , 1 );
254772Speter 	putprintf( NAMEFORMAT , 1 , filename );
255826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
256772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
257772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
258772Speter 	putprintf( ":" , 0 );
259772Speter     }
260772Speter 
261772Speter 
262772Speter /*
263772Speter  * global Pascal symbols :
264772Speter  *   labels, types, constants, and external procedure and function names:
265772Speter  *   These are used by the separate compilation facility
266772Speter  *   to be able to check for disjoint header files.
267772Speter  */
268772Speter 
269826Speter     /*
270826Speter      *	global labels
271826Speter      */
272842Speter stabglabel( label , line )
273826Speter     char	*label;
274826Speter     int		line;
275772Speter     {
276772Speter 
277842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
278842Speter 		    , label , N_PC , N_PGLABEL , ABS( line ) );
279772Speter     }
280772Speter 
281826Speter     /*
282826Speter      *	global constants
283826Speter      */
284842Speter stabgconst( const , line )
285842Speter     char	*const;
286826Speter     int		line;
287772Speter     {
288772Speter 
289842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
290842Speter 			, const , N_PC , N_PGCONST , ABS( line ) );
291772Speter     }
292772Speter 
293826Speter     /*
294826Speter      *	global types
295826Speter      */
296842Speter stabgtype( type , line )
297842Speter     char	*type;
298826Speter     int		line;
299772Speter     {
300772Speter 
301842Speter 	    putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
302842Speter 			, type , N_PC , N_PGTYPE , ABS( line ) );
303772Speter     }
304772Speter 
305772Speter 
306826Speter     /*
307826Speter      *	external functions and procedures
308826Speter      */
309826Speter stabefunc( name , class , line )
310826Speter     char	*name;
311826Speter     int		class;
312826Speter     int		line;
313772Speter     {
314826Speter 	int	type;
315772Speter 
316826Speter 	if ( class == FUNC ) {
317842Speter 	    type = N_PEFUNC;
318826Speter 	} else if ( class == PROC ) {
319842Speter 	    type = N_PEPROC;
320826Speter 	} else {
321826Speter 	    return;
322772Speter 	}
323842Speter 	putprintf( "	.stabs	\"%s\",0x%x,0,0x%x,0x%x" , 0
324842Speter 		    , name , N_PC , type , ABS( line ) );
325772Speter     }
326772Speter 
327772Speter #endif PC
328