xref: /csrg-svn/usr.bin/pascal/src/stab.c (revision 772)
1*772Speter /* Copyright (c) 1979 Regents of the University of California */
2*772Speter 
3*772Speter     /*
4*772Speter      *	procedures to put out sdb symbol table information
5*772Speter      *	    these use the new .stabs, .stabn, and .stabd directives
6*772Speter      */
7*772Speter 
8*772Speter static	char sccsid[] = "@(#)stab.c 1.1 08/27/80";
9*772Speter 
10*772Speter #include	"whoami.h"
11*772Speter #ifdef	PC
12*772Speter     /*	and the rest of the file */
13*772Speter #   include	"0.h"
14*772Speter #   include	<stab.h>
15*772Speter 
16*772Speter     /*
17*772Speter      *	here's that ugly name length limit of 8 characters
18*772Speter      *	until someone fixes sdb.
19*772Speter      */
20*772Speter #define	SNAMELENGTH	8
21*772Speter #define	SNAMEFORMAT	"%.*s"
22*772Speter /*
23*772Speter  *  the file "p.a.out" has an additional symbol definition for "a.out.h"
24*772Speter  *	that is used by the separate compilation facility --
25*772Speter  *	eventually, "a.out.h" must be updated to include this
26*772Speter  */
27*772Speter 
28*772Speter #   include	"p.a.out.h"
29*772Speter #   include	"pc.h"
30*772Speter 
31*772Speter     /*
32*772Speter      *	variables
33*772Speter      */
34*772Speter stabvar( name , type , level , offset , length )
35*772Speter     char	*name;
36*772Speter     int		type;
37*772Speter     int		level;
38*772Speter     int		offset;
39*772Speter     int		length;
40*772Speter     {
41*772Speter 	char	*nullchar;
42*772Speter 	char	*cp;
43*772Speter 
44*772Speter 	/* for separate compilation */
45*772Speter 
46*772Speter 	if ((level == 1) && (strcmp(name, DISPLAYNAME) != 0)) {
47*772Speter 		nullchar = name;
48*772Speter 		while ( *nullchar ) {
49*772Speter 	    		nullchar ++;
50*772Speter 		}
51*772Speter 		for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
52*772Speter 		    putprintf( "	.stabs	\"" , 1 );
53*772Speter 		    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
54*772Speter 	    	    putprintf( "\",0%o,0,0,0" , 0 , N_PGVAR , 0 );
55*772Speter 		}
56*772Speter 		if ( cp == nullchar ) {
57*772Speter 		/*
58*772Speter 		 * then the name was exactly a multiple of SNAMELENGTH long,
59*772Speter 		 * and i have to put out a null to terminate it.
60*772Speter 		 */
61*772Speter 	    	putprintf( "	.stabn	0%o,0,0,0" , 0
62*772Speter 			, N_PGVAR, 0 );
63*772Speter 		}
64*772Speter     	}
65*772Speter 
66*772Speter 	/* for sdb */
67*772Speter 	if ( ! opt('g') ) {
68*772Speter 		return;
69*772Speter 	}
70*772Speter 	putprintf( "	.stabs	\"" , 1 );
71*772Speter 	putprintf( NAMEFORMAT , 1 , name );
72*772Speter 	if ( level == 1 ) {
73*772Speter 		putprintf( "\",0%o,0,0%o,0" , 0 , N_GSYM , type );
74*772Speter 	} else {
75*772Speter 		putprintf( "\",0%o,0,0%o,%d" , 0
76*772Speter 				, N_LSYM , type , offset);
77*772Speter 	}
78*772Speter 	putprintf( "	.stabs	\"" , 1 );
79*772Speter 	putprintf( NAMEFORMAT , 1 , name );
80*772Speter 	putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
81*772Speter 
82*772Speter }
83*772Speter 
84*772Speter 
85*772Speter     /*
86*772Speter      *	parameters
87*772Speter      */
88*772Speter stabparam( name , type , offset , length )
89*772Speter     char	*name;
90*772Speter     int		type;
91*772Speter     int		offset;
92*772Speter     int		length;
93*772Speter     {
94*772Speter 
95*772Speter 	if ( ! opt('g') ) {
96*772Speter 		return;
97*772Speter 	}
98*772Speter 	putprintf( "	.stabs	\"" , 1 );
99*772Speter 	putprintf( NAMEFORMAT , 1 , name );
100*772Speter 	putprintf( "\",0%o,0,0%o,%d" , 0 , N_PSYM , type , offset );
101*772Speter 	putprintf( "	.stabs	\"" , 1 );
102*772Speter 	putprintf( NAMEFORMAT , 1 , name );
103*772Speter 	putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
104*772Speter     }
105*772Speter 
106*772Speter     /*
107*772Speter      *	fields
108*772Speter      */
109*772Speter stabfield( name , type , offset , length )
110*772Speter     char	*name;
111*772Speter     int		type;
112*772Speter     int		offset;
113*772Speter     int		length;
114*772Speter     {
115*772Speter 
116*772Speter 	if ( ! opt('g') ) {
117*772Speter 		return;
118*772Speter 	}
119*772Speter 	putprintf( "	.stabs	\"" , 1 );
120*772Speter 	putprintf( NAMEFORMAT , 1 , name );
121*772Speter 	putprintf( "\",0%o,0,0%o,%d" , 0 , N_SSYM , type , offset );
122*772Speter 	putprintf( "	.stabs	\"" , 1 );
123*772Speter 	putprintf( NAMEFORMAT , 1 , name );
124*772Speter 	putprintf( "\",0%o,0,0,0%o" , 0 , N_LENG , length );
125*772Speter     }
126*772Speter 
127*772Speter     /*
128*772Speter      *	left brackets
129*772Speter      */
130*772Speter stablbrac( level )
131*772Speter     int	level;
132*772Speter     {
133*772Speter 
134*772Speter 	if ( ! opt('g') ) {
135*772Speter 		return;
136*772Speter 	}
137*772Speter 	putprintf( "	.stabd	0%o,0,%d" , 0 , N_LBRAC , level );
138*772Speter     }
139*772Speter 
140*772Speter     /*
141*772Speter      *	right brackets
142*772Speter      */
143*772Speter stabrbrac( level )
144*772Speter     int	level;
145*772Speter     {
146*772Speter 
147*772Speter 	if ( ! opt('g') ) {
148*772Speter 		return;
149*772Speter 	}
150*772Speter 	putprintf( "	.stabd	0%o,0,%d" , 0 , N_RBRAC , level );
151*772Speter     }
152*772Speter 
153*772Speter     /*
154*772Speter      *	functions
155*772Speter      */
156*772Speter stabfunc( name , line , level )
157*772Speter     char	*name;
158*772Speter     int		line;
159*772Speter     long	level;
160*772Speter     {
161*772Speter 
162*772Speter 	char	*nullchar;
163*772Speter 	char	*cp;
164*772Speter 	int	i;
165*772Speter 
166*772Speter 	/*
167*772Speter 	 *	for separate compilation
168*772Speter 	 */
169*772Speter 	nullchar = name;
170*772Speter 	while ( *nullchar ) {
171*772Speter 	    	nullchar ++;
172*772Speter 	}
173*772Speter 	for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
174*772Speter 		putprintf( "	.stabs	\"" , 1 );
175*772Speter 		putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
176*772Speter 	    	putprintf( "\",0%o,0,0,0" , 0 , N_PFUN , 0 );
177*772Speter 	}
178*772Speter 	if ( cp == nullchar ) {
179*772Speter 	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PFUN, 0 );
180*772Speter 	}
181*772Speter 
182*772Speter 	/* for sdb */
183*772Speter 	if ( ! opt('g') ) {
184*772Speter 		return;
185*772Speter 	}
186*772Speter 	putprintf( "	.stabs	\"" , 1 );
187*772Speter 	putprintf( NAMEFORMAT , 1 , name );
188*772Speter 	putprintf( "\",0%o,0,%d," , 1 , N_FUN , line );
189*772Speter 	for ( i = 1 ; i < level ; i++ ) {
190*772Speter 	    putprintf( EXTFORMAT , 1 , enclosing[ i ] );
191*772Speter 	}
192*772Speter 	putprintf( EXTFORMAT , 0 , name );
193*772Speter     }
194*772Speter 
195*772Speter     /*
196*772Speter      *	source line numbers
197*772Speter      */
198*772Speter stabline( line )
199*772Speter     int	line;
200*772Speter     {
201*772Speter 	if ( ! opt('g') ) {
202*772Speter 		return;
203*772Speter 	}
204*772Speter 	if ( line < 0 ) {
205*772Speter 		/*
206*772Speter 		 *	line numbers get to be negative if there was an error.
207*772Speter 		 */
208*772Speter 	    line = -line;
209*772Speter 	}
210*772Speter 
211*772Speter 	putprintf( "	.stabd	0%o,0,%d" , 0 , N_SLINE , line );
212*772Speter     }
213*772Speter 
214*772Speter     /*
215*772Speter      *	source files
216*772Speter      */
217*772Speter stabsource( filename )
218*772Speter     char	*filename;
219*772Speter     {
220*772Speter 	int	label = getlab();
221*772Speter 	char	*nullchar;
222*772Speter 	char	*cp;
223*772Speter 
224*772Speter 	nullchar = filename;
225*772Speter 	while ( *nullchar ) {
226*772Speter     		nullchar ++;
227*772Speter 	}
228*772Speter 	for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) {
229*772Speter 	    putprintf( "	.stabs	\"" , 1 );
230*772Speter 	    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
231*772Speter     	    putprintf( "\",0%o,0,0,0" , 0 , N_PSO , 0 );
232*772Speter 	}
233*772Speter 	if ( cp == nullchar ) {
234*772Speter 	/*
235*772Speter 	 * then the name was exactly a multiple of SNAMELENGTH long,
236*772Speter 	 */
237*772Speter     	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PSO, 0 );
238*772Speter 	}
239*772Speter 
240*772Speter 	/* for sdb */
241*772Speter 	if ( ! opt('g') ) {
242*772Speter 		return;
243*772Speter 	}
244*772Speter 	putprintf( "	.stabs	\"" , 1 );
245*772Speter 	putprintf( NAMEFORMAT , 1 , filename );
246*772Speter 	putprintf( "\",0%o,0,0," , 1 , N_SO );
247*772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
248*772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
249*772Speter 	putprintf( ":" , 0 );
250*772Speter     }
251*772Speter 
252*772Speter     /*
253*772Speter      *	included files get one or more of these:
254*772Speter      *	one as they are entered by a #include,
255*772Speter      *	and one every time they are returned to by nested #includes
256*772Speter      */
257*772Speter stabinclude( filename )
258*772Speter     char	*filename;
259*772Speter     {
260*772Speter 	int	label = getlab();
261*772Speter 	char	*nullchar;
262*772Speter 	char	*cp;
263*772Speter 
264*772Speter 	nullchar = filename;
265*772Speter 	while ( *nullchar ) {
266*772Speter     		nullchar ++;
267*772Speter 	}
268*772Speter 	for ( cp = filename ; cp < nullchar ; cp += SNAMELENGTH ) {
269*772Speter 	    putprintf( "	.stabs	\"" , 1 );
270*772Speter 	    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
271*772Speter     	    putprintf( "\",0%o,0,0,0" , 0 , N_PSOL , 0 );
272*772Speter 	}
273*772Speter 	if ( cp == nullchar ) {
274*772Speter 	/*
275*772Speter 	 * then the name was exactly a multiple of SNAMELENGTH long,
276*772Speter 	 */
277*772Speter     	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PSOL, 0 );
278*772Speter 	}
279*772Speter 
280*772Speter 	/* for sdb */
281*772Speter 	if ( ! opt('g') ) {
282*772Speter 		return;
283*772Speter 	}
284*772Speter 	putprintf( "	.stabs	\"" , 1 );
285*772Speter 	putprintf( NAMEFORMAT , 1 , filename );
286*772Speter 	putprintf( "\",0%o,0,0," , 1 , N_SOL );
287*772Speter 	putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
288*772Speter 	putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
289*772Speter 	putprintf( ":" , 0 );
290*772Speter     }
291*772Speter 
292*772Speter 
293*772Speter /*
294*772Speter  * global Pascal symbols :
295*772Speter  *   labels, types, constants, and external procedure and function names:
296*772Speter  *   These are used by the separate compilation facility
297*772Speter  *   to be able to check for disjoint header files.
298*772Speter  *   New symbol codes : (N_PGVAR, N_PFUN defined above),
299*772Speter  *   N_PGLAB, N_PGCON, N_PGTYP
300*772Speter  *   and N_PEFUN are defined for these additional global Pascal
301*772Speter  *   symbols in p.a.out.h so that
302*772Speter  *   they can be ignored by "sdb".  The only information
303*772Speter  *   put out for constants and types is their names.
304*772Speter  *   For labels, the integer label is put out. For external functions
305*772Speter  *   and procedures, the name of the function or procedure is put out.
306*772Speter  */
307*772Speter 
308*772Speter /* global constants */
309*772Speter stabcname( name )
310*772Speter     char *name;
311*772Speter 
312*772Speter     {
313*772Speter 	char	*nullchar;
314*772Speter 	char	*cp;
315*772Speter 
316*772Speter 	nullchar = name;
317*772Speter 	while ( *nullchar ) {
318*772Speter     		nullchar ++;
319*772Speter 	}
320*772Speter 	for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
321*772Speter 	    putprintf( "	.stabs	\"" , 1 );
322*772Speter 	    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
323*772Speter     	    putprintf( "\",0%o,0,0,0" , 0 , N_PGCON , 0 );
324*772Speter 	}
325*772Speter 	if ( cp == nullchar ) {
326*772Speter     	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PGCON, 0 );
327*772Speter 	}
328*772Speter 
329*772Speter     }
330*772Speter 
331*772Speter /* global types */
332*772Speter stabtname( name )
333*772Speter     char *name;
334*772Speter 
335*772Speter     {
336*772Speter 	char	*nullchar;
337*772Speter 	char	*cp;
338*772Speter 
339*772Speter 	nullchar = name;
340*772Speter 	while ( *nullchar ) {
341*772Speter     		nullchar ++;
342*772Speter 	}
343*772Speter 	for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
344*772Speter 	    putprintf( "	.stabs	\"" , 1 );
345*772Speter 	    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
346*772Speter     	    putprintf( "\",0%o,0,0,0" , 0 , N_PGTYP , 0 );
347*772Speter 	}
348*772Speter 	if ( cp == nullchar ) {
349*772Speter     	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PGTYP, 0 );
350*772Speter 	}
351*772Speter     }
352*772Speter 
353*772Speter /* global labels */
354*772Speter stabglab( label )
355*772Speter     int label;
356*772Speter 
357*772Speter     {
358*772Speter 
359*772Speter 	putprintf( "	.stabs	\"" , 1 );
360*772Speter 	putprintf( PREFIXFORMAT , 1 , PLABELPREFIX , label );
361*772Speter 	putprintf( "\",0%o,0,0,0" , 0 , N_PGLAB , 0 );
362*772Speter     }
363*772Speter 
364*772Speter 
365*772Speter /* external functions and procedures */
366*772Speter stabefunc( name , line )
367*772Speter     char *name;
368*772Speter     int line;
369*772Speter     {
370*772Speter 
371*772Speter 	char	*nullchar;
372*772Speter 	char	*cp;
373*772Speter 
374*772Speter 	nullchar = name;
375*772Speter 	while ( *nullchar ) {
376*772Speter     		nullchar ++;
377*772Speter 	}
378*772Speter 	for ( cp = name ; cp < nullchar ; cp += SNAMELENGTH ) {
379*772Speter 	    putprintf( "	.stabs	\"" , 1 );
380*772Speter 	    putprintf( SNAMEFORMAT , 1 , SNAMELENGTH , cp );
381*772Speter     	    putprintf( "\",0%o,0,0,0" , 0 , N_PEFUN , 0 );
382*772Speter 	}
383*772Speter 	if ( cp == nullchar ) {
384*772Speter     	putprintf( "	.stabn	0%o,0,0,0" , 0 , N_PEFUN, 0 );
385*772Speter 	}
386*772Speter     }
387*772Speter 
388*772Speter #endif PC
389*772Speter 
390*772Speter 
391