/* * External declarations for the linker. */ #include "..\h\rt.h" #ifdef ATT3B #include #include #endif /* ATT3B */ /* * Miscellaneous external declarations. */ extern FILE *infile; /* current input file */ extern FILE *outfile; /* linker output file */ extern FILE *dbgfile; /* debug file */ extern char inname[]; /* input file name */ extern int lineno; /* source program line number (from ucode) */ #ifdef EvalTrace extern int colmno; /* source program column number */ #endif /* EvalTrace */ extern int lstatics; /* total number of statics */ extern int argoff; /* stack offset counter for arguments */ extern int dynoff; /* stack offset counter for locals */ extern int static1; /* first static in procedure */ extern int nlocal; /* number of locals in local table */ extern int nconst; /* number of constants in constant table */ extern int nrecords; /* number of records in program */ extern int trace; /* initial setting of &trace */ extern char ixhdr[]; /* header line for direct execution */ extern char *iconx; /* location of iconx */ extern int hdrloc; /* location to place hdr block at */ extern struct lfile *llfiles; /* list of files to link */ /* * Structures for symbol table entries. */ struct lentry { /* local table entry */ char *l_name; /* name of variable */ int l_flag; /* variable flags */ union { /* value field */ int staticid; /* unique id for static variables */ word offset; /* stack offset for args and locals */ struct gentry *global; /* global table entry */ } l_val; }; struct gentry { /* global table entry */ struct gentry *g_blink; /* link for bucket chain */ char *g_name; /* name of variable */ int g_flag; /* variable flags */ int g_nargs; /* number of args or fields */ int g_procid; /* procedure or record id */ word g_pc; /* position in icode of object */ }; struct centry { /* constant table entry */ int c_flag; /* type of literal flag */ union { /* value field */ long ival; /* integer */ double rval; /* real */ char *sval; /* string */ } c_val; int c_length; /* length of literal string */ word c_pc; /* position in icode of object */ }; struct ientry { /* identifier table entry */ struct ientry *i_blink; /* link for bucket chain */ char *i_name; /* pointer to string */ int i_length; /* length of string */ }; struct fentry { /* field table header entry */ struct fentry *f_blink; /* link for bucket chain */ char *f_name; /* name of field */ int f_fid; /* field id */ struct rentry *f_rlist; /* head of list of records */ }; struct rentry { /* field table record list entry */ struct rentry *r_link; /* link for list of records */ int r_recid; /* record id */ int r_fnum; /* offset of field within record */ }; /* * Structure for linked list of file names to link. */ struct lfile { struct lfile *lf_link; /* next file in list */ char *lf_name; /* name of file */ }; /* * Flag values in symbol tables. */ #define F_Global 01 /* variable declared global externally */ #define F_Proc 05 /* procedure (includes GLOBAL) */ #define F_Record 011 /* record (includes GLOBAL) */ #define F_Dynamic 020 /* variable declared local dynamic */ #define F_Static 040 /* variable declared local static */ #define F_Builtin 0101 /* identifier refers to built-in procedure */ #define F_ImpError 0400 /* procedure has default error */ #define F_Argument 01000 /* variable is a formal parameter */ #define F_IntLit 02000 /* literal is an integer */ #define F_RealLit 04000 /* literal is a real */ #define F_StrLit 010000 /* literal is a string */ #define F_CsetLit 020000 /* literal is a cset */ /* * Symbol table region pointers. */ extern struct gentry **lghash; /* hash area for global table */ extern struct ientry **lihash; /* hash area for identifier table */ extern struct fentry **lfhash; /* hash area for field table */ extern struct lentry *lltable; /* local table */ extern struct gentry *lgtable; /* global table */ extern struct centry *lctable; /* constant table */ extern struct ientry *litable; /* identifier table */ extern struct fentry *lftable; /* field table headers */ extern struct rentry *lrtable; /* field table record lists */ extern struct ipc_fname *fnmtbl; /* table associating ipc with file name */ extern struct ipc_line *lntable; /* table associating ipc with line number */ extern char *lsspace; /* string space */ extern word *labels; /* label table */ extern char *codeb; /* generated code space */ extern struct gentry *lgfree; /* free pointer for global table */ extern struct ientry *lifree; /* free pointer for identifier table */ extern struct fentry *lffree; /* free pointer for field table headers */ extern struct rentry *lrfree; /* free pointer for field table record lists */ extern struct ipc_fname *fnmfree; /* free pointer for ipc/file name tbl */ extern struct ipc_line *lnfree; /* free pointer for ipc/line number tbl */ extern char *lsfree; /* free pointer for string space */ extern char *codep; /* free pointer for code space */ extern char *lsend; /* pointer to end of string space */ /* * Hash computation macros. */ #define ghasher(x) (((word)x)&gmask) /* for global table */ #define fhasher(x) (((word)x)&fmask) /* for field table */ /* * Machine-dependent constants. */ #define RkBlkSize 9*WordSize /* size of record constructor block */