|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #define readonly
3: #define NINST 300
4: #define NSYM 4000
5: #define NHASH (NSYM+1)
6: #define NLOC 4 /* number of location ctrs */
7: #define NCPS 8 /* number of characters per symbol, fixed */
8:
9: /*
10: * Symbol types
11: */
12: #define XUNDEF 0x0
13: #define XABS 0x2
14: #define XTEXT 0x4
15: #define XDATA 0x6
16: #define XBSS 0x8
17: #define XDATAO 0xA
18: #define XBSSO 0xC
19: #define XTEXTO 0xE
20: #define XABSO 0x10
21: #define XUNDEFO 0x12
22:
23: #define XTXRN 0xA /* external symbol */
24: #define XXTRN 0x1
25: #define XTYPE 0x1E
26:
27: #define XFORW 0x20 /* Was forward-referenced when undefined */
28:
29: #define ERR (-1)
30: #define NBPW 32 /* Bits per word */
31:
32: #define AMASK 017
33:
34: /*
35: * Actual argument syntax types
36: */
37: #define AREG 1 /* %r */
38: #define ABASE 2 /* (%r) */
39: #define ADECR 3 /* -(%r) */
40: #define AINCR 4 /* (%r)+ */
41: #define ADISP 5 /* expr(%r) */
42: #define AEXP 6 /* expr */
43: #define AIMM 7 /* $ expr */
44: #define ASTAR 8 /* * */
45: #define AINDX 16 /* [%r] */
46:
47: /*
48: * Argument access types used to test validity of operands to operators
49: */
50: #define ACCA (8<<3) /* address only */
51: #define ACCR (1<<3) /* read */
52: #define ACCW (2<<3) /* write */
53: #define ACCM (3<<3) /* modify */
54: #define ACCB (4<<3) /* branch displacement */
55: #define ACCI (5<<3) /* XFC code */
56:
57: /*
58: * Argument data types
59: */
60: #define TYPB 0 /* byte */
61: #define TYPW 1 /* word */
62: #define TYPL 2 /* long */
63: #define TYPQ 3 /* quad */
64: #define TYPF 4 /* floating */
65: #define TYPD 5 /* double floating */
66:
67: #define TYPMASK 7
68:
69: /* reference types for loader */
70: #define PCREL 1
71: #define LEN1 2
72: #define LEN2 4
73: #define LEN4 6
74: #define LEN8 8
75:
76: #define TMPC 7 /* offset into the string /tmp/aaaXXX for creating tmp file names*/
77: #define HW 01
78: #define FW 03
79: #define DW 07
80:
81: #define PAGRND 0x1FFL
82:
83: #define round(x,y) (((x)+(y)) & ~(y))
84:
85: #define STABTYPS 0340
86: #define STABFLAG 0200
87:
88: /*
89: * Follows are the definitions for the symbol table tags, which are
90: * all unsigned characters..
91: * High value tags are generated by the asembler for internal
92: * use.
93: * Low valued tags are the parser coded tokens the scanner returns.
94: * There are several pertinant bounds in this ordering:
95: * a) Symbols greater than JXQUESTIONABLE
96: * are used by the jxxx bumper, indicating that
97: * the symbol table entry is a jxxx entry
98: * that has yet to be bumped.
99: * b) Symbols greater than IGNOREBOUND are not
100: * bequeathed to the loader; they are truly
101: * for assembler internal use only.
102: * c) Symbols greater than OKTOBUMP represent
103: * indices into the program text that should
104: * be changed in preceeding jumps or aligns
105: * must get turned into their long form.
106: */
107:
108: #define TAGMASK 0xFF
109:
110: # define JXACTIVE 0xFF /*jxxx instruction size unknown*/
111: # define JXNOTYET 0xFE /*jxxx instruction size known, but not yet expanded*/
112: # define JXALIGN 0xFD /*align jxxx entry*/
113: # define JXINACTIVE 0xFC /*jxxx instruction size known and expanded*/
114:
115: #define JXQUESTIONABLE 0xFB
116:
117: # define JXTUNNEL 0xFA /*jxxx instruction that jumps to another*/
118: # define OBSOLETE 0xF9 /*erroneously entered symbol*/
119:
120: #define IGNOREBOUND 0xF8 /*symbols greater than this are ignored*/
121: # define STABFLOATING 0xF7
122: # define LABELID 0xF6
123:
124: #define OKTOBUMP 0xF5
125: # define STABFIXED 0xF4
126:
127: /*
128: * astoks.h contains reserved word codings the parser should
129: * know about
130: */
131: #include "astoks.h"
132:
133: /*
134: * The structure for one symbol table entry.
135: * Symbol table entries are used for both user defined symbols,
136: * and symbol slots generated to create the jxxx jump from
137: * slots.
138: */
139:
140: #define symfirstfields char *name; unsigned char tag, type
141:
142: struct symtab{
143: symfirstfields;
144: #ifdef vax
145: short ___hole;
146: #endif
147: /*save*/ char ptype; /*tag == NAME*/
148:
149: #define jxbump ptype /*tag == JX..., how far to expand*/
150:
151: /*save*/ char other; /*for stab info*/
152:
153: /*save*/ short desc; /*tag == NAME*/
154:
155: #define jxfear desc /*how far needs to be bumped*/
156:
157: /*save*/ long value; /*address in the segment*/
158: char jxoveralign; /*if a JXXX, jumped over an align*/
159: short index; /*which segment*/
160: struct symtab *dest; /*if JXXX, where going to*/
161: #ifdef DJXXX
162: short jxline; /*source line of the jump from*/
163: #endif
164: };
165:
166: struct instab{
167: symfirstfields;
168:
169: #define opcode type /*use the same field as symtab.type*/
170:
171: char nargs; /*how many arguments*/
172: char argtype[6]; /*argument type info*/
173: };
174:
175: struct arg { /*one argument to an instruction*/
176: char atype;
177: char areg1;
178: char areg2;
179: char dispsize; /*usually d124, unless have B^, etc*/
180: struct exp *xp;
181: };
182:
183: struct exp {
184: char xtype;
185: char xloc;
186: long xvalue;
187: struct symtab *xname;
188: union{
189: double dvalue;
190: struct {
191: unsigned int doub_MSW, doub_LSW;
192: } dis_dvalue;
193: } doubval;
194: };
195:
196: /*
197: * Magic layout macros
198: */
199: #define MINBYTE -128
200: #define MAXBYTE 127
201: #define MINWORD -32768
202: #define MAXWORD 32767
203:
204: #define LITFLTMASK 0x000043F0 /*really magic*/
205: /*
206: * Is the floating point double word in xp a
207: * short literal floating point number?
208: */
209: #define slitflt(xp) \
210: ( (xp->doubval.dis_dvalue.doub_LSW == 0) \
211: && ((xp->doubval.dis_dvalue.doub_MSW & LITFLTMASK) \
212: == xp->doubval.dis_dvalue.doub_MSW) )
213:
214: #define extlitflt(xp) \
215: xp->doubval.dis_dvalue.doub_MSW >> 4
216:
217: /*
218: * Structure that appears at the head of a.out
219: */
220: struct hdr {
221: long magic;
222: long tsize;
223: long dsize;
224: long bsize;
225: long ssize;
226: long entry;
227: long trsize;
228: long drsize;
229: };
230:
231: struct arg arglist[6]; /*building operands in instructions*/
232: struct exp explist[20]; /*building up a list of expressions*/
233:
234: /*
235: * Communication between the scanner and the jxxx handlers.
236: * lastnam: the last name seen on the input
237: * lastjxxx: pointer to the last symbol table entry for
238: * a jump from
239: */
240: extern struct symtab *lastnam;
241: extern struct symtab *lastjxxx;
242: /*
243: * For each of the named .text .data segments
244: * (introduced by .text <expr>), we maintain
245: * the current value of the dot, and the Files where
246: * the information for each of the segments is salted
247: * away.
248: *
249: * Use of rulesfile and usefile is unclear
250: */
251: extern struct exp usedot[NLOC+NLOC];
252: extern FILE *usefile[NLOC+NLOC];
253: extern FILE *rusefile[NLOC+NLOC];
254: /*
255: * Strings used to construct the temporary files
256: * for each of the named segments in pass 2.
257: */
258: extern char *tmpn2; /* /tmp/aaaXXXX */
259: extern char *tmpn3; /* /tmp/aabXXX */
260:
261: extern struct exp *dotp; /*the current dot location*/
262: extern int loctr;
263: extern long tsize; /* total text size */
264: extern long dsize; /* total data size */
265: extern long datbase; /* base of the data segment */
266: /*
267: * Bitoff and bitfield keep track of the packing into
268: * bytes mandated by the expression syntax <expr> ':' <expr>
269: */
270: extern int bitoff;
271: extern long bitfield;
272:
273: /*
274: * The lexical analyzer builds up symbols in yytext. Lookup
275: * expects its argument in this buffer
276: */
277: extern char yytext[NCPS+2]; /* text buffer for lexical */
278: /*
279: * Variables to manage the input assembler source file
280: */
281: extern int lineno; /*the line number*/
282: extern char *dotsname; /*the name of the as source*/
283: /*extern FILE stdin*;*/ /*the as source input*/
284:
285: extern FILE *txtfil; /* file for text*/
286: extern FILE *tmpfil; /* interpass communication*/
287: extern FILE *relfil; /* holds relocation informtion*/
288:
289: extern int passno; /* 1 or 2 */
290:
291: extern int anyerrs; /*errors assembling arguments*/
292: extern int silent; /*don't mention the errors*/
293: extern int savelabels; /*save labels in a.out*/
294: int orgwarn; /* questionable origin ? */
295: int useVM; /*use virtual memory temp file*/
296: #ifdef DEBUG
297: extern int debug;
298: extern int toktrace;
299: #endif
300: /*
301: * Information about the instructions
302: */
303: struct instab *itab[NINST]; /*maps opcodes to instructions*/
304: extern readonly struct instab instab[];
305:
306: int curlen; /*current storage size*/
307:
308: struct symtab **lookup(); /*argument in yytext*/
309: struct symtab *symalloc();
310:
311: #ifdef METRIC
312: int outcounters; /*should we print them?*/
313: int nhcollision;
314: int nhashed;
315: int nentered;
316: int lgtmpfile;
317: int jxxxiterate;
318: int jxxxtunnel; /*how many tunnel jumps done*/
319: int jxdeadlock;
320: int nbadjxsegs;
321: #endif
322:
323:
324: #define outb(val) {dotp->xvalue++; if (passno==2) putc((val), txtfil);}
325:
326: #define outs(cp, lg) dotp->xvalue += (lg); if (passno == 2) fwrite((cp), 1, (lg), txtfil)
327:
328: /*
329: * Most of the time, the argument to flushfield is a power of two constant,
330: * the calculations involving it can be optimized to shifts.
331: */
332: #define flushfield(n) if (bitoff != 0) Flushfield( ( (bitoff+n-1) /n ) * n)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.