1*22224Sdist /* 2*22224Sdist * Copyright (c) 1980 Regents of the University of California. 3*22224Sdist * All rights reserved. The Berkeley software License Agreement 4*22224Sdist * specifies the terms and conditions for redistribution. 5*22224Sdist * 6*22224Sdist * @(#)objfmt.h 5.1 (Berkeley) 06/05/85 7*22224Sdist */ 8736Speter 910660Speter /* 1010660Speter * The size of the display. 1110660Speter */ 1210660Speter #define DSPLYSZ 20 1310660Speter 1410660Speter /* 1510660Speter * The structure of the runtime display 1610660Speter */ 17736Speter #ifdef OBJ 1810660Speter struct dispsave { 1910660Speter char *locvars; /* pointer to local variables */ 2010660Speter struct blockmark *stp; /* pointer to local stack frame */ 2110660Speter }; 22736Speter /* 2310660Speter * The following union allows fast access to 2410660Speter * precomputed display entries 2510660Speter */ 2610660Speter union display { 2710660Speter struct dispsave frame[DSPLYSZ]; 2810660Speter char *raw[2*DSPLYSZ]; 2910660Speter } display; 3010660Speter #endif OBJ 3110660Speter #ifdef PC 3210660Speter #ifdef vax 3310660Speter /* 3410660Speter * the display is made up of saved AP's and FP's. 3510660Speter * FP's are used to find locals, 3610660Speter * and AP's are used to find parameters. 3710660Speter * FP and AP are untyped pointers, 3810660Speter * but are used throughout as (char *). 3910660Speter * the display is used by adding AP_OFFSET or FP_OFFSET to the 4010660Speter * address of the approriate display entry. 4110660Speter */ 4210660Speter struct dispsave { 4310660Speter char *savedAP; 4410660Speter char *savedFP; 4510660Speter } display[ DSPLYSZ ]; 4610660Speter 4710660Speter # define AP_OFFSET ( 0 ) 4810660Speter # define FP_OFFSET ( sizeof (char *) ) 4910660Speter #endif vax 5010660Speter #ifdef mc68000 5110660Speter /* 5210660Speter * the display is just the saved a6. 5310660Speter * arguments are at positive offsets, 5410660Speter * locals are at negative offsets. 5510660Speter * there are no offsets within the saved display structure. 5610660Speter */ 5710660Speter struct dispsave { 5810660Speter char *saveda6; 5910660Speter } display[ DSPLYSZ ]; 6010660Speter 6110660Speter # define AP_OFFSET (0) 6210660Speter # define FP_OFFSET (0) 6310660Speter #endif mc68000 6410660Speter #endif PC 6510660Speter 6610660Speter /* 6710660Speter * the structure below describes the block mark used by the architecture. 6810660Speter * this is the space used by the machine between the arguments and the 6910660Speter * whatever is used to point to the arguments. 7010660Speter */ 7110660Speter #ifdef OBJ 7210660Speter struct blockmark { 7310660Speter char *tos; /* pointer to top of stack frame */ 7410660Speter struct iorec *file; /* pointer to active file name */ 7510660Speter struct hdr { 7610660Speter long framesze; /* number of bytes of local vars */ 7710660Speter long nargs; /* number of bytes of arguments */ 7810660Speter long tests; /* TRUE => perform runtime tests */ 7910660Speter short offset; /* offset of procedure in source file */ 8010660Speter char name[1]; /* name of active procedure */ 8110660Speter } *entry; 8210660Speter struct dispsave odisp; /* previous display value for this level */ 8310660Speter struct dispsave *dp; /* pointer to active display entry */ 8410660Speter char *pc; /* previous location counter */ 8510660Speter long lino; /* previous line number */ 8610660Speter }; 8710660Speter #endif OBJ 8810660Speter #ifdef PC 8910660Speter #ifdef vax 9010660Speter /* 9110660Speter * since we have the ap pointing to the number of args: 9210660Speter */ 9310660Speter struct blockmark { 9410660Speter long nargs; 9510660Speter }; 9610660Speter #endif vax 9710660Speter #ifdef mc68000 9810660Speter /* 9910660Speter * there's the saved pc (from the jsr) 10010660Speter * and the saved a6 (from the link a6). 10110660Speter */ 10210660Speter struct blockmark { 10310660Speter char *savedpc; 10410660Speter char *saveda6; 10510660Speter }; 10610660Speter #endif mc68000 10710660Speter #endif PC 10810660Speter 10910660Speter /* 11010660Speter * formal routine structure: 11110660Speter */ 11210660Speter struct formalrtn { 11310660Speter long (*fentryaddr)(); /* formal entry point */ 11410660Speter long fbn; /* block number of function */ 11510660Speter struct dispsave fdisp[ DSPLYSZ ]; /* saved at first passing */ 11614751Sthien }; 11714751Sthien #ifndef PC 11814751Sthien #ifndef OBJ 11914751Sthien struct formalrtn frtn; 12014751Sthien #endif 12114751Sthien #endif 12210660Speter 12310660Speter #define FENTRYOFFSET 0 12410660Speter #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr ) 12510660Speter #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn ) 12610660Speter 12710660Speter #ifdef OBJ 12810660Speter /* 129736Speter * the creation time, the size and the magic number of the obj file 130736Speter */ 131736Speter struct pxhdr { 1322948Smckusic long maketime; 1332948Smckusic long objsize; 1345642Smckusic long symtabsize; 135736Speter short magicnum; 136736Speter }; 137736Speter 13811880Smckusick /* 13911880Smckusick * START defines the beginning of the text space. 14011880Smckusick * This should be the defined external label "start", 14111880Smckusick * however there is no way to access externals from C 14211880Smckusick * whose names do not begin with an "_". 14311880Smckusick */ 14410660Speter #ifdef vax 14510720Smckusick # define HEADER_BYTES 2048 /* the size of px_header */ 14611880Smckusick # define START 0x0 /* beginning of text */ 14710660Speter #endif vax 14810660Speter #ifdef mc68000 14910660Speter # define HEADER_BYTES 3072 /* the size of px_header */ 15011880Smckusick # define START 0x8000 /* beginning of text */ 15110660Speter #endif mc68000 1522088Smckusic # define INDX 1 /* amt to shift display index */ 153736Speter #endif OBJ 154736Speter 155736Speter /* 156736Speter * these are because of varying sizes of pointers 157736Speter */ 15810660Speter #ifdef ADDR16 15910660Speter # define PTR_AS O_AS2 16010660Speter # define PTR_RV O_RV2 16110660Speter # define PTR_IND O_IND2 16210660Speter # define PTR_CON O_CON2 16310660Speter # define PTR_DUP O_SDUP2 16410660Speter # define CON_INT O_CON2 16510660Speter # define INT_TYP (nl + T2INT) 16610660Speter # define PTR_DCL char * 16710660Speter # define TOOMUCH 50000 16810660Speter # define SHORTADDR 65536 16910660Speter # define MAXSET 65536 /* maximum set size */ 17010660Speter #endif ADDR16 17110660Speter #ifdef ADDR32 172736Speter # define PTR_AS O_AS4 173736Speter # define PTR_RV O_RV4 174736Speter # define PTR_IND O_IND4 1752948Smckusic # define PTR_CON O_CON4 1762948Smckusic # define PTR_DUP O_SDUP4 1773171Smckusic # define CON_INT O_CON24 1783171Smckusic # define INT_TYP (nl + T4INT) 179736Speter # define PTR_DCL unsigned long /* for pointer variables */ 180736Speter # define SHORTADDR 32768 /* maximum short address */ 181736Speter # define TOOMUCH 65536 /* maximum variable size */ 182736Speter # define MAXSET 65536 /* maximum set size */ 18310660Speter #endif ADDR32 18410660Speter /* 18510660Speter * Offsets due to the structure of the runtime stack. 18610660Speter * DPOFF1 is the amount of fixed storage in each block allocated 18710660Speter * as local variables for the runtime system. 18810660Speter * since locals are allocated negative offsets, 18910660Speter * -DPOFF1 is the last used implicit local offset. 19010660Speter * DPOFF2 is the size of the block mark. 19110660Speter * since arguments are allocated positive offsets, 19210660Speter * DPOFF2 is the end of the implicit arguments. 19310660Speter * for obj, the first argument has the highest offset 19410660Speter * from the stackpointer. and the block mark is an 19510660Speter * implicit last parameter. 19610660Speter * for pc, the first argument has the lowest offset 19710660Speter * from the argumentpointer. and the block mark is an 19810660Speter * implicit first parameter. 19910660Speter */ 200736Speter # ifdef OBJ 20110660Speter # ifdef ADDR32 20210660Speter # define MAGICNUM 0403 /* obj magic number */ 20310660Speter # define DPOFF1 0 20410660Speter # define DPOFF2 (sizeof (struct blockmark)) 20510660Speter # define INPUT_OFF -8 /* offset of `input' */ 20610660Speter # define OUTPUT_OFF -4 /* offset of `output' */ 20710660Speter # endif ADDR32 20810660Speter # ifdef ADDR16 20910660Speter # define MAGICNUM 0404 21010660Speter # define DPOFF1 0 21110660Speter # define DPOFF2 (sizeof (struct blockmark)) 21210660Speter # define INPUT_OFF -2 21310660Speter # define OUTPUT_OFF -4 21410660Speter # endif ADDR16 215736Speter # endif OBJ 216736Speter # ifdef PC 21710660Speter # define DPOFF1 ( sizeof (struct rtlocals) ) 21810660Speter # define DPOFF2 ( sizeof (struct blockmark) ) 219736Speter # define INPUT_OFF 0 220736Speter # define OUTPUT_OFF 0 221736Speter # endif PC 222