xref: /plan9/sys/src/cmd/8l/l.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../8c/8.out.h"
5 
6 #define	P		((Prog*)0)
7 #define	S		((Sym*)0)
8 #define	TNAME		(curtext?curtext->from.sym->name:noname)
9 #define	CPUT(c)\
10 	{ *cbp++ = c;\
11 	if(--cbc <= 0)\
12 		cflush(); }
13 
14 typedef	struct	Adr	Adr;
15 typedef	struct	Prog	Prog;
16 typedef	struct	Sym	Sym;
17 typedef	struct	Auto	Auto;
18 typedef	struct	Optab	Optab;
19 
20 struct	Adr
21 {
22 	union
23 	{
24 		long	offset;
25 		char	scon[8];
26 		Prog	*cond;	/* not used, but should be D_BRANCH */
27 		Ieee	ieee;
28 	};
29 	union
30 	{
31 		Auto*	autom;
32 		Sym*	sym;
33 	};
34 	short	type;
35 	char	index;
36 	char	scale;
37 };
38 
39 struct	Prog
40 {
41 	Adr	from;
42 	Adr	to;
43 	union
44 	{
45 		Prog	*forwd;
46 	};
47 	Prog*	link;
48 	Prog*	cond;	/* work on this */
49 	long	pc;
50 	long	line;
51 	uchar	mark;	/* work on these */
52 	uchar	back;
53 
54 	short	as;
55 	char	width;		/* fake for DATA */
56 };
57 struct	Auto
58 {
59 	Sym*	sym;
60 	Auto*	link;
61 	long	offset;
62 	short	type;
63 };
64 struct	Sym
65 {
66 	char	*name;
67 	short	type;
68 	short	version;
69 	short	become;
70 	short	frame;
71 	long	value;
72 	Sym*	link;
73 };
74 struct	Optab
75 {
76 	short	as;
77 	uchar*	ytab;
78 	uchar	prefix;
79 	uchar	op[10];
80 };
81 
82 enum
83 {
84 	STEXT		= 1,
85 	SDATA,
86 	SBSS,
87 	SDATA1,
88 	SXREF,
89 	SFILE,
90 	SCONST,
91 
92 	NHASH		= 10007,
93 	NHUNK		= 100000,
94 	MINSIZ		= 4,
95 	STRINGSZ	= 200,
96 	MINLC		= 1,
97 	MAXIO		= 8192,
98 	MAXHIST		= 20,				/* limit of path elements for history symbols */
99 
100 	Yxxx		= 0,
101 	Ynone,
102 	Yi0,
103 	Yi1,
104 	Yi8,
105 	Yi32,
106 	Yiauto,
107 	Yal,
108 	Ycl,
109 	Yax,
110 	Ycx,
111 	Yrb,
112 	Yrl,
113 	Yrf,
114 	Yf0,
115 	Yrx,
116 	Ymb,
117 	Yml,
118 	Ym,
119 	Ybr,
120 	Ycol,
121 
122 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
123 	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
124 	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,
125 	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
126 	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,
127 	Ymax,
128 
129 	Zxxx		= 0,
130 
131 	Zlit,
132 	Z_rp,
133 	Zbr,
134 	Zcall,
135 	Zib_,
136 	Zib_rp,
137 	Zibo_m,
138 	Zil_,
139 	Zil_rp,
140 	Zilo_m,
141 	Zjmp,
142 	Zloop,
143 	Zm_o,
144 	Zm_r,
145 	Zaut_r,
146 	Zo_m,
147 	Zpseudo,
148 	Zr_m,
149 	Zrp_,
150 	Z_ib,
151 	Z_il,
152 	Zm_ibo,
153 	Zm_ilo,
154 	Zclr,
155 	Zbyte,
156 	Zmov,
157 	Zmax,
158 
159 	Px		= 0,
160 	Pe		= 0x66,	/* operand escape */
161 	Pm		= 0x0f,	/* 2byte opcode escape */
162 	Pq		= 0xff,	/* both escape */
163 	Pb		= 0xfe,	/* byte operands */
164 };
165 
166 union
167 {
168 	struct
169 	{
170 		char	cbuf[MAXIO];			/* output buffer */
171 		uchar	xbuf[MAXIO];			/* input buffer */
172 	};
173 	char	dbuf[1];
174 } buf;
175 
176 long	HEADR;
177 long	HEADTYPE;
178 long	INITDAT;
179 long	INITRND;
180 long	INITTEXT;
181 char*	INITENTRY;		/* entry point */
182 Biobuf	bso;
183 long	bsssize;
184 long	casepc;
185 int	cbc;
186 char*	cbp;
187 char*	pcstr;
188 int	cout;
189 Auto*	curauto;
190 Auto*	curhist;
191 Prog*	curp;
192 Prog*	curtext;
193 Prog*	datap;
194 Prog*	edatap;
195 long	datsize;
196 char	debug[128];
197 char	literal[32];
198 Prog*	etextp;
199 Prog*	firstp;
200 char	fnuxi8[8];
201 char	fnuxi4[4];
202 Sym*	hash[NHASH];
203 Sym*	histfrog[MAXHIST];
204 int	histfrogp;
205 int	histgen;
206 char*	library[50];
207 int	libraryp;
208 char*	hunk;
209 char	inuxi1[1];
210 char	inuxi2[2];
211 char	inuxi4[4];
212 char	ycover[Ymax*Ymax];
213 uchar*	andptr;
214 uchar	and[10];
215 char	reg[D_NONE];
216 Prog*	lastp;
217 long	lcsize;
218 int	maxop;
219 int	nerrors;
220 long	nhunk;
221 long	nsymbol;
222 char*	noname;
223 char*	outfile;
224 long	pc;
225 int	printcol;
226 long	spsize;
227 Sym*	symlist;
228 long	symsize;
229 Prog*	textp;
230 long	textsize;
231 long	thunk;
232 int	version;
233 Prog	zprg;
234 int	dtype;
235 
236 extern	Optab	optab[];
237 extern	char*	anames[];
238 
239 int	Aconv(void*, Fconv*);
240 int	Dconv(void*, Fconv*);
241 int	Pconv(void*, Fconv*);
242 int	Rconv(void*, Fconv*);
243 int	Sconv(void*, Fconv*);
244 int	Xconv(void*, Fconv*);
245 void	addhist(long, int);
246 Prog*	appendp(Prog*);
247 void	asmb(void);
248 void	asmins(Prog*);
249 void	asmlc(void);
250 void	asmsp(void);
251 void	asmsym(void);
252 int	atoi(char*);
253 long	atolwhex(char*);
254 Prog*	brchain(Prog*);
255 Prog*	brloop(Prog*);
256 void	cflush(void);
257 Prog*	copyp(Prog*);
258 double	cputime(void);
259 void	datblk(long, long);
260 void	diag(char*, ...);
261 void	dodata(void);
262 void	doinit(void);
263 void	doprof1(void);
264 void	doprof2(void);
265 void	dostkoff(void);
266 long	entryvalue(void);
267 void	errorexit(void);
268 int	find1(long, int);
269 int	find2(long, int);
270 void	follow(void);
271 void	gethunk(void);
272 void	histtoauto(void);
273 double	ieeedtod(Ieee*);
274 long	ieeedtof(Ieee*);
275 void	ldobj(int, long, char*);
276 void	loadlib(int, int);
277 void	listinit(void);
278 Sym*	lookup(char*, int);
279 void	lput(long);
280 void	lputl(long);
281 void	main(int, char*[]);
282 void	mkfwd(void);
283 void	nuxiinit(void);
284 void	objfile(char*);
285 int	opsize(Prog*);
286 void	patch(void);
287 Prog*	prg(void);
288 int	relinv(int);
289 long	reuse(Prog*, Sym*);
290 long	rnd(long, long);
291 void	s8put(char*);
292 void	span(void);
293 void	undef(void);
294 void	xdefine(char*, int, long);
295 void	xfol(Prog*);
296 int	zaddr(uchar*, Adr*, Sym*[]);
297 long	vaddr(Adr*);
298