1 /* Copyright (c) 1979 Regents of the University of California */ 2 3 /* static char sccsid[] = "@(#)objfmt.h 1.13 04/08/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 213