xref: /original-bsd/usr.bin/pascal/src/objfmt.h (revision f4a18198)
1 /*-
2  * Copyright (c) 1980, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)objfmt.h	8.2 (Berkeley) 05/24/94
8  */
9 
10 /*
11  * The size of the display.
12  */
13 #define DSPLYSZ 20
14 
15 /*
16  *	The structure of the runtime display
17  */
18 #ifdef OBJ
19 struct dispsave {
20 	char *locvars;		/* pointer to local variables */
21 	struct blockmark *stp;	/* pointer to local stack frame */
22 };
23 	/*
24 	 * The following union allows fast access to
25 	 * precomputed display entries
26 	 */
27 union display {
28 	struct dispsave frame[DSPLYSZ];
29 	char *raw[2*DSPLYSZ];
30 } display;
31 #endif OBJ
32 #ifdef PC
33 #ifdef vax
34 	/*
35 	 *	the display is made up of saved AP's and FP's.
36 	 *	FP's are used to find locals,
37 	 *	and AP's are used to find parameters.
38 	 *	FP and AP are untyped pointers,
39 	 *	but are used throughout as (char *).
40 	 *	the display is used by adding AP_OFFSET or FP_OFFSET to the
41 	 *	address of the approriate display entry.
42 	 */
43     struct dispsave {
44 	char	*savedAP;
45 	char	*savedFP;
46     } display[ DSPLYSZ ];
47 
48 #   define	AP_OFFSET	( 0 )
49 #   define	FP_OFFSET	( sizeof (char *) )
50 #endif vax
51 #ifdef mc68000
52 	/*
53 	 *	the display is just the saved a6.
54 	 *	arguments are at positive offsets,
55 	 *	locals are at negative offsets.
56 	 *	there are no offsets within the saved display structure.
57 	 */
58     struct dispsave {
59 	char	*saveda6;
60     } display[ DSPLYSZ ];
61 
62 #   define	AP_OFFSET	(0)
63 #   define	FP_OFFSET	(0)
64 #endif mc68000
65 #ifdef tahoe
66 	/*
67 	 *	the display is just the saved FP.
68 	 *	arguments are at positive offsets,
69 	 *	locals are at negative offsets.
70 	 *	there are no offsets within the saved display structure.
71 	 */
72     struct dispsave {
73 	char	*savedFP;
74     } display[ DSPLYSZ ];
75 
76 #   define	AP_OFFSET	0
77 #   define	FP_OFFSET	0
78 #endif tahoe
79 #endif PC
80 
81     /*
82      *	the structure below describes the block mark used by the architecture.
83      *	this is the space used by the machine between the arguments and the
84      *	whatever is used to point to the arguments.
85      */
86 #ifdef OBJ
87 struct blockmark {
88 	char *tos;		/* pointer to top of stack frame */
89 	struct iorec *file;	/* pointer to active file name */
90 	struct hdr {
91 		long framesze;	/* number of bytes of local vars */
92 		long nargs;	/* number of bytes of arguments */
93 		long tests;	/* TRUE => perform runtime tests */
94 		short offset;	/* offset of procedure in source file */
95 		char name[1];	/* name of active procedure */
96 	} *entry;
97 	struct dispsave odisp;	/* previous display value for this level */
98 	struct dispsave *dp;	/* pointer to active display entry */
99 	char *pc;		/* previous location counter */
100 	long lino;		/* previous line number */
101 };
102 #endif OBJ
103 #ifdef PC
104 #ifdef vax
105 	/*
106 	 *	since we have the ap pointing to the number of args:
107 	 */
108     struct blockmark {
109         long	nargs;
110     };
111 #endif vax
112 #ifdef mc68000
113 	/*
114 	 *	there's the saved pc (from the jsr)
115 	 *	and the saved a6 (from the link a6).
116 	 */
117     struct blockmark {
118 	char	*savedpc;
119 	char	*saveda6;
120     };
121 #endif mc68000
122 #ifdef tahoe
123 	/*
124 	 *	since we have the fp pointing to its predecessor
125 	 */
126     struct blockmark {
127 	long	savedfp;
128     };
129 #endif tahoe
130 #endif PC
131 
132     /*
133      *	formal routine structure:
134      */
135 struct formalrtn {
136 	long		(*fentryaddr)();	/* formal entry point */
137 	long		fbn;			/* block number of function */
138 	struct dispsave	fdisp[ DSPLYSZ ];	/* saved at first passing */
139 };
140 #ifndef PC
141 #ifndef OBJ
142 struct formalrtn	frtn;
143 #endif
144 #endif
145 
146 #define	FENTRYOFFSET	0
147 #define FBNOFFSET	( FENTRYOFFSET + sizeof frtn.fentryaddr )
148 #define	FDISPOFFSET	( FBNOFFSET + sizeof frtn.fbn )
149 
150 #ifdef OBJ
151 	/*
152 	 *	the creation time, the size and the magic number of the obj file
153 	 */
154     struct pxhdr {
155 	    long	maketime;
156 	    long	objsize;
157 	    long	symtabsize;
158 	    short	magicnum;
159     };
160 
161 /*
162  *	START defines the beginning of the text space.
163  *	This should be the defined external label "start",
164  *	however there is no way to access externals from C
165  *	whose names do not begin with an "_".
166  */
167 #ifdef vax
168 #   define HEADER_BYTES	2048			/* the size of px_header */
169 #   define START 0x0				/* beginning of text */
170 #endif vax
171 #ifdef tahoe
172 #   define HEADER_BYTES	2560			/* the size of px_header */
173 #   define START 0x0				/* beginning of text */
174 #endif tahoe
175 #ifdef mc68000
176 #   define HEADER_BYTES	6092			/* the size of px_header */
177 #   define START 0x8000				/* beginning of text */
178 #endif mc68000
179 #   define INDX 1				/* amt to shift display index */
180 #endif OBJ
181 
182 	    /*
183 	     *	these are because of varying sizes of pointers
184 	     */
185 #ifdef ADDR16
186 #	define PTR_AS O_AS2
187 #	define PTR_RV O_RV2
188 #	define PTR_IND O_IND2
189 #	define PTR_CON O_CON2
190 #	define PTR_DUP O_SDUP2
191 #	define CON_INT O_CON2
192 #	define INT_TYP (nl + T2INT)
193 #	define PTR_DCL char *
194 #	define TOOMUCH 50000
195 #	define SHORTADDR 65536
196 #	define MAXSET 65536		/* maximum set size */
197 #endif ADDR16
198 #ifdef ADDR32
199 #	define PTR_AS O_AS4
200 #	define PTR_RV O_RV4
201 #	define PTR_IND O_IND4
202 #	define PTR_CON O_CON4
203 #	define PTR_DUP O_SDUP4
204 #	define CON_INT O_CON24
205 #	define INT_TYP (nl + T4INT)
206 #	define PTR_DCL unsigned long		/* for pointer variables */
207 #	define SHORTADDR 32768			/* maximum short address */
208 #	define TOOMUCH 65536			/* maximum variable size */
209 #	define MAXSET 65536			/* maximum set size */
210 #endif ADDR32
211 	/*
212 	 * Offsets due to the structure of the runtime stack.
213 	 * DPOFF1	is the amount of fixed storage in each block allocated
214 	 * 		as local variables for the runtime system.
215 	 *		since locals are allocated negative offsets,
216 	 *		-DPOFF1 is the last used implicit local offset.
217 	 * DPOFF2	is the size of the block mark.
218 	 *		since arguments are allocated positive offsets,
219 	 *		DPOFF2 is the end of the implicit arguments.
220 	 *		for obj, the first argument has the highest offset
221 	 *		from the stackpointer.  and the block mark is an
222 	 *		implicit last parameter.
223 	 *		for pc, the first argument has the lowest offset
224 	 *		from the argumentpointer.  and the block mark is an
225 	 *		implicit first parameter.
226 	 */
227 #	ifdef OBJ
228 #	    ifdef ADDR32
229 #		define MAGICNUM 0403	/* obj magic number */
230 #		define DPOFF1		0
231 #		define DPOFF2		(sizeof (struct blockmark))
232 #		define INPUT_OFF	-8	/* offset of `input' */
233 #		define OUTPUT_OFF	-4	/* offset of `output' */
234 #	    endif ADDR32
235 #	    ifdef ADDR16
236 #		define MAGICNUM 0404
237 #		define DPOFF1		0
238 #		define DPOFF2		(sizeof (struct blockmark))
239 #		define INPUT_OFF	-2
240 #		define OUTPUT_OFF	-4
241 #	    endif ADDR16
242 #	endif OBJ
243 #	ifdef	PC
244 #	    define DPOFF1	( sizeof (struct rtlocals) )
245 #	    define DPOFF2	( sizeof (struct blockmark) )
246 #	    define INPUT_OFF	0
247 #	    define OUTPUT_OFF	0
248 #	endif PC
249