xref: /csrg-svn/usr.bin/pascal/src/objfmt.h (revision 22224)
1*22224Sdist /*
2*22224Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22224Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22224Sdist  * specifies the terms and conditions for redistribution.
5*22224Sdist  *
6*22224Sdist  *	@(#)objfmt.h	5.1 (Berkeley) 06/05/85
7*22224Sdist  */
8736Speter 
910660Speter /*
1010660Speter  * The size of the display.
1110660Speter  */
1210660Speter #define DSPLYSZ 20
1310660Speter 
1410660Speter /*
1510660Speter  *	The structure of the runtime display
1610660Speter  */
17736Speter #ifdef OBJ
1810660Speter struct dispsave {
1910660Speter 	char *locvars;		/* pointer to local variables */
2010660Speter 	struct blockmark *stp;	/* pointer to local stack frame */
2110660Speter };
22736Speter 	/*
2310660Speter 	 * The following union allows fast access to
2410660Speter 	 * precomputed display entries
2510660Speter 	 */
2610660Speter union display {
2710660Speter 	struct dispsave frame[DSPLYSZ];
2810660Speter 	char *raw[2*DSPLYSZ];
2910660Speter } display;
3010660Speter #endif OBJ
3110660Speter #ifdef PC
3210660Speter #ifdef vax
3310660Speter 	/*
3410660Speter 	 *	the display is made up of saved AP's and FP's.
3510660Speter 	 *	FP's are used to find locals,
3610660Speter 	 *	and AP's are used to find parameters.
3710660Speter 	 *	FP and AP are untyped pointers,
3810660Speter 	 *	but are used throughout as (char *).
3910660Speter 	 *	the display is used by adding AP_OFFSET or FP_OFFSET to the
4010660Speter 	 *	address of the approriate display entry.
4110660Speter 	 */
4210660Speter     struct dispsave {
4310660Speter 	char	*savedAP;
4410660Speter 	char	*savedFP;
4510660Speter     } display[ DSPLYSZ ];
4610660Speter 
4710660Speter #   define	AP_OFFSET	( 0 )
4810660Speter #   define	FP_OFFSET	( sizeof (char *) )
4910660Speter #endif vax
5010660Speter #ifdef mc68000
5110660Speter 	/*
5210660Speter 	 *	the display is just the saved a6.
5310660Speter 	 *	arguments are at positive offsets,
5410660Speter 	 *	locals are at negative offsets.
5510660Speter 	 *	there are no offsets within the saved display structure.
5610660Speter 	 */
5710660Speter     struct dispsave {
5810660Speter 	char	*saveda6;
5910660Speter     } display[ DSPLYSZ ];
6010660Speter 
6110660Speter #   define	AP_OFFSET	(0)
6210660Speter #   define	FP_OFFSET	(0)
6310660Speter #endif mc68000
6410660Speter #endif PC
6510660Speter 
6610660Speter     /*
6710660Speter      *	the structure below describes the block mark used by the architecture.
6810660Speter      *	this is the space used by the machine between the arguments and the
6910660Speter      *	whatever is used to point to the arguments.
7010660Speter      */
7110660Speter #ifdef OBJ
7210660Speter struct blockmark {
7310660Speter 	char *tos;		/* pointer to top of stack frame */
7410660Speter 	struct iorec *file;	/* pointer to active file name */
7510660Speter 	struct hdr {
7610660Speter 		long framesze;	/* number of bytes of local vars */
7710660Speter 		long nargs;	/* number of bytes of arguments */
7810660Speter 		long tests;	/* TRUE => perform runtime tests */
7910660Speter 		short offset;	/* offset of procedure in source file */
8010660Speter 		char name[1];	/* name of active procedure */
8110660Speter 	} *entry;
8210660Speter 	struct dispsave odisp;	/* previous display value for this level */
8310660Speter 	struct dispsave *dp;	/* pointer to active display entry */
8410660Speter 	char *pc;		/* previous location counter */
8510660Speter 	long lino;		/* previous line number */
8610660Speter };
8710660Speter #endif OBJ
8810660Speter #ifdef PC
8910660Speter #ifdef vax
9010660Speter 	/*
9110660Speter 	 *	since we have the ap pointing to the number of args:
9210660Speter 	 */
9310660Speter     struct blockmark {
9410660Speter         long	nargs;
9510660Speter     };
9610660Speter #endif vax
9710660Speter #ifdef mc68000
9810660Speter 	/*
9910660Speter 	 *	there's the saved pc (from the jsr)
10010660Speter 	 *	and the saved a6 (from the link a6).
10110660Speter 	 */
10210660Speter     struct blockmark {
10310660Speter 	char	*savedpc;
10410660Speter 	char	*saveda6;
10510660Speter     };
10610660Speter #endif mc68000
10710660Speter #endif PC
10810660Speter 
10910660Speter     /*
11010660Speter      *	formal routine structure:
11110660Speter      */
11210660Speter struct formalrtn {
11310660Speter 	long		(*fentryaddr)();	/* formal entry point */
11410660Speter 	long		fbn;			/* block number of function */
11510660Speter 	struct dispsave	fdisp[ DSPLYSZ ];	/* saved at first passing */
11614751Sthien };
11714751Sthien #ifndef PC
11814751Sthien #ifndef OBJ
11914751Sthien struct formalrtn	frtn;
12014751Sthien #endif
12114751Sthien #endif
12210660Speter 
12310660Speter #define	FENTRYOFFSET	0
12410660Speter #define FBNOFFSET	( FENTRYOFFSET + sizeof frtn.fentryaddr )
12510660Speter #define	FDISPOFFSET	( FBNOFFSET + sizeof frtn.fbn )
12610660Speter 
12710660Speter #ifdef OBJ
12810660Speter 	/*
129736Speter 	 *	the creation time, the size and the magic number of the obj file
130736Speter 	 */
131736Speter     struct pxhdr {
1322948Smckusic 	    long	maketime;
1332948Smckusic 	    long	objsize;
1345642Smckusic 	    long	symtabsize;
135736Speter 	    short	magicnum;
136736Speter     };
137736Speter 
13811880Smckusick /*
13911880Smckusick  *	START defines the beginning of the text space.
14011880Smckusick  *	This should be the defined external label "start",
14111880Smckusick  *	however there is no way to access externals from C
14211880Smckusick  *	whose names do not begin with an "_".
14311880Smckusick  */
14410660Speter #ifdef vax
14510720Smckusick #   define HEADER_BYTES	2048			/* the size of px_header */
14611880Smckusick #   define START 0x0				/* beginning of text */
14710660Speter #endif vax
14810660Speter #ifdef mc68000
14910660Speter #   define HEADER_BYTES	3072			/* the size of px_header */
15011880Smckusick #   define START 0x8000				/* beginning of text */
15110660Speter #endif mc68000
1522088Smckusic #   define INDX 1				/* amt to shift display index */
153736Speter #endif OBJ
154736Speter 
155736Speter 	    /*
156736Speter 	     *	these are because of varying sizes of pointers
157736Speter 	     */
15810660Speter #ifdef ADDR16
15910660Speter #	define PTR_AS O_AS2
16010660Speter #	define PTR_RV O_RV2
16110660Speter #	define PTR_IND O_IND2
16210660Speter #	define PTR_CON O_CON2
16310660Speter #	define PTR_DUP O_SDUP2
16410660Speter #	define CON_INT O_CON2
16510660Speter #	define INT_TYP (nl + T2INT)
16610660Speter #	define PTR_DCL char *
16710660Speter #	define TOOMUCH 50000
16810660Speter #	define SHORTADDR 65536
16910660Speter #	define MAXSET 65536		/* maximum set size */
17010660Speter #endif ADDR16
17110660Speter #ifdef ADDR32
172736Speter #	define PTR_AS O_AS4
173736Speter #	define PTR_RV O_RV4
174736Speter #	define PTR_IND O_IND4
1752948Smckusic #	define PTR_CON O_CON4
1762948Smckusic #	define PTR_DUP O_SDUP4
1773171Smckusic #	define CON_INT O_CON24
1783171Smckusic #	define INT_TYP (nl + T4INT)
179736Speter #	define PTR_DCL unsigned long		/* for pointer variables */
180736Speter #	define SHORTADDR 32768			/* maximum short address */
181736Speter #	define TOOMUCH 65536			/* maximum variable size */
182736Speter #	define MAXSET 65536			/* maximum set size */
18310660Speter #endif ADDR32
18410660Speter 	/*
18510660Speter 	 * Offsets due to the structure of the runtime stack.
18610660Speter 	 * DPOFF1	is the amount of fixed storage in each block allocated
18710660Speter 	 * 		as local variables for the runtime system.
18810660Speter 	 *		since locals are allocated negative offsets,
18910660Speter 	 *		-DPOFF1 is the last used implicit local offset.
19010660Speter 	 * DPOFF2	is the size of the block mark.
19110660Speter 	 *		since arguments are allocated positive offsets,
19210660Speter 	 *		DPOFF2 is the end of the implicit arguments.
19310660Speter 	 *		for obj, the first argument has the highest offset
19410660Speter 	 *		from the stackpointer.  and the block mark is an
19510660Speter 	 *		implicit last parameter.
19610660Speter 	 *		for pc, the first argument has the lowest offset
19710660Speter 	 *		from the argumentpointer.  and the block mark is an
19810660Speter 	 *		implicit first parameter.
19910660Speter 	 */
200736Speter #	ifdef OBJ
20110660Speter #	    ifdef ADDR32
20210660Speter #		define MAGICNUM 0403	/* obj magic number */
20310660Speter #		define DPOFF1		0
20410660Speter #		define DPOFF2		(sizeof (struct blockmark))
20510660Speter #		define INPUT_OFF	-8	/* offset of `input' */
20610660Speter #		define OUTPUT_OFF	-4	/* offset of `output' */
20710660Speter #	    endif ADDR32
20810660Speter #	    ifdef ADDR16
20910660Speter #		define MAGICNUM 0404
21010660Speter #		define DPOFF1		0
21110660Speter #		define DPOFF2		(sizeof (struct blockmark))
21210660Speter #		define INPUT_OFF	-2
21310660Speter #		define OUTPUT_OFF	-4
21410660Speter #	    endif ADDR16
215736Speter #	endif OBJ
216736Speter #	ifdef	PC
21710660Speter #	    define DPOFF1	( sizeof (struct rtlocals) )
21810660Speter #	    define DPOFF2	( sizeof (struct blockmark) )
219736Speter #	    define INPUT_OFF	0
220736Speter #	    define OUTPUT_OFF	0
221736Speter #	endif PC
222