122224Sdist /* 222224Sdist * Copyright (c) 1980 Regents of the University of California. 322224Sdist * All rights reserved. The Berkeley software License Agreement 422224Sdist * specifies the terms and conditions for redistribution. 522224Sdist * 6*44594Smckusick * @(#)objfmt.h 5.3 (Berkeley) 06/29/90 722224Sdist */ 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 6430001Smckusick #ifdef tahoe 6530001Smckusick /* 6630001Smckusick * the display is just the saved FP. 6730001Smckusick * arguments are at positive offsets, 6830001Smckusick * locals are at negative offsets. 6930001Smckusick * there are no offsets within the saved display structure. 7030001Smckusick */ 7130001Smckusick struct dispsave { 7230001Smckusick char *savedFP; 7330001Smckusick } display[ DSPLYSZ ]; 7430001Smckusick 7530001Smckusick # define AP_OFFSET 0 7630001Smckusick # define FP_OFFSET 0 7730001Smckusick #endif tahoe 7810660Speter #endif PC 7910660Speter 8010660Speter /* 8110660Speter * the structure below describes the block mark used by the architecture. 8210660Speter * this is the space used by the machine between the arguments and the 8310660Speter * whatever is used to point to the arguments. 8410660Speter */ 8510660Speter #ifdef OBJ 8610660Speter struct blockmark { 8710660Speter char *tos; /* pointer to top of stack frame */ 8810660Speter struct iorec *file; /* pointer to active file name */ 8910660Speter struct hdr { 9010660Speter long framesze; /* number of bytes of local vars */ 9110660Speter long nargs; /* number of bytes of arguments */ 9210660Speter long tests; /* TRUE => perform runtime tests */ 9310660Speter short offset; /* offset of procedure in source file */ 9410660Speter char name[1]; /* name of active procedure */ 9510660Speter } *entry; 9610660Speter struct dispsave odisp; /* previous display value for this level */ 9710660Speter struct dispsave *dp; /* pointer to active display entry */ 9810660Speter char *pc; /* previous location counter */ 9910660Speter long lino; /* previous line number */ 10010660Speter }; 10110660Speter #endif OBJ 10210660Speter #ifdef PC 10310660Speter #ifdef vax 10410660Speter /* 10510660Speter * since we have the ap pointing to the number of args: 10610660Speter */ 10710660Speter struct blockmark { 10810660Speter long nargs; 10910660Speter }; 11010660Speter #endif vax 11110660Speter #ifdef mc68000 11210660Speter /* 11310660Speter * there's the saved pc (from the jsr) 11410660Speter * and the saved a6 (from the link a6). 11510660Speter */ 11610660Speter struct blockmark { 11710660Speter char *savedpc; 11810660Speter char *saveda6; 11910660Speter }; 12010660Speter #endif mc68000 12130001Smckusick #ifdef tahoe 12230001Smckusick /* 12330001Smckusick * since we have the fp pointing to its predecessor 12430001Smckusick */ 12530001Smckusick struct blockmark { 12630001Smckusick long savedfp; 12730001Smckusick }; 12830001Smckusick #endif tahoe 12910660Speter #endif PC 13010660Speter 13110660Speter /* 13210660Speter * formal routine structure: 13310660Speter */ 13410660Speter struct formalrtn { 13510660Speter long (*fentryaddr)(); /* formal entry point */ 13610660Speter long fbn; /* block number of function */ 13710660Speter struct dispsave fdisp[ DSPLYSZ ]; /* saved at first passing */ 13814751Sthien }; 13914751Sthien #ifndef PC 14014751Sthien #ifndef OBJ 14114751Sthien struct formalrtn frtn; 14214751Sthien #endif 14314751Sthien #endif 14410660Speter 14510660Speter #define FENTRYOFFSET 0 14610660Speter #define FBNOFFSET ( FENTRYOFFSET + sizeof frtn.fentryaddr ) 14710660Speter #define FDISPOFFSET ( FBNOFFSET + sizeof frtn.fbn ) 14810660Speter 14910660Speter #ifdef OBJ 15010660Speter /* 151736Speter * the creation time, the size and the magic number of the obj file 152736Speter */ 153736Speter struct pxhdr { 1542948Smckusic long maketime; 1552948Smckusic long objsize; 1565642Smckusic long symtabsize; 157736Speter short magicnum; 158736Speter }; 159736Speter 16011880Smckusick /* 16111880Smckusick * START defines the beginning of the text space. 16211880Smckusick * This should be the defined external label "start", 16311880Smckusick * however there is no way to access externals from C 16411880Smckusick * whose names do not begin with an "_". 16511880Smckusick */ 16610660Speter #ifdef vax 16710720Smckusick # define HEADER_BYTES 2048 /* the size of px_header */ 16811880Smckusick # define START 0x0 /* beginning of text */ 16910660Speter #endif vax 17030001Smckusick #ifdef tahoe 171*44594Smckusick # define HEADER_BYTES 2560 /* the size of px_header */ 17230001Smckusick # define START 0x0 /* beginning of text */ 17330001Smckusick #endif tahoe 17410660Speter #ifdef mc68000 17510660Speter # define HEADER_BYTES 3072 /* the size of px_header */ 17611880Smckusick # define START 0x8000 /* beginning of text */ 17710660Speter #endif mc68000 1782088Smckusic # define INDX 1 /* amt to shift display index */ 179736Speter #endif OBJ 180736Speter 181736Speter /* 182736Speter * these are because of varying sizes of pointers 183736Speter */ 18410660Speter #ifdef ADDR16 18510660Speter # define PTR_AS O_AS2 18610660Speter # define PTR_RV O_RV2 18710660Speter # define PTR_IND O_IND2 18810660Speter # define PTR_CON O_CON2 18910660Speter # define PTR_DUP O_SDUP2 19010660Speter # define CON_INT O_CON2 19110660Speter # define INT_TYP (nl + T2INT) 19210660Speter # define PTR_DCL char * 19310660Speter # define TOOMUCH 50000 19410660Speter # define SHORTADDR 65536 19510660Speter # define MAXSET 65536 /* maximum set size */ 19610660Speter #endif ADDR16 19710660Speter #ifdef ADDR32 198736Speter # define PTR_AS O_AS4 199736Speter # define PTR_RV O_RV4 200736Speter # define PTR_IND O_IND4 2012948Smckusic # define PTR_CON O_CON4 2022948Smckusic # define PTR_DUP O_SDUP4 2033171Smckusic # define CON_INT O_CON24 2043171Smckusic # define INT_TYP (nl + T4INT) 205736Speter # define PTR_DCL unsigned long /* for pointer variables */ 206736Speter # define SHORTADDR 32768 /* maximum short address */ 207736Speter # define TOOMUCH 65536 /* maximum variable size */ 208736Speter # define MAXSET 65536 /* maximum set size */ 20910660Speter #endif ADDR32 21010660Speter /* 21110660Speter * Offsets due to the structure of the runtime stack. 21210660Speter * DPOFF1 is the amount of fixed storage in each block allocated 21310660Speter * as local variables for the runtime system. 21410660Speter * since locals are allocated negative offsets, 21510660Speter * -DPOFF1 is the last used implicit local offset. 21610660Speter * DPOFF2 is the size of the block mark. 21710660Speter * since arguments are allocated positive offsets, 21810660Speter * DPOFF2 is the end of the implicit arguments. 21910660Speter * for obj, the first argument has the highest offset 22010660Speter * from the stackpointer. and the block mark is an 22110660Speter * implicit last parameter. 22210660Speter * for pc, the first argument has the lowest offset 22310660Speter * from the argumentpointer. and the block mark is an 22410660Speter * implicit first parameter. 22510660Speter */ 226736Speter # ifdef OBJ 22710660Speter # ifdef ADDR32 22810660Speter # define MAGICNUM 0403 /* obj magic number */ 22910660Speter # define DPOFF1 0 23010660Speter # define DPOFF2 (sizeof (struct blockmark)) 23110660Speter # define INPUT_OFF -8 /* offset of `input' */ 23210660Speter # define OUTPUT_OFF -4 /* offset of `output' */ 23310660Speter # endif ADDR32 23410660Speter # ifdef ADDR16 23510660Speter # define MAGICNUM 0404 23610660Speter # define DPOFF1 0 23710660Speter # define DPOFF2 (sizeof (struct blockmark)) 23810660Speter # define INPUT_OFF -2 23910660Speter # define OUTPUT_OFF -4 24010660Speter # endif ADDR16 241736Speter # endif OBJ 242736Speter # ifdef PC 24310660Speter # define DPOFF1 ( sizeof (struct rtlocals) ) 24410660Speter # define DPOFF2 ( sizeof (struct blockmark) ) 245736Speter # define INPUT_OFF 0 246736Speter # define OUTPUT_OFF 0 247736Speter # endif PC 248