xref: /plan9-contrib/sys/src/cmd/il/l.h (revision ce95e1b3727b9cb1c223ffbed69aff21a8ced255)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../ic/i.out.h"
5 #include	"../8l/elf.h"
6 
7 #ifndef	EXTERN
8 #define	EXTERN	extern
9 #endif
10 
11 typedef vlong xlong;
12 
13 typedef	struct	Adr	Adr;
14 typedef	struct	Sym	Sym;
15 typedef	struct	Autom	Auto;
16 typedef	struct	Prog	Prog;
17 typedef	struct	Optab	Optab;
18 typedef	struct	Oprang	Oprang;
19 typedef	uchar	Opcross[32][32];
20 typedef	struct	Count	Count;
21 
22 #define	P		((Prog*)0)
23 #define	S		((Sym*)0)
24 #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
25 
26 struct	Adr
27 {
28 	union
29 	{
30 		long	u0offset;
31 		char*	u0sval;
32 		Ieee*	u0ieee;
33 		vlong*	u0vval;
34 	} u0;
35 	union
36 	{
37 		Auto*	u1autom;
38 		Sym*	u1sym;
39 	} u1;
40 	char	type;
41 	char	reg;
42 	char	name;
43 	char	class;
44 };
45 
46 #define	offset	u0.u0offset
47 #define	sval	u0.u0sval
48 #define	ieee	u0.u0ieee
49 #define	vval	u0.u0vval
50 
51 #define	autom	u1.u1autom
52 #define	sym	u1.u1sym
53 
54 struct	Prog
55 {
56 	Adr	from;
57 	Adr	to;
58 	union
59 	{
60 		long	u0regused;
61 		Prog*	u0forwd;
62 	} u0;
63 	Prog*	cond;
64 	Prog*	link;
65 	long	pc;
66 	long	line;
67 	uchar	mark;
68 	uchar	optab;
69 	char	as;
70 	char	reg;
71 };
72 #define	regused	u0.u0regused
73 #define	forwd	u0.u0forwd
74 
75 struct	Sym
76 {
77 	char	*name;
78 	short	type;
79 	short	version;
80 	short	become;
81 	short	frame;
82 	ushort	file;
83 	long	value;
84 	long	sig;
85 	Sym*	link;
86 };
87 struct	Autom
88 {
89 	Sym*	asym;
90 	Auto*	link;
91 	long	aoffset;
92 	short	type;
93 };
94 struct	Optab
95 {
96 	char	as;
97 	char	a1;
98 	char	a3;
99 	char	type;
100 	char	ctype;
101 	char	size;
102 	char	op;
103 	char	func3;
104 	short	param;
105 };
106 struct	Oprang
107 {
108 	Optab*	start;
109 	Optab*	stop;
110 };
111 struct	Count
112 {
113 	long	count;
114 	long	outof;
115 };
116 
117 enum
118 {
119 	STEXT		= 1,
120 	SDATA,
121 	SBSS,
122 	SDATA1,
123 	SXREF,
124 	SLEAF,
125 	SFILE,
126 	SCONST,
127 	SSTRING,
128 
129 	C_NONE		= 0,
130 	C_REG,
131 	C_CTLREG,
132 	C_FREG,
133 	C_ZREG,
134 	C_ZCON,
135 	C_SCON,
136 	C_UCON,
137 	C_LCON,
138 	C_VCON,
139 	C_FCON,
140 	C_SACON,
141 	C_SECON,
142 	C_LACON,
143 	C_LECON,
144 	C_SRCON,
145 	C_LRCON,
146 	C_SBRA,
147 	C_LBRA,
148 	C_SAUTO,
149 	C_ZOREG,
150 	C_SOREG,
151 	C_LOREG,
152 	C_LAUTO,
153 	C_SEXT,
154 	C_LEXT,
155 	C_GOK,
156 
157 	NSCHED		= 20,
158 
159 /* mark flags */
160 	FOLL		= 1<<0,
161 	LABEL		= 1<<1,
162 	LEAF		= 1<<2,
163 	SYNC		= 1<<3,
164 	BRANCH		= 1<<4,
165 	COMPR		= 1<<5,
166 	SPASS		= 1<<6,
167 
168 	BIG		= 2048,
169 	STRINGSZ	= 200,
170 	NHASH		= 10007,
171 	NHUNK		= 100000,
172 	MINSIZ		= 64,
173 	NENT		= 100,
174 	MAXIO		= 8192,
175 	MAXHIST		= 20,				/* limit of path elements for history symbols */
176 };
177 
178 /* Major opcodes */
179 enum {
180 	OLOAD,	 OLOAD_FP,  Ocustom_0,	OMISC_MEM, OOP_IMM, OAUIPC, OOP_IMM_32,	O48b,
181 	OSTORE,	 OSTORE_FP, Ocustom_1,	OAMO,	   OOP,	    OLUI,   OOP_32,	O64b,
182 	OMADD,	 OMSUB,	    ONMSUB,	ONMADD,	   OOP_FP,  Ores_0, Ocustom_2,	O48b_2,
183 	OBRANCH, OJALR,	    Ores_1,	OJAL,	   OSYSTEM, Ores_2, Ocustom_3,	O80b
184 };
185 
186 EXTERN union
187 {
188 	struct
189 	{
190 		uchar	obuf[MAXIO];			/* output buffer */
191 		uchar	ibuf[MAXIO];			/* input buffer */
192 	} u;
193 	char	dbuf[1];
194 } buf;
195 
196 #define	cbuf	u.obuf
197 #define	xbuf	u.ibuf
198 
199 EXTERN	long	HEADR;			/* length of header */
200 EXTERN	int	HEADTYPE;		/* type of header */
201 EXTERN	xlong	INITDAT;		/* data location */
202 EXTERN	xlong	INITRND;		/* data round above text location */
203 EXTERN	xlong	INITTEXT;		/* text location */
204 EXTERN	xlong	INITTEXTP;		/* text location (physical) */
205 EXTERN	char*	INITENTRY;		/* entry point */
206 EXTERN	long	autosize;
207 EXTERN	Biobuf	bso;
208 EXTERN	long	bsssize;
209 EXTERN	int	cbc;
210 EXTERN	uchar*	cbp;
211 EXTERN	int	cout;
212 EXTERN	Auto*	curauto;
213 EXTERN	Auto*	curhist;
214 EXTERN	Prog*	curp;
215 EXTERN	Prog*	curtext;
216 EXTERN	Prog*	datap;
217 EXTERN	long	datsize;
218 EXTERN	char	debug[128];
219 EXTERN	Prog*	etextp;
220 EXTERN	Prog*	firstp;
221 EXTERN	char	fnuxi4[4];	/* for 3l [sic] */
222 EXTERN	char	fnuxi8[8];
223 EXTERN	char*	noname;
224 EXTERN	Sym*	hash[NHASH];
225 EXTERN	Sym*	histfrog[MAXHIST];
226 EXTERN	int	histfrogp;
227 EXTERN	int	histgen;
228 EXTERN	char*	library[50];
229 EXTERN	char*	libraryobj[50];
230 EXTERN	int	libraryp;
231 EXTERN	int	xrefresolv;
232 EXTERN	char*	hunk;
233 EXTERN	char	inuxi1[1];
234 EXTERN	char	inuxi2[2];
235 EXTERN	char	inuxi4[4];
236 EXTERN	char	inuxi8[8];
237 EXTERN	Prog*	lastp;
238 EXTERN	long	lcsize;
239 EXTERN	char	literal[32];
240 EXTERN	int	nerrors;
241 EXTERN	long	nhunk;
242 EXTERN	Prog	nopalign;
243 EXTERN	long	instoffset;
244 EXTERN	vlong	instoffx;
245 EXTERN	Opcross	opcross[10];
246 EXTERN	Oprang	oprange[ALAST];
247 EXTERN	char*	outfile;
248 EXTERN	long	pc;
249 EXTERN	int	ptrsize;
250 EXTERN	uchar	repop[ALAST];
251 EXTERN	long	symsize;
252 EXTERN	Prog*	textp;
253 EXTERN	long	textsize;
254 EXTERN	long	thunk;
255 EXTERN	int	version;
256 EXTERN	char	xcmp[32][32];
257 EXTERN	Prog	zprg;
258 EXTERN	int	dtype;
259 EXTERN	int	little;
260 
261 EXTERN	struct
262 {
263 	Count	branch;
264 	Count	fcmp;
265 	Count	load;
266 	Count	mfrom;
267 	Count	page;
268 	Count	jump;
269 } nop;
270 
271 extern	char*	anames[];
272 extern	Optab	optab[];
273 extern	char	thechar;
274 
275 #pragma	varargck	type	"A"	int
276 #pragma	varargck	type	"D"	Adr*
277 #pragma	varargck	type	"N"	Adr*
278 #pragma	varargck	type	"P"	Prog*
279 #pragma	varargck	type	"S"	char*
280 
281 #pragma	varargck	argpos	diag 1
282 
283 int	Aconv(Fmt*);
284 int	Dconv(Fmt*);
285 int	Nconv(Fmt*);
286 int	Pconv(Fmt*);
287 int	Sconv(Fmt*);
288 int	aclass(Adr*);
289 void	addhist(long, int);
290 void	append(Prog*, Prog*);
291 void	asmb(void);
292 int	asmcompressed(Prog*, Optab*, int, int);
293 void	asmlc(void);
294 int	asmout(Prog*, Optab*, int);
295 void	asmsym(void);
296 vlong	atolwhex(char*);
297 Prog*	brloop(Prog*);
298 void	buildop(void);
299 void	buildrep(int, int);
300 void	cflush(void);
301 int	cmp(int, int);
302 int	compound(Prog*);
303 double	cputime(void);
304 void	datblk(long, long, int);
305 void	diag(char*, ...);
306 void	dodata(void);
307 void	doprof1(void);
308 void	doprof2(void);
309 vlong	entryvalue(void);
310 void	errorexit(void);
311 void	exchange(Prog*);
312 int	find1(long, int);
313 void	follow(void);
314 void	gethunk(void);
315 void	histtoauto(void);
316 double	ieeedtod(Ieee*);
317 long	ieeedtof(Ieee*);
318 int	isnop(Prog*);
319 void	ldobj(int, long, char*);
320 void	loadlib(void);
321 void	listinit(void);
322 Sym*	lookup(char*, int);
323 void	cput(int);
324 void	llput(vlong);
325 void	llputl(vlong);
326 void	lput(long);
327 void	lputl(long);
328 void	bput(long);
329 void	mkfwd(void);
330 void*	mysbrk(ulong);
331 void	names(void);
332 void	nocache(Prog*);
333 void	noops(void);
334 void	nuxiinit(void);
335 void	objfile(char*);
336 int	ocmp(void*, void*);
337 long	opirr(int);
338 Optab*	oplook(Prog*);
339 long	oprrr(int);
340 void	patch(void);
341 void	prasm(Prog*);
342 void	prepend(Prog*, Prog*);
343 Prog*	prg(void);
344 int	pseudo(Prog*);
345 void	putsymb(char*, int, vlong, int);
346 long	regoff(Adr*);
347 int		classreg(Adr*);
348 int	relinv(int);
349 int relrev(int);
350 vlong	rnd(vlong, vlong);
351 void	span(void);
352 void	strnput(char*, int);
353 void	undef(void);
354 int	vconshift(vlong);
355 void	wput(long);
356 void	wputl(long);
357 void	xdefine(char*, int, long);
358 void	xfol(Prog*);
359 void	xfol(Prog*);
360 void	nopstat(char*, Count*);
361