xref: /csrg-svn/usr.bin/pascal/src/pc.h (revision 738)
1*738Speter /* Copyright (c) 1979 Regents of the University of California */
2*738Speter 
3*738Speter /* static	char sccsid[] = "@(#)pc.h 1.1 08/27/80"; */
4*738Speter 
5*738Speter     /*
6*738Speter      *		random constants for pc
7*738Speter      */
8*738Speter 
9*738Speter     /*
10*738Speter      *	the name of the display.
11*738Speter      *	the display is made up of saved AP's and FP's.
12*738Speter      *	FP's are used to find locals, and AP's are used to find parameters.
13*738Speter      *	FP and AP are untyped pointers, but are used throughout as (char *).
14*738Speter      *	the display is used by adding AP_OFFSET or FP_OFFSET to the
15*738Speter      *	address of the approriate display entry.
16*738Speter      */
17*738Speter #define	DISPLAYNAME	"__disply"
18*738Speter struct dispsave {
19*738Speter     char	*savedAP;
20*738Speter     char	*savedFP;
21*738Speter };
22*738Speter #define	AP_OFFSET	( 0 )
23*738Speter #define FP_OFFSET	( sizeof(char *) )
24*738Speter 
25*738Speter     /*
26*738Speter      *	the structure below describes the locals used by the run time system.
27*738Speter      *	at function entry, at least this much space is allocated,
28*738Speter      *	and the following information is filled in:
29*738Speter      *	the address of a routine to close the current frame for unwinding,
30*738Speter      *	a pointer to the display entry for the current static level and
31*738Speter      *	the previous contents of the display for this static level.
32*738Speter      *	the curfile location is used to point to the currently active file,
33*738Speter      *	and is filled in as io is initiated.
34*738Speter      *	one of these structures is allocated on the (negatively growing) stack.
35*738Speter      *	at function entry, fp is set to point to the last field of the struct,
36*738Speter      *	thus the offsets of the fields are as indicated below.
37*738Speter      */
38*738Speter struct rtlocals {
39*738Speter     struct iorec	*curfile;
40*738Speter     struct dispsave	dsave;
41*738Speter     struct dispsave	*dptr;
42*738Speter     int			(*unwind)();
43*738Speter } rtlocs;
44*738Speter #define	CURFILEOFFSET	( ( -sizeof rtlocs ) + sizeof rtlocs.unwind )
45*738Speter #define	DSAVEOFFSET	( CURFILEOFFSET + sizeof rtlocs.curfile )
46*738Speter #define	DPTROFFSET	( DSAVEOFFSET + sizeof rtlocs.dsave )
47*738Speter #define	UNWINDOFFSET	( DPTROFFSET + sizeof rtlocs.dptr )
48*738Speter #define	UNWINDNAME	"_UNWIND"
49*738Speter 
50*738Speter     /*
51*738Speter      *	the register save mask for saving no registers
52*738Speter      */
53*738Speter #define	RSAVEMASK	( 0 )
54*738Speter 
55*738Speter     /*
56*738Speter      *	runtime check mask for divide check and integer overflow
57*738Speter      */
58*738Speter #define	RUNCHECK	( ( 1 << 15 ) | ( 1 << 14 ) )
59*738Speter 
60*738Speter     /*
61*738Speter      *	formats for various names
62*738Speter      *	    NAMEFORMAT		arbitrary length strings.
63*738Speter      *	    EXTFORMAT		for externals, a preceding underscore.
64*738Speter      *	    PREFIXFORMAT	used to print made up names with prefixes.
65*738Speter      *	    LABELPREFIX		with getlab() makes up label names.
66*738Speter      *	    LLABELPREFIX	with getlab() makes up sdb labels.
67*738Speter      *	    PLABELPREFIX	with atol(symbol) makes up global pascal labels.
68*738Speter      *	    GLABELPREFIX	with getlab() makes up nested label names
69*738Speter      *	a typical use might be to print out a name with a preceeding underscore
70*738Speter      *	with putprintf( EXTFORMAT , 0 , name );
71*738Speter      */
72*738Speter #define	NAMEFORMAT	"%s"
73*738Speter #define	EXTFORMAT	"_%s"
74*738Speter #define	PREFIXFORMAT	"%s%d"
75*738Speter #define	LABELPREFIX	"L"
76*738Speter #define	LLABELPREFIX	"LL"
77*738Speter #define	PLABELPREFIX	"P"
78*738Speter #define	GLABELPREFIX	"G"
79*738Speter 
80*738Speter     /*
81*738Speter      *	the name of the statement counter
82*738Speter      */
83*738Speter #define	STMTCOUNT	"__stcnt"
84*738Speter 
85*738Speter     /*
86*738Speter      *	the name of the pcp counters
87*738Speter      */
88*738Speter #define	PCPCOUNT	"__pcpcount"
89*738Speter 
90*738Speter     /*
91*738Speter      *	a vector of pointer to enclosing functions for fully qualified names.
92*738Speter      */
93*738Speter char	*enclosing[ DSPLYSZ ];
94*738Speter 
95*738Speter     /*
96*738Speter      *	and of course ...
97*738Speter      */
98*738Speter #define	BITSPERBYTE	8
99*738Speter 
100*738Speter     /*
101*738Speter      *	error number for case label not found (ECASE)
102*738Speter      *	stolen from ~mckusick/px/lib/h01errs.h
103*738Speter      */
104*738Speter #define	ECASE		5
105