xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 826)
1*826Speter /* Copyright (c) 1980 Regents of the University of California */
2772Speter 
3*826Speter static	char sccsid[] = "@(#)stab.c 1.2 08/31/80";
4*826Speter 
5772Speter     /*
6*826Speter      *	procedures to put out sdb symbol table information.
7*826Speter      *	and stabs for separate compilation type checking.
8*826Speter      *	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 
17772Speter /*
18772Speter  *  the file "p.a.out" has an additional symbol definition for "a.out.h"
19772Speter  *	that is used by the separate compilation facility --
20772Speter  *	eventually, "a.out.h" must be updated to include this
21772Speter  */
22772Speter 
23772Speter #   include	"p.a.out.h"
24772Speter #   include	"pc.h"
25772Speter 
26772Speter     /*
27*826Speter      *	absolute value: line numbers are negative if error recovery.
28*826Speter      */
29*826Speter #define	ABS( x )	( x < 0 ? -x : x )
30*826Speter 
31*826Speter     /*
32772Speter      *	variables
33772Speter      */
34*826Speter stabvar( name , type , level , offset , length , line )
35772Speter     char	*name;
36772Speter     int		type;
37772Speter     int		level;
38772Speter     int		offset;
39772Speter     int		length;
40*826Speter     int		line;
41772Speter     {
42772Speter 
43*826Speter 	    /*
44*826Speter 	     *	for separate compilation
45*826Speter 	     */
46*826Speter 	if ( level == 1 ) {
47*826Speter 	    putprintf( "	.stabs	\"" , 1 );
48*826Speter 	    putprintf( NAMEFORMAT , 1 , name );
49*826Speter 	    putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGVAR , ABS( line ) );
50772Speter     	}
51*826Speter 	    /*
52*826Speter 	     *	for sdb
53*826Speter 	     */
54772Speter 	if ( ! opt('g') ) {
55772Speter 		return;
56772Speter 	}
57772Speter 	putprintf( "	.stabs	\"" , 1 );
58772Speter 	putprintf( NAMEFORMAT , 1 , name );
59772Speter 	if ( level == 1 ) {
60*826Speter 		putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
61772Speter 	} else {
62*826Speter 		putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , offset );
63772Speter 	}
64772Speter 	putprintf( "	.stabs	\"" , 1 );
65772Speter 	putprintf( NAMEFORMAT , 1 , name );
66*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
67772Speter 
68772Speter }
69772Speter 
70772Speter 
71772Speter     /*
72772Speter      *	parameters
73772Speter      */
74772Speter stabparam( name , type , offset , length )
75772Speter     char	*name;
76772Speter     int		type;
77772Speter     int		offset;
78772Speter     int		length;
79772Speter     {
80772Speter 
81772Speter 	if ( ! opt('g') ) {
82772Speter 		return;
83772Speter 	}
84772Speter 	putprintf( "	.stabs	\"" , 1 );
85772Speter 	putprintf( NAMEFORMAT , 1 , name );
86*826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
87772Speter 	putprintf( "	.stabs	\"" , 1 );
88772Speter 	putprintf( NAMEFORMAT , 1 , name );
89*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
90772Speter     }
91772Speter 
92772Speter     /*
93772Speter      *	fields
94772Speter      */
95772Speter stabfield( name , type , offset , length )
96772Speter     char	*name;
97772Speter     int		type;
98772Speter     int		offset;
99772Speter     int		length;
100772Speter     {
101772Speter 
102772Speter 	if ( ! opt('g') ) {
103772Speter 		return;
104772Speter 	}
105772Speter 	putprintf( "	.stabs	\"" , 1 );
106772Speter 	putprintf( NAMEFORMAT , 1 , name );
107*826Speter 	putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
108772Speter 	putprintf( "	.stabs	\"" , 1 );
109772Speter 	putprintf( NAMEFORMAT , 1 , name );
110*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
111772Speter     }
112772Speter 
113772Speter     /*
114772Speter      *	left brackets
115772Speter      */
116772Speter stablbrac( level )
117772Speter     int	level;
118772Speter     {
119772Speter 
120772Speter 	if ( ! opt('g') ) {
121772Speter 		return;
122772Speter 	}
123*826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_LBRAC , level );
124772Speter     }
125772Speter 
126772Speter     /*
127772Speter      *	right brackets
128772Speter      */
129772Speter stabrbrac( level )
130772Speter     int	level;
131772Speter     {
132772Speter 
133772Speter 	if ( ! opt('g') ) {
134772Speter 		return;
135772Speter 	}
136*826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_RBRAC , level );
137772Speter     }
138772Speter 
139772Speter     /*
140772Speter      *	functions
141772Speter      */
142*826Speter stabfunc( name , class , line , level )
143772Speter     char	*name;
144*826Speter     int		class;
145772Speter     int		line;
146772Speter     long	level;
147772Speter     {
148*826Speter 	int	type;
149*826Speter 	long	i;
150772Speter 
151*826Speter 	    /*
152*826Speter 	     *	for separate compilation
153*826Speter 	     */
154*826Speter 	if ( level == 1 ) {
155*826Speter 	    if ( class == FUNC ) {
156772Speter 		putprintf( "	.stabs	\"" , 1 );
157*826Speter 		putprintf( NAMEFORMAT , 1 , name );
158*826Speter 		putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGFUN , ABS( line ) );
159*826Speter 	    } else if ( class == PROC ) {
160*826Speter 		putprintf( "	.stabs	\"" , 1 );
161*826Speter 		putprintf( NAMEFORMAT , 1 , name );
162*826Speter 		putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGPRC , ABS( line ) );
163*826Speter 	    }
164772Speter 	}
165*826Speter 	    /*
166*826Speter 	     *	for sdb
167*826Speter 	     */
168772Speter 	if ( ! opt('g') ) {
169772Speter 		return;
170772Speter 	}
171772Speter 	putprintf( "	.stabs	\"" , 1 );
172772Speter 	putprintf( NAMEFORMAT , 1 , name );
173*826Speter 	putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line );
174772Speter 	for ( i = 1 ; i < level ; i++ ) {
175772Speter 	    putprintf( EXTFORMAT , 1 , enclosing[ i ] );
176772Speter 	}
177772Speter 	putprintf( EXTFORMAT , 0 , name );
178772Speter     }
179772Speter 
180772Speter     /*
181772Speter      *	source line numbers
182772Speter      */
183772Speter stabline( line )
184772Speter     int	line;
185772Speter     {
186772Speter 	if ( ! opt('g') ) {
187772Speter 		return;
188772Speter 	}
189*826Speter 	putprintf( "	.stabd	0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
190772Speter     }
191772Speter 
192772Speter     /*
193772Speter      *	source files
194772Speter      */
195772Speter stabsource( filename )
196772Speter     char	*filename;
197772Speter     {
198*826Speter 	int	label;
199772Speter 
200*826Speter 	    /*
201*826Speter 	     *	for separate compilation
202*826Speter 	     */
203*826Speter 	putprintf( "	.stabs	\"" , 1 );
204*826Speter 	putprintf( NAMEFORMAT , 1 , filename );
205*826Speter 	putprintf( "\",0x%x,0,0,0" , 0 , N_PSO );
206*826Speter 	    /*
207*826Speter 	     *	for sdb
208*826Speter 	     */
209772Speter 	if ( ! opt('g') ) {
210772Speter 		return;
211772Speter 	}
212*826Speter 	label = getlab();
213772Speter 	putprintf( "	.stabs	\"" , 1 );
214772Speter 	putprintf( NAMEFORMAT , 1 , filename );
215*826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SO );
216772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
217772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
218772Speter 	putprintf( ":" , 0 );
219772Speter     }
220772Speter 
221772Speter     /*
222772Speter      *	included files get one or more of these:
223772Speter      *	one as they are entered by a #include,
224772Speter      *	and one every time they are returned to by nested #includes
225772Speter      */
226772Speter stabinclude( filename )
227772Speter     char	*filename;
228772Speter     {
229*826Speter 	int	label;
230772Speter 
231*826Speter 	putprintf( "	.stabs	\"" , 1 );
232*826Speter 	putprintf( NAMEFORMAT , 1 , filename );
233*826Speter 	putprintf( "\",0x%x,0,0,0" , 0 , N_PSOL );
234*826Speter 	    /*
235*826Speter 	     *	for sdb
236*826Speter 	     */
237772Speter 	if ( ! opt('g') ) {
238772Speter 		return;
239772Speter 	}
240*826Speter 	label = getlab();
241772Speter 	putprintf( "	.stabs	\"" , 1 );
242772Speter 	putprintf( NAMEFORMAT , 1 , filename );
243*826Speter 	putprintf( "\",0x%x,0,0," , 1 , N_SOL );
244772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
245772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
246772Speter 	putprintf( ":" , 0 );
247772Speter     }
248772Speter 
249772Speter 
250772Speter /*
251772Speter  * global Pascal symbols :
252772Speter  *   labels, types, constants, and external procedure and function names:
253772Speter  *   These are used by the separate compilation facility
254772Speter  *   to be able to check for disjoint header files.
255772Speter  */
256772Speter 
257*826Speter     /*
258*826Speter      *	global labels
259*826Speter      */
260*826Speter stabglab( label , line )
261*826Speter     char	*label;
262*826Speter     int		line;
263772Speter     {
264772Speter 
265*826Speter 	putprintf( "	.stabs	\"" , 1 );
266*826Speter 	putprintf( PREFIXFORMAT , 1 , PLABELPREFIX , label );
267*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGLAB , ABS( line ) );
268772Speter     }
269772Speter 
270*826Speter     /*
271*826Speter      *	global constants
272*826Speter      */
273*826Speter stabcname( name , line )
274*826Speter     char	*name;
275*826Speter     int		line;
276772Speter     {
277772Speter 
278*826Speter 	putprintf( "	.stabs	\"" , 1 );
279*826Speter 	putprintf( NAMEFORMAT , 1 , name );
280*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGCON , ABS( line ) );
281772Speter     }
282772Speter 
283*826Speter     /*
284*826Speter      *	global types
285*826Speter      */
286*826Speter stabtname( name , line )
287*826Speter     char	*name;
288*826Speter     int		line;
289772Speter     {
290772Speter 
291772Speter 	putprintf( "	.stabs	\"" , 1 );
292*826Speter 	putprintf( NAMEFORMAT , 1 , name );
293*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , N_PGTYP , ABS( line ) );
294772Speter     }
295772Speter 
296772Speter 
297*826Speter     /*
298*826Speter      *	external functions and procedures
299*826Speter      */
300*826Speter stabefunc( name , class , line )
301*826Speter     char	*name;
302*826Speter     int		class;
303*826Speter     int		line;
304772Speter     {
305*826Speter 	int	type;
306772Speter 
307*826Speter 	if ( class == FUNC ) {
308*826Speter 	    type = N_PEFUN;
309*826Speter 	} else if ( class == PROC ) {
310*826Speter 	    type = N_PEPRC;
311*826Speter 	} else {
312*826Speter 	    return;
313772Speter 	}
314*826Speter 	putprintf( "	.stabs	\"" , 1 );
315*826Speter 	putprintf( NAMEFORMAT , 1 , name );
316*826Speter 	putprintf( "\",0x%x,0,0,0x%x" , 0 , type , ABS( line ) );
317772Speter     }
318772Speter 
319772Speter #endif PC
320