|
|
1.1 ! root 1: /* ! 2: * External declarations for the linker. ! 3: */ ! 4: ! 5: #include "../h/rt.h" ! 6: ! 7: #ifdef ATT3B ! 8: #include <sys/types.h> ! 9: #include <sys/stat.h> ! 10: #endif ATT3B ! 11: ! 12: /* ! 13: * Miscellaneous external declarations. ! 14: */ ! 15: ! 16: extern FILE *infile; /* current input file */ ! 17: extern FILE *outfile; /* interpreter output file */ ! 18: extern FILE *dbgfile; /* debug file */ ! 19: extern char inname[]; /* input file name */ ! 20: extern char outname[]; /* output file name */ ! 21: extern char *pname; /* this program name (from command line) */ ! 22: extern int line; /* source program line number (from ucode) */ ! 23: extern char *file; /* source program file name (from ucode) */ ! 24: extern int statics; /* total number of statics */ ! 25: extern int dynoff; /* stack offset counter for locals */ ! 26: extern int argoff; /* stack offset counter for arguments */ ! 27: extern int static1; /* first static in procedure */ ! 28: extern int nlocal; /* number of locals in local table */ ! 29: extern int nconst; /* number of constants in constant table */ ! 30: extern int nrecords; /* number of records in program */ ! 31: extern int trace; /* initial setting of &trace */ ! 32: extern int Dflag; /* debug flag */ ! 33: extern char ixhdr[]; /* header line for direct execution */ ! 34: extern char *iconx; /* location of iconx to put in #! line */ ! 35: extern int hdrloc; /* location to place hdr block at */ ! 36: extern struct lfile *lfiles; /* list of files to link */ ! 37: extern struct lfile *getlfile(); ! 38: ! 39: /* ! 40: * Structures for symbol table entries. ! 41: */ ! 42: ! 43: struct lentry { /* local table entry */ ! 44: char *l_name; /* name of variable */ ! 45: int l_flag; /* variable flags */ ! 46: union { /* value field */ ! 47: int staticid; /* unique id for static variables */ ! 48: word offset; /* stack offset for args and locals */ ! 49: struct gentry *global; /* global table entry */ ! 50: } l_val; ! 51: }; ! 52: ! 53: struct gentry { /* global table entry */ ! 54: struct gentry *g_blink; /* link for bucket chain */ ! 55: char *g_name; /* name of variable */ ! 56: int g_flag; /* variable flags */ ! 57: int g_nargs; /* number of args or fields */ ! 58: int g_procid; /* procedure or record id */ ! 59: word g_pc; /* position in icode of object */ ! 60: }; ! 61: ! 62: struct centry { /* constant table entry */ ! 63: int c_flag; /* type of literal flag */ ! 64: union { /* value field */ ! 65: long ival; /* integer */ ! 66: double rval; /* real */ ! 67: char *sval; /* string */ ! 68: } c_val; ! 69: int c_length; /* length of literal string */ ! 70: word c_pc; /* position in icode of object */ ! 71: }; ! 72: ! 73: struct ientry { /* identifier table entry */ ! 74: struct ientry *i_blink; /* link for bucket chain */ ! 75: char *i_name; /* pointer to string */ ! 76: int i_length; /* length of string */ ! 77: }; ! 78: ! 79: struct fentry { /* field table header entry */ ! 80: struct fentry *f_blink; /* link for bucket chain */ ! 81: char *f_name; /* name of field */ ! 82: int f_fid; /* field id */ ! 83: struct rentry *f_rlist; /* head of list of records */ ! 84: }; ! 85: ! 86: struct rentry { /* field table record list entry */ ! 87: struct rentry *r_link; /* link for list of records */ ! 88: int r_recid; /* record id */ ! 89: int r_fnum; /* offset of field within record */ ! 90: }; ! 91: ! 92: /* ! 93: * Structure for linked list of file names to link. ! 94: */ ! 95: struct lfile { ! 96: struct lfile *lf_link; /* next file in list */ ! 97: char *lf_name; /* name of file */ ! 98: }; ! 99: ! 100: /* ! 101: * Flag values in symbol tables. ! 102: */ ! 103: ! 104: #define F_Global 01 /* variable declared global externally */ ! 105: #define F_Proc 05 /* procedure (includes GLOBAL) */ ! 106: #define F_Record 011 /* record (includes GLOBAL) */ ! 107: #define F_Dynamic 020 /* variable declared local dynamic */ ! 108: #define F_Static 040 /* variable declared local static */ ! 109: #define F_Builtin 0101 /* identifier refers to built-in procedure */ ! 110: #define F_ImpError 0400 /* procedure has default error */ ! 111: #define F_Argument 01000 /* variable is a formal parameter */ ! 112: #define F_IntLit 02000 /* literal is an integer */ ! 113: #define F_RealLit 04000 /* literal is a real */ ! 114: #define F_StrLit 010000 /* literal is a string */ ! 115: #define F_CsetLit 020000 /* literal is a cset */ ! 116: #define F_LongLit 040000 /* literal is a long integer */ ! 117: ! 118: /* ! 119: * Symbol table region pointers. ! 120: */ ! 121: ! 122: extern struct gentry **ghash; /* hash area for global table */ ! 123: extern struct ientry **ihash; /* hash area for identifier table */ ! 124: extern struct fentry **fhash; /* hash area for field table */ ! 125: ! 126: extern struct lentry *ltable; /* local table */ ! 127: extern struct gentry *gtable; /* global table */ ! 128: extern struct centry *ctable; /* constant table */ ! 129: extern struct ientry *itable; /* identifier table */ ! 130: extern struct fentry *ftable; /* field table headers */ ! 131: extern struct rentry *rtable; /* field table record lists */ ! 132: extern char *strings; /* string space */ ! 133: extern word *labels; /* label table */ ! 134: extern char *code; /* generated code space */ ! 135: ! 136: extern struct gentry *gfree; /* free pointer for global table */ ! 137: extern struct ientry *ifree; /* free pointer for identifier table */ ! 138: extern struct fentry *ffree; /* free pointer for field table headers */ ! 139: extern struct rentry *rfree; /* free pointer for field table record lists */ ! 140: extern char *strfree; /* free pointer for string space */ ! 141: extern char *codep; /* free pointer for code space */ ! 142: ! 143: extern word lsize; /* size of local table */ ! 144: extern word gsize; /* size of global table */ ! 145: extern word csize; /* size of constant table */ ! 146: extern word isize; /* size of identifier table */ ! 147: extern word fsize; /* size of field table headers */ ! 148: extern word rsize; /* size of field table record lists */ ! 149: extern word ssize; /* size of string space */ ! 150: extern word ihsize; /* size of identifier table hash area */ ! 151: extern word ghsize; /* size of global table hash area */ ! 152: extern word fhsize; /* size of field table hash area */ ! 153: extern word maxlabels; /* maximum number of labels per procedure */ ! 154: extern word maxcode; /* maximum amount of code per procedure */ ! 155: ! 156: extern int gmask; /* mask for global table hash */ ! 157: extern int imask; /* mask for identifier table hash */ ! 158: extern int fmask; /* mask for field table hash */ ! 159: ! 160: /* ! 161: * Symbol table parameters. ! 162: */ ! 163: ! 164: #define Lsize 100 /* default size of local table */ ! 165: #define GSize 200 /* default size of global table */ ! 166: #define CSize 100 /* default size of constant table */ ! 167: #define ISize 500 /* default size of identifier table */ ! 168: #define FSize 100 /* default size of field table headers */ ! 169: #define RSize 100 /* default size of field table record lists */ ! 170: #define StrSize 5000 /* default size of string space */ ! 171: #define GhSize 64 /* default size of global table hash area */ ! 172: #define IhSize 128 /* default size of identifier table hash area */ ! 173: #define FhSize 32 /* default size of field table hash area */ ! 174: #define MaxLabels 500 /* default maximum number of labels/proc */ ! 175: ! 176: /* ! 177: * Hash computation macros. ! 178: */ ! 179: ! 180: #define ghasher(x) (((word)x)&gmask) /* for global table */ ! 181: #define fhasher(x) (((word)x)&fmask) /* for field table */ ! 182: ! 183: /* ! 184: * Machine-dependent constants. ! 185: */ ! 186: ! 187: ! 188: #define RkBlkSize 9*WordSize /* size of record constructor block */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.