xref: /csrg-svn/usr.bin/pascal/src/objfmt.h (revision 10660)
1736Speter /* Copyright (c) 1979 Regents of the University of California */
2736Speter 
3*10660Speter /* static char sccsid[] = "@(#)objfmt.h 1.11 02/01/83"; */
4736Speter 
5*10660Speter /*
6*10660Speter  * The size of the display.
7*10660Speter  */
8*10660Speter #define DSPLYSZ 20
9*10660Speter 
10*10660Speter /*
11*10660Speter  *	The structure of the runtime display
12*10660Speter  */
13736Speter #ifdef OBJ
14*10660Speter struct dispsave {
15*10660Speter 	char *locvars;		/* pointer to local variables */
16*10660Speter 	struct blockmark *stp;	/* pointer to local stack frame */
17*10660Speter };
18736Speter 	/*
19*10660Speter 	 * The following union allows fast access to
20*10660Speter 	 * precomputed display entries
21*10660Speter 	 */
22*10660Speter union display {
23*10660Speter 	struct dispsave frame[DSPLYSZ];
24*10660Speter 	char *raw[2*DSPLYSZ];
25*10660Speter } display;
26*10660Speter #endif OBJ
27*10660Speter #ifdef PC
28*10660Speter #ifdef vax
29*10660Speter 	/*
30*10660Speter 	 *	the display is made up of saved AP's and FP's.
31*10660Speter 	 *	FP's are used to find locals,
32*10660Speter 	 *	and AP's are used to find parameters.
33*10660Speter 	 *	FP and AP are untyped pointers,
34*10660Speter 	 *	but are used throughout as (char *).
35*10660Speter 	 *	the display is used by adding AP_OFFSET or FP_OFFSET to the
36*10660Speter 	 *	address of the approriate display entry.
37*10660Speter 	 */
38*10660Speter     struct dispsave {
39*10660Speter 	char	*savedAP;
40*10660Speter 	char	*savedFP;
41*10660Speter     } display[ DSPLYSZ ];
42*10660Speter 
43*10660Speter #   define	AP_OFFSET	( 0 )
44*10660Speter #   define	FP_OFFSET	( sizeof (char *) )
45*10660Speter #endif vax
46*10660Speter #ifdef mc68000
47*10660Speter 	/*
48*10660Speter 	 *	the display is just the saved a6.
49*10660Speter 	 *	arguments are at positive offsets,
50*10660Speter 	 *	locals are at negative offsets.
51*10660Speter 	 *	there are no offsets within the saved display structure.
52*10660Speter 	 */
53*10660Speter     struct dispsave {
54*10660Speter 	char	*saveda6;
55*10660Speter     } display[ DSPLYSZ ];
56*10660Speter 
57*10660Speter #   define	AP_OFFSET	(0)
58*10660Speter #   define	FP_OFFSET	(0)
59*10660Speter #endif mc68000
60*10660Speter #endif PC
61*10660Speter 
62*10660Speter     /*
63*10660Speter      *	the structure below describes the block mark used by the architecture.
64*10660Speter      *	this is the space used by the machine between the arguments and the
65*10660Speter      *	whatever is used to point to the arguments.
66*10660Speter      */
67*10660Speter #ifdef OBJ
68*10660Speter struct blockmark {
69*10660Speter 	char *tos;		/* pointer to top of stack frame */
70*10660Speter 	struct iorec *file;	/* pointer to active file name */
71*10660Speter 	struct hdr {
72*10660Speter 		long framesze;	/* number of bytes of local vars */
73*10660Speter 		long nargs;	/* number of bytes of arguments */
74*10660Speter 		long tests;	/* TRUE => perform runtime tests */
75*10660Speter 		short offset;	/* offset of procedure in source file */
76*10660Speter 		char name[1];	/* name of active procedure */
77*10660Speter 	} *entry;
78*10660Speter 	struct dispsave odisp;	/* previous display value for this level */
79*10660Speter 	struct dispsave *dp;	/* pointer to active display entry */
80*10660Speter 	char *pc;		/* previous location counter */
81*10660Speter 	long lino;		/* previous line number */
82*10660Speter };
83*10660Speter #endif OBJ
84*10660Speter #ifdef PC
85*10660Speter #ifdef vax
86*10660Speter 	/*
87*10660Speter 	 *	since we have the ap pointing to the number of args:
88*10660Speter 	 */
89*10660Speter     struct blockmark {
90*10660Speter         long	nargs;
91*10660Speter     };
92*10660Speter #endif vax
93*10660Speter #ifdef mc68000
94*10660Speter 	/*
95*10660Speter 	 *	there's the saved pc (from the jsr)
96*10660Speter 	 *	and the saved a6 (from the link a6).
97*10660Speter 	 */
98*10660Speter     struct blockmark {
99*10660Speter 	char	*savedpc;
100*10660Speter 	char	*saveda6;
101*10660Speter     };
102*10660Speter #endif mc68000
103*10660Speter #endif PC
104*10660Speter 
105*10660Speter     /*
106*10660Speter      *	formal routine structure:
107*10660Speter      */
108*10660Speter struct formalrtn {
109*10660Speter 	long		(*fentryaddr)();	/* formal entry point */
110*10660Speter 	long		fbn;			/* block number of function */
111*10660Speter 	struct dispsave	fdisp[ DSPLYSZ ];	/* saved at first passing */
112*10660Speter } frtn;
113*10660Speter 
114*10660Speter #define	FENTRYOFFSET	0
115*10660Speter #define FBNOFFSET	( FENTRYOFFSET + sizeof frtn.fentryaddr )
116*10660Speter #define	FDISPOFFSET	( FBNOFFSET + sizeof frtn.fbn )
117*10660Speter 
118*10660Speter #ifdef OBJ
119*10660Speter 	/*
120736Speter 	 *	the creation time, the size and the magic number of the obj file
121736Speter 	 */
122736Speter     struct pxhdr {
1232948Smckusic 	    long	maketime;
1242948Smckusic 	    long	objsize;
1255642Smckusic 	    long	symtabsize;
126736Speter 	    short	magicnum;
127736Speter     };
128736Speter 
129*10660Speter #ifdef vax
1305642Smckusic #   define HEADER_BYTES	1536			/* the size of px_header */
131*10660Speter #endif vax
132*10660Speter #ifdef mc68000
133*10660Speter #   define HEADER_BYTES	3072			/* the size of px_header */
134*10660Speter #endif mc68000
1352088Smckusic #   define INDX 1				/* amt to shift display index */
136736Speter #endif OBJ
137736Speter 
138736Speter 	    /*
139736Speter 	     *	these are because of varying sizes of pointers
140736Speter 	     */
141*10660Speter #ifdef ADDR16
142*10660Speter #	define PTR_AS O_AS2
143*10660Speter #	define PTR_RV O_RV2
144*10660Speter #	define PTR_IND O_IND2
145*10660Speter #	define PTR_CON O_CON2
146*10660Speter #	define PTR_DUP O_SDUP2
147*10660Speter #	define CON_INT O_CON2
148*10660Speter #	define INT_TYP (nl + T2INT)
149*10660Speter #	define PTR_DCL char *
150*10660Speter #	define TOOMUCH 50000
151*10660Speter #	define SHORTADDR 65536
152*10660Speter #	define MAXSET 65536		/* maximum set size */
153*10660Speter #endif ADDR16
154*10660Speter #ifdef ADDR32
155736Speter #	define PTR_AS O_AS4
156736Speter #	define PTR_RV O_RV4
157736Speter #	define PTR_IND O_IND4
1582948Smckusic #	define PTR_CON O_CON4
1592948Smckusic #	define PTR_DUP O_SDUP4
1603171Smckusic #	define CON_INT O_CON24
1613171Smckusic #	define INT_TYP (nl + T4INT)
162736Speter #	define PTR_DCL unsigned long		/* for pointer variables */
163736Speter #	define SHORTADDR 32768			/* maximum short address */
164736Speter #	define TOOMUCH 65536			/* maximum variable size */
165736Speter #	define MAXSET 65536			/* maximum set size */
166*10660Speter #endif ADDR32
167*10660Speter 	/*
168*10660Speter 	 * Offsets due to the structure of the runtime stack.
169*10660Speter 	 * DPOFF1	is the amount of fixed storage in each block allocated
170*10660Speter 	 * 		as local variables for the runtime system.
171*10660Speter 	 *		since locals are allocated negative offsets,
172*10660Speter 	 *		-DPOFF1 is the last used implicit local offset.
173*10660Speter 	 * DPOFF2	is the size of the block mark.
174*10660Speter 	 *		since arguments are allocated positive offsets,
175*10660Speter 	 *		DPOFF2 is the end of the implicit arguments.
176*10660Speter 	 *		for obj, the first argument has the highest offset
177*10660Speter 	 *		from the stackpointer.  and the block mark is an
178*10660Speter 	 *		implicit last parameter.
179*10660Speter 	 *		for pc, the first argument has the lowest offset
180*10660Speter 	 *		from the argumentpointer.  and the block mark is an
181*10660Speter 	 *		implicit first parameter.
182*10660Speter 	 */
183736Speter #	ifdef OBJ
184*10660Speter #	    ifdef ADDR32
185*10660Speter #		define MAGICNUM 0403	/* obj magic number */
186*10660Speter #		define DPOFF1		0
187*10660Speter #		define DPOFF2		(sizeof (struct blockmark))
188*10660Speter #		define INPUT_OFF	-8	/* offset of `input' */
189*10660Speter #		define OUTPUT_OFF	-4	/* offset of `output' */
190*10660Speter #	    endif ADDR32
191*10660Speter #	    ifdef ADDR16
192*10660Speter #		define MAGICNUM 0404
193*10660Speter #		define DPOFF1		0
194*10660Speter #		define DPOFF2		(sizeof (struct blockmark))
195*10660Speter #		define INPUT_OFF	-2
196*10660Speter #		define OUTPUT_OFF	-4
197*10660Speter #	    endif ADDR16
198736Speter #	endif OBJ
199736Speter #	ifdef	PC
200*10660Speter #	    define DPOFF1	( sizeof (struct rtlocals) )
201*10660Speter #	    define DPOFF2	( sizeof (struct blockmark) )
202736Speter #	    define INPUT_OFF	0
203736Speter #	    define OUTPUT_OFF	0
204736Speter #	endif PC
205