1736Speter /* Copyright (c) 1979 Regents of the University of California */ 2736Speter 3*10720Smckusick /* static char sccsid[] = "@(#)objfmt.h 1.12 02/03/83"; */ 4736Speter 510660Speter /* 610660Speter * The size of the display. 710660Speter */ 810660Speter #define DSPLYSZ 20 910660Speter 1010660Speter /* 1110660Speter * The structure of the runtime display 1210660Speter */ 13736Speter #ifdef OBJ 1410660Speter struct dispsave { 1510660Speter char *locvars; /* pointer to local variables */ 1610660Speter struct blockmark *stp; /* pointer to local stack frame */ 1710660Speter }; 18736Speter /* 1910660Speter * The following union allows fast access to 2010660Speter * precomputed display entries 2110660Speter */ 2210660Speter union display { 2310660Speter struct dispsave frame[DSPLYSZ]; 2410660Speter char *raw[2*DSPLYSZ]; 2510660Speter } display; 2610660Speter #endif OBJ 2710660Speter #ifdef PC 2810660Speter #ifdef vax 2910660Speter /* 3010660Speter * the display is made up of saved AP's and FP's. 3110660Speter * FP's are used to find locals, 3210660Speter * and AP's are used to find parameters. 3310660Speter * FP and AP are untyped pointers, 3410660Speter * but are used throughout as (char *). 3510660Speter * the display is used by adding AP_OFFSET or FP_OFFSET to the 3610660Speter * address of the approriate display entry. 3710660Speter */ 3810660Speter struct dispsave { 3910660Speter char *savedAP; 4010660Speter char *savedFP; 4110660Speter } display[ DSPLYSZ ]; 4210660Speter 4310660Speter # define AP_OFFSET ( 0 ) 4410660Speter # define FP_OFFSET ( sizeof (char *) ) 4510660Speter #endif vax 4610660Speter #ifdef mc68000 4710660Speter /* 4810660Speter * the display is just the saved a6. 4910660Speter * arguments are at positive offsets, 5010660Speter * locals are at negative offsets. 5110660Speter * there are no offsets within the saved display structure. 5210660Speter */ 5310660Speter struct dispsave { 5410660Speter char *saveda6; 5510660Speter } display[ DSPLYSZ ]; 5610660Speter 5710660Speter # define AP_OFFSET (0) 5810660Speter # define FP_OFFSET (0) 5910660Speter #endif mc68000 6010660Speter #endif PC 6110660Speter 6210660Speter /* 6310660Speter * the structure below describes the block mark used by the architecture. 6410660Speter * this is the space used by the machine between the arguments and the 6510660Speter * whatever is used to point to the arguments. 6610660Speter */ 6710660Speter #ifdef OBJ 6810660Speter struct blockmark { 6910660Speter char *tos; /* pointer to top of stack frame */ 7010660Speter struct iorec *file; /* pointer to active file name */ 7110660Speter struct hdr { 7210660Speter long framesze; /* number of bytes of local vars */ 7310660Speter long nargs; /* number of bytes of arguments */ 7410660Speter long tests; /* TRUE => perform runtime tests */ 7510660Speter short offset; /* offset of procedure in source file */ 7610660Speter char name[1]; /* name of active procedure */ 7710660Speter } *entry; 7810660Speter struct dispsave odisp; /* previous display value for this level */ 7910660Speter struct dispsave *dp; /* pointer to active display entry */ 8010660Speter char *pc; /* previous location counter */ 8110660Speter long lino; /* previous line number */ 8210660Speter }; 8310660Speter #endif OBJ 8410660Speter #ifdef PC 8510660Speter #ifdef vax 8610660Speter /* 8710660Speter * since we have the ap pointing to the number of args: 8810660Speter */ 8910660Speter struct blockmark { 9010660Speter long nargs; 9110660Speter }; 9210660Speter #endif vax 9310660Speter #ifdef mc68000 9410660Speter /* 9510660Speter * there's the saved pc (from the jsr) 9610660Speter * and the saved a6 (from the link a6). 9710660Speter */ 9810660Speter struct blockmark { 9910660Speter char *savedpc; 10010660Speter char *saveda6; 10110660Speter }; 10210660Speter #endif mc68000 10310660Speter #endif PC 10410660Speter 10510660Speter /* 10610660Speter * formal routine structure: 10710660Speter */ 10810660Speter struct formalrtn { 10910660Speter long (*fentryaddr)(); /* formal entry point */ 11010660Speter long fbn; /* block number of function */ 11110660Speter struct dispsave fdisp[ DSPLYSZ ]; /* saved at first passing */ 11210660Speter } frtn; 11310660Speter 11410660Speter #define FENTRYOFFSET 0 11510660Speter #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr ) 11610660Speter #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn ) 11710660Speter 11810660Speter #ifdef OBJ 11910660Speter /* 120736Speter * the creation time, the size and the magic number of the obj file 121736Speter */ 122736Speter struct pxhdr { 1232948Smckusic long maketime; 1242948Smckusic long objsize; 1255642Smckusic long symtabsize; 126736Speter short magicnum; 127736Speter }; 128736Speter 12910660Speter #ifdef vax 130*10720Smckusick # define HEADER_BYTES 2048 /* the size of px_header */ 13110660Speter #endif vax 13210660Speter #ifdef mc68000 13310660Speter # define HEADER_BYTES 3072 /* the size of px_header */ 13410660Speter #endif mc68000 1352088Smckusic # define INDX 1 /* amt to shift display index */ 136736Speter #endif OBJ 137736Speter 138736Speter /* 139736Speter * these are because of varying sizes of pointers 140736Speter */ 14110660Speter #ifdef ADDR16 14210660Speter # define PTR_AS O_AS2 14310660Speter # define PTR_RV O_RV2 14410660Speter # define PTR_IND O_IND2 14510660Speter # define PTR_CON O_CON2 14610660Speter # define PTR_DUP O_SDUP2 14710660Speter # define CON_INT O_CON2 14810660Speter # define INT_TYP (nl + T2INT) 14910660Speter # define PTR_DCL char * 15010660Speter # define TOOMUCH 50000 15110660Speter # define SHORTADDR 65536 15210660Speter # define MAXSET 65536 /* maximum set size */ 15310660Speter #endif ADDR16 15410660Speter #ifdef ADDR32 155736Speter # define PTR_AS O_AS4 156736Speter # define PTR_RV O_RV4 157736Speter # define PTR_IND O_IND4 1582948Smckusic # define PTR_CON O_CON4 1592948Smckusic # define PTR_DUP O_SDUP4 1603171Smckusic # define CON_INT O_CON24 1613171Smckusic # define INT_TYP (nl + T4INT) 162736Speter # define PTR_DCL unsigned long /* for pointer variables */ 163736Speter # define SHORTADDR 32768 /* maximum short address */ 164736Speter # define TOOMUCH 65536 /* maximum variable size */ 165736Speter # define MAXSET 65536 /* maximum set size */ 16610660Speter #endif ADDR32 16710660Speter /* 16810660Speter * Offsets due to the structure of the runtime stack. 16910660Speter * DPOFF1 is the amount of fixed storage in each block allocated 17010660Speter * as local variables for the runtime system. 17110660Speter * since locals are allocated negative offsets, 17210660Speter * -DPOFF1 is the last used implicit local offset. 17310660Speter * DPOFF2 is the size of the block mark. 17410660Speter * since arguments are allocated positive offsets, 17510660Speter * DPOFF2 is the end of the implicit arguments. 17610660Speter * for obj, the first argument has the highest offset 17710660Speter * from the stackpointer. and the block mark is an 17810660Speter * implicit last parameter. 17910660Speter * for pc, the first argument has the lowest offset 18010660Speter * from the argumentpointer. and the block mark is an 18110660Speter * implicit first parameter. 18210660Speter */ 183736Speter # ifdef OBJ 18410660Speter # ifdef ADDR32 18510660Speter # define MAGICNUM 0403 /* obj magic number */ 18610660Speter # define DPOFF1 0 18710660Speter # define DPOFF2 (sizeof (struct blockmark)) 18810660Speter # define INPUT_OFF -8 /* offset of `input' */ 18910660Speter # define OUTPUT_OFF -4 /* offset of `output' */ 19010660Speter # endif ADDR32 19110660Speter # ifdef ADDR16 19210660Speter # define MAGICNUM 0404 19310660Speter # define DPOFF1 0 19410660Speter # define DPOFF2 (sizeof (struct blockmark)) 19510660Speter # define INPUT_OFF -2 19610660Speter # define OUTPUT_OFF -4 19710660Speter # endif ADDR16 198736Speter # endif OBJ 199736Speter # ifdef PC 20010660Speter # define DPOFF1 ( sizeof (struct rtlocals) ) 20110660Speter # define DPOFF2 ( sizeof (struct blockmark) ) 202736Speter # define INPUT_OFF 0 203736Speter # define OUTPUT_OFF 0 204736Speter # endif PC 205