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