xref: /csrg-svn/usr.bin/pascal/src/objfmt.h (revision 67238)
148117Sbostic /*-
262213Sbostic  * Copyright (c) 1980, 1993
362213Sbostic  *	The Regents of the University of California.  All rights reserved.
422224Sdist  *
548117Sbostic  * %sccs.include.redist.c%
648117Sbostic  *
7*67238Smckusick  *	@(#)objfmt.h	8.2 (Berkeley) 05/24/94
822224Sdist  */
9736Speter 
1010660Speter /*
1110660Speter  * The size of the display.
1210660Speter  */
1310660Speter #define DSPLYSZ 20
1410660Speter 
1510660Speter /*
1610660Speter  *	The structure of the runtime display
1710660Speter  */
18736Speter #ifdef OBJ
1910660Speter struct dispsave {
2010660Speter 	char *locvars;		/* pointer to local variables */
2110660Speter 	struct blockmark *stp;	/* pointer to local stack frame */
2210660Speter };
23736Speter 	/*
2410660Speter 	 * The following union allows fast access to
2510660Speter 	 * precomputed display entries
2610660Speter 	 */
2710660Speter union display {
2810660Speter 	struct dispsave frame[DSPLYSZ];
2910660Speter 	char *raw[2*DSPLYSZ];
3010660Speter } display;
3110660Speter #endif OBJ
3210660Speter #ifdef PC
3310660Speter #ifdef vax
3410660Speter 	/*
3510660Speter 	 *	the display is made up of saved AP's and FP's.
3610660Speter 	 *	FP's are used to find locals,
3710660Speter 	 *	and AP's are used to find parameters.
3810660Speter 	 *	FP and AP are untyped pointers,
3910660Speter 	 *	but are used throughout as (char *).
4010660Speter 	 *	the display is used by adding AP_OFFSET or FP_OFFSET to the
4110660Speter 	 *	address of the approriate display entry.
4210660Speter 	 */
4310660Speter     struct dispsave {
4410660Speter 	char	*savedAP;
4510660Speter 	char	*savedFP;
4610660Speter     } display[ DSPLYSZ ];
4710660Speter 
4810660Speter #   define	AP_OFFSET	( 0 )
4910660Speter #   define	FP_OFFSET	( sizeof (char *) )
5010660Speter #endif vax
5110660Speter #ifdef mc68000
5210660Speter 	/*
5310660Speter 	 *	the display is just the saved a6.
5410660Speter 	 *	arguments are at positive offsets,
5510660Speter 	 *	locals are at negative offsets.
5610660Speter 	 *	there are no offsets within the saved display structure.
5710660Speter 	 */
5810660Speter     struct dispsave {
5910660Speter 	char	*saveda6;
6010660Speter     } display[ DSPLYSZ ];
6110660Speter 
6210660Speter #   define	AP_OFFSET	(0)
6310660Speter #   define	FP_OFFSET	(0)
6410660Speter #endif mc68000
6530001Smckusick #ifdef tahoe
6630001Smckusick 	/*
6730001Smckusick 	 *	the display is just the saved FP.
6830001Smckusick 	 *	arguments are at positive offsets,
6930001Smckusick 	 *	locals are at negative offsets.
7030001Smckusick 	 *	there are no offsets within the saved display structure.
7130001Smckusick 	 */
7230001Smckusick     struct dispsave {
7330001Smckusick 	char	*savedFP;
7430001Smckusick     } display[ DSPLYSZ ];
7530001Smckusick 
7630001Smckusick #   define	AP_OFFSET	0
7730001Smckusick #   define	FP_OFFSET	0
7830001Smckusick #endif tahoe
7910660Speter #endif PC
8010660Speter 
8110660Speter     /*
8210660Speter      *	the structure below describes the block mark used by the architecture.
8310660Speter      *	this is the space used by the machine between the arguments and the
8410660Speter      *	whatever is used to point to the arguments.
8510660Speter      */
8610660Speter #ifdef OBJ
8710660Speter struct blockmark {
8810660Speter 	char *tos;		/* pointer to top of stack frame */
8910660Speter 	struct iorec *file;	/* pointer to active file name */
9010660Speter 	struct hdr {
9110660Speter 		long framesze;	/* number of bytes of local vars */
9210660Speter 		long nargs;	/* number of bytes of arguments */
9310660Speter 		long tests;	/* TRUE => perform runtime tests */
9410660Speter 		short offset;	/* offset of procedure in source file */
9510660Speter 		char name[1];	/* name of active procedure */
9610660Speter 	} *entry;
9710660Speter 	struct dispsave odisp;	/* previous display value for this level */
9810660Speter 	struct dispsave *dp;	/* pointer to active display entry */
9910660Speter 	char *pc;		/* previous location counter */
10010660Speter 	long lino;		/* previous line number */
10110660Speter };
10210660Speter #endif OBJ
10310660Speter #ifdef PC
10410660Speter #ifdef vax
10510660Speter 	/*
10610660Speter 	 *	since we have the ap pointing to the number of args:
10710660Speter 	 */
10810660Speter     struct blockmark {
10910660Speter         long	nargs;
11010660Speter     };
11110660Speter #endif vax
11210660Speter #ifdef mc68000
11310660Speter 	/*
11410660Speter 	 *	there's the saved pc (from the jsr)
11510660Speter 	 *	and the saved a6 (from the link a6).
11610660Speter 	 */
11710660Speter     struct blockmark {
11810660Speter 	char	*savedpc;
11910660Speter 	char	*saveda6;
12010660Speter     };
12110660Speter #endif mc68000
12230001Smckusick #ifdef tahoe
12330001Smckusick 	/*
12430001Smckusick 	 *	since we have the fp pointing to its predecessor
12530001Smckusick 	 */
12630001Smckusick     struct blockmark {
12730001Smckusick 	long	savedfp;
12830001Smckusick     };
12930001Smckusick #endif tahoe
13010660Speter #endif PC
13110660Speter 
13210660Speter     /*
13310660Speter      *	formal routine structure:
13410660Speter      */
13510660Speter struct formalrtn {
13610660Speter 	long		(*fentryaddr)();	/* formal entry point */
13710660Speter 	long		fbn;			/* block number of function */
13810660Speter 	struct dispsave	fdisp[ DSPLYSZ ];	/* saved at first passing */
13914751Sthien };
14014751Sthien #ifndef PC
14114751Sthien #ifndef OBJ
14214751Sthien struct formalrtn	frtn;
14314751Sthien #endif
14414751Sthien #endif
14510660Speter 
14610660Speter #define	FENTRYOFFSET	0
14710660Speter #define FBNOFFSET	( FENTRYOFFSET + sizeof frtn.fentryaddr )
14810660Speter #define	FDISPOFFSET	( FBNOFFSET + sizeof frtn.fbn )
14910660Speter 
15010660Speter #ifdef OBJ
15110660Speter 	/*
152736Speter 	 *	the creation time, the size and the magic number of the obj file
153736Speter 	 */
154736Speter     struct pxhdr {
1552948Smckusic 	    long	maketime;
1562948Smckusic 	    long	objsize;
1575642Smckusic 	    long	symtabsize;
158736Speter 	    short	magicnum;
159736Speter     };
160736Speter 
16111880Smckusick /*
16211880Smckusick  *	START defines the beginning of the text space.
16311880Smckusick  *	This should be the defined external label "start",
16411880Smckusick  *	however there is no way to access externals from C
16511880Smckusick  *	whose names do not begin with an "_".
16611880Smckusick  */
16710660Speter #ifdef vax
16810720Smckusick #   define HEADER_BYTES	2048			/* the size of px_header */
16911880Smckusick #   define START 0x0				/* beginning of text */
17010660Speter #endif vax
17130001Smckusick #ifdef tahoe
17244594Smckusick #   define HEADER_BYTES	2560			/* the size of px_header */
17330001Smckusick #   define START 0x0				/* beginning of text */
17430001Smckusick #endif tahoe
17510660Speter #ifdef mc68000
176*67238Smckusick #   define HEADER_BYTES	6092			/* the size of px_header */
17711880Smckusick #   define START 0x8000				/* beginning of text */
17810660Speter #endif mc68000
1792088Smckusic #   define INDX 1				/* amt to shift display index */
180736Speter #endif OBJ
181736Speter 
182736Speter 	    /*
183736Speter 	     *	these are because of varying sizes of pointers
184736Speter 	     */
18510660Speter #ifdef ADDR16
18610660Speter #	define PTR_AS O_AS2
18710660Speter #	define PTR_RV O_RV2
18810660Speter #	define PTR_IND O_IND2
18910660Speter #	define PTR_CON O_CON2
19010660Speter #	define PTR_DUP O_SDUP2
19110660Speter #	define CON_INT O_CON2
19210660Speter #	define INT_TYP (nl + T2INT)
19310660Speter #	define PTR_DCL char *
19410660Speter #	define TOOMUCH 50000
19510660Speter #	define SHORTADDR 65536
19610660Speter #	define MAXSET 65536		/* maximum set size */
19710660Speter #endif ADDR16
19810660Speter #ifdef ADDR32
199736Speter #	define PTR_AS O_AS4
200736Speter #	define PTR_RV O_RV4
201736Speter #	define PTR_IND O_IND4
2022948Smckusic #	define PTR_CON O_CON4
2032948Smckusic #	define PTR_DUP O_SDUP4
2043171Smckusic #	define CON_INT O_CON24
2053171Smckusic #	define INT_TYP (nl + T4INT)
206736Speter #	define PTR_DCL unsigned long		/* for pointer variables */
207736Speter #	define SHORTADDR 32768			/* maximum short address */
208736Speter #	define TOOMUCH 65536			/* maximum variable size */
209736Speter #	define MAXSET 65536			/* maximum set size */
21010660Speter #endif ADDR32
21110660Speter 	/*
21210660Speter 	 * Offsets due to the structure of the runtime stack.
21310660Speter 	 * DPOFF1	is the amount of fixed storage in each block allocated
21410660Speter 	 * 		as local variables for the runtime system.
21510660Speter 	 *		since locals are allocated negative offsets,
21610660Speter 	 *		-DPOFF1 is the last used implicit local offset.
21710660Speter 	 * DPOFF2	is the size of the block mark.
21810660Speter 	 *		since arguments are allocated positive offsets,
21910660Speter 	 *		DPOFF2 is the end of the implicit arguments.
22010660Speter 	 *		for obj, the first argument has the highest offset
22110660Speter 	 *		from the stackpointer.  and the block mark is an
22210660Speter 	 *		implicit last parameter.
22310660Speter 	 *		for pc, the first argument has the lowest offset
22410660Speter 	 *		from the argumentpointer.  and the block mark is an
22510660Speter 	 *		implicit first parameter.
22610660Speter 	 */
227736Speter #	ifdef OBJ
22810660Speter #	    ifdef ADDR32
22910660Speter #		define MAGICNUM 0403	/* obj magic number */
23010660Speter #		define DPOFF1		0
23110660Speter #		define DPOFF2		(sizeof (struct blockmark))
23210660Speter #		define INPUT_OFF	-8	/* offset of `input' */
23310660Speter #		define OUTPUT_OFF	-4	/* offset of `output' */
23410660Speter #	    endif ADDR32
23510660Speter #	    ifdef ADDR16
23610660Speter #		define MAGICNUM 0404
23710660Speter #		define DPOFF1		0
23810660Speter #		define DPOFF2		(sizeof (struct blockmark))
23910660Speter #		define INPUT_OFF	-2
24010660Speter #		define OUTPUT_OFF	-4
24110660Speter #	    endif ADDR16
242736Speter #	endif OBJ
243736Speter #	ifdef	PC
24410660Speter #	    define DPOFF1	( sizeof (struct rtlocals) )
24510660Speter #	    define DPOFF2	( sizeof (struct blockmark) )
246736Speter #	    define INPUT_OFF	0
247736Speter #	    define OUTPUT_OFF	0
248736Speter #	endif PC
249