|
|
1.1 ! root 1: /* ! 2: * External declarations for the linker. ! 3: */ ! 4: ! 5: #include <stdio.h> ! 6: #include "../h/config.h" ! 7: ! 8: /* ! 9: * Miscellaneous external declarations. ! 10: */ ! 11: ! 12: extern FILE *infile; /* current input file */ ! 13: extern FILE *outfile; /* interpreter output file */ ! 14: extern FILE *dbgfile; /* debug file */ ! 15: extern char inname[]; /* input file name */ ! 16: extern char outname[]; /* output file name */ ! 17: extern char *pname; /* this program name (from command line) */ ! 18: extern int line; /* source program line number (from ucode) */ ! 19: extern char *file; /* source program file name (from ucode) */ ! 20: extern int statics; /* total number of statics */ ! 21: extern int dynoff; /* stack offset counter for locals */ ! 22: extern int argoff; /* stack offset counter for arguments */ ! 23: extern int static1; /* first static in procedure */ ! 24: extern int nlocal; /* number of locals in local table */ ! 25: extern int nconst; /* number of constants in constant table */ ! 26: extern int nrecords; /* number of records in program */ ! 27: extern int trace; /* initial setting of &trace */ ! 28: extern int Dflag; /* debug flag */ ! 29: extern char ixhdr[]; /* header line for direct execution */ ! 30: extern char *iconx; /* location of iconx to put in #! line */ ! 31: extern int hdrloc; /* location to place hdr block at */ ! 32: extern struct lfile *lfiles; /* list of files to link */ ! 33: extern struct lfile *getlfile(); ! 34: ! 35: /* ! 36: * Interpreter code file header - this is written at the start of ! 37: * an icode file after the start-up program (if any) and the #! line. ! 38: */ ! 39: struct header { ! 40: int size; /* size of interpreter code */ ! 41: int trace; /* initial value of &trace */ ! 42: int records; /* location of record blocks */ ! 43: int ftab; /* location of record/field table */ ! 44: int globals; /* location of global variables */ ! 45: int gnames; /* location of names of globals */ ! 46: int statics; /* location of static variables */ ! 47: int ident; /* location of identifier table */ ! 48: } hdr; ! 49: ! 50: /* ! 51: * Structures for symbol table entries. ! 52: */ ! 53: ! 54: struct lentry { /* local table entry */ ! 55: char *l_name; /* name of variable */ ! 56: int l_flag; /* variable flags */ ! 57: union { /* value field */ ! 58: int staticid; /* unique id for static variables */ ! 59: int offset; /* stack offset for args and locals */ ! 60: struct gentry *global; /* global table entry */ ! 61: } l_val; ! 62: }; ! 63: ! 64: struct gentry { /* global table entry */ ! 65: struct gentry *g_blink; /* link for bucket chain */ ! 66: char *g_name; /* name of variable */ ! 67: int g_flag; /* variable flags */ ! 68: int g_nargs; /* number of args or fields */ ! 69: int g_procid; /* procedure or record id */ ! 70: int g_pc; /* position in icode of object */ ! 71: }; ! 72: ! 73: struct centry { /* constant table entry */ ! 74: int c_flag; /* type of literal flag */ ! 75: union { /* value field */ ! 76: long ival; /* integer */ ! 77: double rval; /* real */ ! 78: char *sval; /* string */ ! 79: } c_val; ! 80: int c_length; /* length of literal string */ ! 81: int c_pc; /* position in icode of object */ ! 82: }; ! 83: ! 84: struct ientry { /* identifier table entry */ ! 85: struct ientry *i_blink; /* link for bucket chain */ ! 86: char *i_name; /* pointer to string */ ! 87: int i_length; /* length of string */ ! 88: }; ! 89: ! 90: struct fentry { /* field table header entry */ ! 91: struct fentry *f_blink; /* link for bucket chain */ ! 92: char *f_name; /* name of field */ ! 93: int f_fid; /* field id */ ! 94: struct rentry *f_rlist; /* head of list of records */ ! 95: }; ! 96: ! 97: struct rentry { /* field table record list entry */ ! 98: struct rentry *r_link; /* link for list of records */ ! 99: int r_recid; /* record id */ ! 100: int r_fnum; /* offset of field within record */ ! 101: }; ! 102: ! 103: /* ! 104: * Structure for linked list of file names to link. ! 105: */ ! 106: struct lfile { ! 107: struct lfile *lf_link; /* next file in list */ ! 108: char *lf_name; /* name of file */ ! 109: }; ! 110: ! 111: /* ! 112: * Flag values in symbol tables. ! 113: */ ! 114: ! 115: #define F_GLOBAL 01 /* variable declared global externally */ ! 116: #define F_PROC 05 /* procedure (includes GLOBAL) */ ! 117: #define F_RECORD 011 /* record (includes GLOBAL) */ ! 118: #define F_DYNAMIC 020 /* variable declared local dynamic */ ! 119: #define F_STATIC 040 /* variable declared local static */ ! 120: #define F_BUILTIN 0101 /* identifier refers to built-in procedure */ ! 121: #define F_IMPERROR 0400 /* procedure has default error */ ! 122: #define F_ARGUMENT 01000 /* variable is a formal parameter */ ! 123: #define F_INTLIT 02000 /* literal is an integer */ ! 124: #define F_REALLIT 04000 /* literal is a real */ ! 125: #define F_STRLIT 010000 /* literal is a string */ ! 126: #define F_CSETLIT 020000 /* literal is a cset */ ! 127: #define F_LONGLIT 040000 /* literal is a long integer */ ! 128: ! 129: /* ! 130: * Symbol table region pointers. ! 131: */ ! 132: ! 133: extern struct gentry **ghash; /* hash area for global table */ ! 134: extern struct ientry **ihash; /* hash area for identifier table */ ! 135: extern struct fentry **fhash; /* hash area for field table */ ! 136: ! 137: extern struct lentry *ltable; /* local table */ ! 138: extern struct gentry *gtable; /* global table */ ! 139: extern struct centry *ctable; /* constant table */ ! 140: extern struct ientry *itable; /* identifier table */ ! 141: extern struct fentry *ftable; /* field table headers */ ! 142: extern struct rentry *rtable; /* field table record lists */ ! 143: extern char *strings; /* string space */ ! 144: extern int *labels; /* label table */ ! 145: extern char *code; /* generated code space */ ! 146: ! 147: extern struct gentry *gfree; /* free pointer for global table */ ! 148: extern struct ientry *ifree; /* free pointer for identifier table */ ! 149: extern struct fentry *ffree; /* free pointer for field table headers */ ! 150: extern struct rentry *rfree; /* free pointer for field table record lists */ ! 151: extern char *sfree; /* free pointer for string space */ ! 152: extern char *codep; /* free pointer for code space */ ! 153: ! 154: extern int lsize; /* size of local table */ ! 155: extern int gsize; /* size of global table */ ! 156: extern int csize; /* size of constant table */ ! 157: extern int isize; /* size of identifier table */ ! 158: extern int fsize; /* size of field table headers */ ! 159: extern int rsize; /* size of field table record lists */ ! 160: extern int ssize; /* size of string space */ ! 161: extern int ihsize; /* size of identifier table hash area */ ! 162: extern int ghsize; /* size of global table hash area */ ! 163: extern int fhsize; /* size of field table hash area */ ! 164: extern int maxlabels; /* maximum number of labels per procedure */ ! 165: extern int maxcode; /* maximum amount of code per procedure */ ! 166: ! 167: extern int gmask; /* mask for global table hash */ ! 168: extern int imask; /* mask for identifier table hash */ ! 169: extern int fmask; /* mask for field table hash */ ! 170: ! 171: /* ! 172: * Symbol table parameters. ! 173: */ ! 174: ! 175: #define LSIZE 100 /* default size of local table */ ! 176: #define GSIZE 200 /* default size of global table */ ! 177: #define CSIZE 100 /* default size of constant table */ ! 178: #define ISIZE 500 /* default size of identifier table */ ! 179: #define FSIZE 100 /* default size of field table headers */ ! 180: #define RSIZE 100 /* default size of field table record lists */ ! 181: #define SSIZE 5000 /* default size of string space */ ! 182: #define GHSIZE 64 /* default size of global table hash area */ ! 183: #define IHSIZE 128 /* default size of identifier table hash area */ ! 184: #define FHSIZE 32 /* default size of field table hash area */ ! 185: #define MAXLABELS 500 /* default maximum number of labels/proc */ ! 186: ! 187: /* ! 188: * Hash computation macros. ! 189: */ ! 190: ! 191: #define ghasher(x) (((int)x)&gmask) /* for global table */ ! 192: #define fhasher(x) (((int)x)&fmask) /* for field table */ ! 193: ! 194: /* ! 195: * Machine-dependent constants. ! 196: */ ! 197: #ifdef VAX ! 198: #define INTSIZE 32 /* # of bits in an int */ ! 199: #define LOGINTSIZE 5 /* log of INTSIZE */ ! 200: #define MAXCODE 10000 /* default maximum amount of code/proc */ ! 201: #define OPSIZE 1 /* # of bytes for opcode */ ! 202: #define OPNDSIZE 4 /* # of bytes in interpreter operands */ ! 203: #define WORDSIZE sizeof(int *) /* # of bytes in a pointer (sizeof(int *)) */ ! 204: #endif VAX ! 205: ! 206: #ifdef PORT ! 207: #define INTSIZE x /* # of bits in an int */ ! 208: #define LOGINTSIZE x /* log of INTSIZE */ ! 209: /*#define LONGS /* longs are different from ints */ ! 210: /*#define MINSHORT x /* smallest short integer */ ! 211: /*#define MAXSHORT x /* largest short integer */ ! 212: #define MAXCODE x /* default maximum amount of code/proc */ ! 213: #define OPSIZE 1 /* # of bytes for opcode */ ! 214: #define OPNDSIZE 4 /* # of bytes in interpreter operands */ ! 215: #define WORDSIZE 4 /* # of bytes in a pointer (sizeof(int *)) */ ! 216: #endif PORT ! 217: ! 218: #ifdef PDP11 ! 219: #define INTSIZE 16 /* # of bits in an int */ ! 220: #define LOGINTSIZE 4 /* log of INTSIZE */ ! 221: #define LONGS /* longs are different from ints */ ! 222: #define MINSHORT 0100000 /* smallest short integer */ ! 223: #define MAXSHORT 077777 /* largest short integer */ ! 224: #define MAXCODE 2000 /* default maximum amount of code/proc */ ! 225: #define OPSIZE 1 /* # of bytes for opcode */ ! 226: #define OPNDSIZE 2 /* # of bytes in interpreter operands */ ! 227: #define WORDSIZE sizeof(int *) /* # of bytes in a pointer (sizeof(int *)) */ ! 228: #endif PDP11 ! 229: ! 230: #define RKBLKSIZE 9*WORDSIZE /* size of record constructor block */ ! 231: #define BITOFFMASK (INTSIZE-1) ! 232: #define CSETSIZE (256/INTSIZE) /* number of ints to hold 256 cset ! 233: bits. Use (256/INTSIZE)+1 if ! 234: 256 % INTSIZE != 0 */ ! 235: ! 236: #define MAXHDR 1024 /* size of autoloading header */ ! 237: #define HDRFILE IconxHdr ! 238: ! 239: /* ! 240: * Cset accessing macros. The definition of setb(b,c) is the total ! 241: * result of the following definitions. setb is only used in ! 242: * code.c/emitcon. ! 243: */ ! 244: /* ! 245: * Offset in word of cs bit. ! 246: */ ! 247: #define CSOFF(b) ((b) & BITOFFMASK) ! 248: /* ! 249: * Address of word of cs bit. ! 250: */ ! 251: #define CSPTR(b,c) ((c) + (((b)&0377) >> LOGINTSIZE)) ! 252: /* ! 253: * Set bit b in cset c. ! 254: */ ! 255: #define setb(b,c) (*CSPTR(b,c) |= (01 << CSOFF(b))) ! 256: /* ! 257: * Test bit b in cset c. ! 258: */ ! 259: #define tstb(b,c) ((*CSPTR(b,c) >> CSOFF(b)) & 01)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.