1736Speter /* Copyright (c) 1979 Regents of the University of California */ 2736Speter 3*14751Sthien /* static char sccsid[] = "@(#)objfmt.h 1.14 08/19/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 */ 112*14751Sthien }; 113*14751Sthien #ifndef PC 114*14751Sthien #ifndef OBJ 115*14751Sthien struct formalrtn frtn; 116*14751Sthien #endif 117*14751Sthien #endif 11810660Speter 11910660Speter #define FENTRYOFFSET 0 12010660Speter #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr ) 12110660Speter #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn ) 12210660Speter 12310660Speter #ifdef OBJ 12410660Speter /* 125736Speter * the creation time, the size and the magic number of the obj file 126736Speter */ 127736Speter struct pxhdr { 1282948Smckusic long maketime; 1292948Smckusic long objsize; 1305642Smckusic long symtabsize; 131736Speter short magicnum; 132736Speter }; 133736Speter 13411880Smckusick /* 13511880Smckusick * START defines the beginning of the text space. 13611880Smckusick * This should be the defined external label "start", 13711880Smckusick * however there is no way to access externals from C 13811880Smckusick * whose names do not begin with an "_". 13911880Smckusick */ 14010660Speter #ifdef vax 14110720Smckusick # define HEADER_BYTES 2048 /* the size of px_header */ 14211880Smckusick # define START 0x0 /* beginning of text */ 14310660Speter #endif vax 14410660Speter #ifdef mc68000 14510660Speter # define HEADER_BYTES 3072 /* the size of px_header */ 14611880Smckusick # define START 0x8000 /* beginning of text */ 14710660Speter #endif mc68000 1482088Smckusic # define INDX 1 /* amt to shift display index */ 149736Speter #endif OBJ 150736Speter 151736Speter /* 152736Speter * these are because of varying sizes of pointers 153736Speter */ 15410660Speter #ifdef ADDR16 15510660Speter # define PTR_AS O_AS2 15610660Speter # define PTR_RV O_RV2 15710660Speter # define PTR_IND O_IND2 15810660Speter # define PTR_CON O_CON2 15910660Speter # define PTR_DUP O_SDUP2 16010660Speter # define CON_INT O_CON2 16110660Speter # define INT_TYP (nl + T2INT) 16210660Speter # define PTR_DCL char * 16310660Speter # define TOOMUCH 50000 16410660Speter # define SHORTADDR 65536 16510660Speter # define MAXSET 65536 /* maximum set size */ 16610660Speter #endif ADDR16 16710660Speter #ifdef ADDR32 168736Speter # define PTR_AS O_AS4 169736Speter # define PTR_RV O_RV4 170736Speter # define PTR_IND O_IND4 1712948Smckusic # define PTR_CON O_CON4 1722948Smckusic # define PTR_DUP O_SDUP4 1733171Smckusic # define CON_INT O_CON24 1743171Smckusic # define INT_TYP (nl + T4INT) 175736Speter # define PTR_DCL unsigned long /* for pointer variables */ 176736Speter # define SHORTADDR 32768 /* maximum short address */ 177736Speter # define TOOMUCH 65536 /* maximum variable size */ 178736Speter # define MAXSET 65536 /* maximum set size */ 17910660Speter #endif ADDR32 18010660Speter /* 18110660Speter * Offsets due to the structure of the runtime stack. 18210660Speter * DPOFF1 is the amount of fixed storage in each block allocated 18310660Speter * as local variables for the runtime system. 18410660Speter * since locals are allocated negative offsets, 18510660Speter * -DPOFF1 is the last used implicit local offset. 18610660Speter * DPOFF2 is the size of the block mark. 18710660Speter * since arguments are allocated positive offsets, 18810660Speter * DPOFF2 is the end of the implicit arguments. 18910660Speter * for obj, the first argument has the highest offset 19010660Speter * from the stackpointer. and the block mark is an 19110660Speter * implicit last parameter. 19210660Speter * for pc, the first argument has the lowest offset 19310660Speter * from the argumentpointer. and the block mark is an 19410660Speter * implicit first parameter. 19510660Speter */ 196736Speter # ifdef OBJ 19710660Speter # ifdef ADDR32 19810660Speter # define MAGICNUM 0403 /* obj magic number */ 19910660Speter # define DPOFF1 0 20010660Speter # define DPOFF2 (sizeof (struct blockmark)) 20110660Speter # define INPUT_OFF -8 /* offset of `input' */ 20210660Speter # define OUTPUT_OFF -4 /* offset of `output' */ 20310660Speter # endif ADDR32 20410660Speter # ifdef ADDR16 20510660Speter # define MAGICNUM 0404 20610660Speter # define DPOFF1 0 20710660Speter # define DPOFF2 (sizeof (struct blockmark)) 20810660Speter # define INPUT_OFF -2 20910660Speter # define OUTPUT_OFF -4 21010660Speter # endif ADDR16 211736Speter # endif OBJ 212736Speter # ifdef PC 21310660Speter # define DPOFF1 ( sizeof (struct rtlocals) ) 21410660Speter # define DPOFF2 ( sizeof (struct blockmark) ) 215736Speter # define INPUT_OFF 0 216736Speter # define OUTPUT_OFF 0 217736Speter # endif PC 218