148117Sbostic /*- 262213Sbostic * Copyright (c) 1980, 1993 362213Sbostic * The Regents of the University of California. All rights reserved. 422224Sdist * 548117Sbostic * %sccs.include.redist.c% 648117Sbostic * 7*67238Smckusick * @(#)objfmt.h 8.2 (Berkeley) 05/24/94 822224Sdist */ 9736Speter 1010660Speter /* 1110660Speter * The size of the display. 1210660Speter */ 1310660Speter #define DSPLYSZ 20 1410660Speter 1510660Speter /* 1610660Speter * The structure of the runtime display 1710660Speter */ 18736Speter #ifdef OBJ 1910660Speter struct dispsave { 2010660Speter char *locvars; /* pointer to local variables */ 2110660Speter struct blockmark *stp; /* pointer to local stack frame */ 2210660Speter }; 23736Speter /* 2410660Speter * The following union allows fast access to 2510660Speter * precomputed display entries 2610660Speter */ 2710660Speter union display { 2810660Speter struct dispsave frame[DSPLYSZ]; 2910660Speter char *raw[2*DSPLYSZ]; 3010660Speter } display; 3110660Speter #endif OBJ 3210660Speter #ifdef PC 3310660Speter #ifdef vax 3410660Speter /* 3510660Speter * the display is made up of saved AP's and FP's. 3610660Speter * FP's are used to find locals, 3710660Speter * and AP's are used to find parameters. 3810660Speter * FP and AP are untyped pointers, 3910660Speter * but are used throughout as (char *). 4010660Speter * the display is used by adding AP_OFFSET or FP_OFFSET to the 4110660Speter * address of the approriate display entry. 4210660Speter */ 4310660Speter struct dispsave { 4410660Speter char *savedAP; 4510660Speter char *savedFP; 4610660Speter } display[ DSPLYSZ ]; 4710660Speter 4810660Speter # define AP_OFFSET ( 0 ) 4910660Speter # define FP_OFFSET ( sizeof (char *) ) 5010660Speter #endif vax 5110660Speter #ifdef mc68000 5210660Speter /* 5310660Speter * the display is just the saved a6. 5410660Speter * arguments are at positive offsets, 5510660Speter * locals are at negative offsets. 5610660Speter * there are no offsets within the saved display structure. 5710660Speter */ 5810660Speter struct dispsave { 5910660Speter char *saveda6; 6010660Speter } display[ DSPLYSZ ]; 6110660Speter 6210660Speter # define AP_OFFSET (0) 6310660Speter # define FP_OFFSET (0) 6410660Speter #endif mc68000 6530001Smckusick #ifdef tahoe 6630001Smckusick /* 6730001Smckusick * the display is just the saved FP. 6830001Smckusick * arguments are at positive offsets, 6930001Smckusick * locals are at negative offsets. 7030001Smckusick * there are no offsets within the saved display structure. 7130001Smckusick */ 7230001Smckusick struct dispsave { 7330001Smckusick char *savedFP; 7430001Smckusick } display[ DSPLYSZ ]; 7530001Smckusick 7630001Smckusick # define AP_OFFSET 0 7730001Smckusick # define FP_OFFSET 0 7830001Smckusick #endif tahoe 7910660Speter #endif PC 8010660Speter 8110660Speter /* 8210660Speter * the structure below describes the block mark used by the architecture. 8310660Speter * this is the space used by the machine between the arguments and the 8410660Speter * whatever is used to point to the arguments. 8510660Speter */ 8610660Speter #ifdef OBJ 8710660Speter struct blockmark { 8810660Speter char *tos; /* pointer to top of stack frame */ 8910660Speter struct iorec *file; /* pointer to active file name */ 9010660Speter struct hdr { 9110660Speter long framesze; /* number of bytes of local vars */ 9210660Speter long nargs; /* number of bytes of arguments */ 9310660Speter long tests; /* TRUE => perform runtime tests */ 9410660Speter short offset; /* offset of procedure in source file */ 9510660Speter char name[1]; /* name of active procedure */ 9610660Speter } *entry; 9710660Speter struct dispsave odisp; /* previous display value for this level */ 9810660Speter struct dispsave *dp; /* pointer to active display entry */ 9910660Speter char *pc; /* previous location counter */ 10010660Speter long lino; /* previous line number */ 10110660Speter }; 10210660Speter #endif OBJ 10310660Speter #ifdef PC 10410660Speter #ifdef vax 10510660Speter /* 10610660Speter * since we have the ap pointing to the number of args: 10710660Speter */ 10810660Speter struct blockmark { 10910660Speter long nargs; 11010660Speter }; 11110660Speter #endif vax 11210660Speter #ifdef mc68000 11310660Speter /* 11410660Speter * there's the saved pc (from the jsr) 11510660Speter * and the saved a6 (from the link a6). 11610660Speter */ 11710660Speter struct blockmark { 11810660Speter char *savedpc; 11910660Speter char *saveda6; 12010660Speter }; 12110660Speter #endif mc68000 12230001Smckusick #ifdef tahoe 12330001Smckusick /* 12430001Smckusick * since we have the fp pointing to its predecessor 12530001Smckusick */ 12630001Smckusick struct blockmark { 12730001Smckusick long savedfp; 12830001Smckusick }; 12930001Smckusick #endif tahoe 13010660Speter #endif PC 13110660Speter 13210660Speter /* 13310660Speter * formal routine structure: 13410660Speter */ 13510660Speter struct formalrtn { 13610660Speter long (*fentryaddr)(); /* formal entry point */ 13710660Speter long fbn; /* block number of function */ 13810660Speter struct dispsave fdisp[ DSPLYSZ ]; /* saved at first passing */ 13914751Sthien }; 14014751Sthien #ifndef PC 14114751Sthien #ifndef OBJ 14214751Sthien struct formalrtn frtn; 14314751Sthien #endif 14414751Sthien #endif 14510660Speter 14610660Speter #define FENTRYOFFSET 0 14710660Speter #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr ) 14810660Speter #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn ) 14910660Speter 15010660Speter #ifdef OBJ 15110660Speter /* 152736Speter * the creation time, the size and the magic number of the obj file 153736Speter */ 154736Speter struct pxhdr { 1552948Smckusic long maketime; 1562948Smckusic long objsize; 1575642Smckusic long symtabsize; 158736Speter short magicnum; 159736Speter }; 160736Speter 16111880Smckusick /* 16211880Smckusick * START defines the beginning of the text space. 16311880Smckusick * This should be the defined external label "start", 16411880Smckusick * however there is no way to access externals from C 16511880Smckusick * whose names do not begin with an "_". 16611880Smckusick */ 16710660Speter #ifdef vax 16810720Smckusick # define HEADER_BYTES 2048 /* the size of px_header */ 16911880Smckusick # define START 0x0 /* beginning of text */ 17010660Speter #endif vax 17130001Smckusick #ifdef tahoe 17244594Smckusick # define HEADER_BYTES 2560 /* the size of px_header */ 17330001Smckusick # define START 0x0 /* beginning of text */ 17430001Smckusick #endif tahoe 17510660Speter #ifdef mc68000 176*67238Smckusick # define HEADER_BYTES 6092 /* the size of px_header */ 17711880Smckusick # define START 0x8000 /* beginning of text */ 17810660Speter #endif mc68000 1792088Smckusic # define INDX 1 /* amt to shift display index */ 180736Speter #endif OBJ 181736Speter 182736Speter /* 183736Speter * these are because of varying sizes of pointers 184736Speter */ 18510660Speter #ifdef ADDR16 18610660Speter # define PTR_AS O_AS2 18710660Speter # define PTR_RV O_RV2 18810660Speter # define PTR_IND O_IND2 18910660Speter # define PTR_CON O_CON2 19010660Speter # define PTR_DUP O_SDUP2 19110660Speter # define CON_INT O_CON2 19210660Speter # define INT_TYP (nl + T2INT) 19310660Speter # define PTR_DCL char * 19410660Speter # define TOOMUCH 50000 19510660Speter # define SHORTADDR 65536 19610660Speter # define MAXSET 65536 /* maximum set size */ 19710660Speter #endif ADDR16 19810660Speter #ifdef ADDR32 199736Speter # define PTR_AS O_AS4 200736Speter # define PTR_RV O_RV4 201736Speter # define PTR_IND O_IND4 2022948Smckusic # define PTR_CON O_CON4 2032948Smckusic # define PTR_DUP O_SDUP4 2043171Smckusic # define CON_INT O_CON24 2053171Smckusic # define INT_TYP (nl + T4INT) 206736Speter # define PTR_DCL unsigned long /* for pointer variables */ 207736Speter # define SHORTADDR 32768 /* maximum short address */ 208736Speter # define TOOMUCH 65536 /* maximum variable size */ 209736Speter # define MAXSET 65536 /* maximum set size */ 21010660Speter #endif ADDR32 21110660Speter /* 21210660Speter * Offsets due to the structure of the runtime stack. 21310660Speter * DPOFF1 is the amount of fixed storage in each block allocated 21410660Speter * as local variables for the runtime system. 21510660Speter * since locals are allocated negative offsets, 21610660Speter * -DPOFF1 is the last used implicit local offset. 21710660Speter * DPOFF2 is the size of the block mark. 21810660Speter * since arguments are allocated positive offsets, 21910660Speter * DPOFF2 is the end of the implicit arguments. 22010660Speter * for obj, the first argument has the highest offset 22110660Speter * from the stackpointer. and the block mark is an 22210660Speter * implicit last parameter. 22310660Speter * for pc, the first argument has the lowest offset 22410660Speter * from the argumentpointer. and the block mark is an 22510660Speter * implicit first parameter. 22610660Speter */ 227736Speter # ifdef OBJ 22810660Speter # ifdef ADDR32 22910660Speter # define MAGICNUM 0403 /* obj magic number */ 23010660Speter # define DPOFF1 0 23110660Speter # define DPOFF2 (sizeof (struct blockmark)) 23210660Speter # define INPUT_OFF -8 /* offset of `input' */ 23310660Speter # define OUTPUT_OFF -4 /* offset of `output' */ 23410660Speter # endif ADDR32 23510660Speter # ifdef ADDR16 23610660Speter # define MAGICNUM 0404 23710660Speter # define DPOFF1 0 23810660Speter # define DPOFF2 (sizeof (struct blockmark)) 23910660Speter # define INPUT_OFF -2 24010660Speter # define OUTPUT_OFF -4 24110660Speter # endif ADDR16 242736Speter # endif OBJ 243736Speter # ifdef PC 24410660Speter # define DPOFF1 ( sizeof (struct rtlocals) ) 24510660Speter # define DPOFF2 ( sizeof (struct blockmark) ) 246736Speter # define INPUT_OFF 0 247736Speter # define OUTPUT_OFF 0 248736Speter # endif PC 249