|
|
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.