xref: /plan9-contrib/sys/src/cmd/6l/l.h (revision 2ec6491f4460014c01f3ea5c06b30b1a392b0bb2)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../6c/6.out.h"
5 #include	"../ld/elf.h"
6 
7 #ifndef	EXTERN
8 #define	EXTERN	extern
9 #endif
10 
11 #define	P		((Prog*)0)
12 #define	S		((Sym*)0)
13 #define	TNAME		(curtext?curtext->from.sym->name:noname)
14 #define	cput(c)\
15 	{ *cbp++ = c;\
16 	if(--cbc <= 0)\
17 		cflush(); }
18 
19 #define	LIBNAMELEN	300
20 typedef	struct	Adr	Adr;
21 typedef	struct	Prog	Prog;
22 typedef	struct	Sym	Sym;
23 typedef	struct	Auto	Auto;
24 typedef	struct	Optab	Optab;
25 typedef	struct	Movtab	Movtab;
26 
27 struct	Adr
28 {
29 	union
30 	{
31 		vlong	u0offset;
32 		char	u0scon[8];
33 		Prog	*u0cond;	/* not used, but should be D_BRANCH */
34 		Ieee	u0ieee;
35 	} u0;
36 	union
37 	{
38 		Auto*	u1autom;
39 		Sym*	u1sym;
40 	} u1;
41 	short	type;
42 	char	index;
43 	char	scale;
44 };
45 
46 #define	offset	u0.u0offset
47 #define	scon	u0.u0scon
48 #define	cond	u0.u0cond
49 #define	ieee	u0.u0ieee
50 
51 #define	autom	u1.u1autom
52 #define	sym	u1.u1sym
53 
54 struct	Prog
55 {
56 	Adr	from;
57 	Adr	to;
58 	Prog	*forwd;
59 	Prog*	link;
60 	Prog*	pcond;	/* work on this */
61 	vlong	pc;
62 	long	line;
63 	uchar	mark;	/* work on these */
64 	uchar	back;
65 
66 	short	as;
67 	char	width;		/* fake for DATA */
68 	char	mode;	/* 16, 32, or 64 */
69 };
70 struct	Auto
71 {
72 	Sym*	asym;
73 	Auto*	link;
74 	long	aoffset;
75 	short	type;
76 };
77 struct	Sym
78 {
79 	char	*name;
80 	short	type;
81 	short	version;
82 	short	become;
83 	short	frame;
84 	uchar	subtype;
85 	ushort	file;
86 	vlong	value;
87 	long	sig;
88 	Sym*	link;
89 };
90 struct	Optab
91 {
92 	short	as;
93 	uchar*	ytab;
94 	ushort	prefix;
95 	uchar	op[20];
96 };
97 struct	Movtab
98 {
99 	short	as;
100 	uchar	ft;
101 	uchar	tt;
102 	uchar	code;
103 	uchar	op[4];
104 };
105 
106 enum
107 {
108 	STEXT		= 1,
109 	SDATA,
110 	SBSS,
111 	SDATA1,
112 	SXREF,
113 	SFILE,
114 	SCONST,
115 	SUNDEF,
116 
117 	SIMPORT,
118 	SEXPORT,
119 
120 	NHASH		= 10007,
121 	NHUNK		= 100000,
122 	MINSIZ		= 8,
123 	STRINGSZ	= 200,
124 	MINLC		= 1,
125 	MAXIO		= (16*1024),
126 	MAXHIST		= 20,				/* limit of path elements for history symbols */
127 
128 	Yxxx		= 0,
129 	Ynone,
130 	Yi0,
131 	Yi1,
132 	Yi8,
133 	Ys32,
134 	Yi32,
135 	Yi64,
136 	Yiauto,
137 	Yal,
138 	Ycl,
139 	Yax,
140 	Ycx,
141 	Yrb,
142 	Yrl,
143 	Yrf,
144 	Yf0,
145 	Yrx,
146 	Ymb,
147 	Yml,
148 	Ym,
149 	Ybr,
150 	Ycol,
151 
152 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
153 	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
154 	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,	Ycr8,
155 	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
156 	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,	Yrl32,	Yrl64,
157 	Ymr, 	Ymm,
158 	Yxr,	Yxm,	Yyr,	Yxyr,
159 	Ymax,
160 
161 	Zxxx		= 0,
162 
163 	Zlit,
164 	Z_rp,
165 	Zbr,
166 	Zcall,
167 	Zib_,
168 	Zib_rp,
169 	Zibo_m,
170 	Zibo_m_xm,
171 	Zil_,
172 	Zil_rp,
173 	Ziq_rp,
174 	Zilo_m,
175 	Ziqo_m,
176 	Zjmp,
177 	Zloop,
178 	Zo_iw,
179 	Zm_o,
180 	Zm_r,
181 	Zm_r_xm,
182 	Zm_r_i_xm,
183 	Zm_r_3d,
184 	Zm_r_xm_nr,
185 	Zr_m_xm_nr,
186 	Zibm_r,	/* mmx1,mmx2/mem64,imm8 */
187 	Zmb_r,
188 	Zaut_r,
189 	Zo_m,
190 	Zo_m64,
191 	Zpseudo,
192 	Zr_m,
193 	Zr_m_xm,
194 	Zr_m_i_xm,
195 	Zrp_,
196 	Z_ib,
197 	Z_il,
198 	Zm_ibo,
199 	Zm_ilo,
200 	Zib_rr,
201 	Zil_rr,
202 	Zclr,
203 	Zbyte,
204 	Zmax,
205 
206 	Px		= 0,
207 	P32		= 0x32,	/* 32-bit only */
208 	Pe		= 0x66,	/* operand escape */
209 	Pm		= 0x0f,	/* 2byte opcode escape */
210 	Pq		= 0xff,	/* both escape */
211 	Pb		= 0xfe,	/* byte operands */
212 	Pf2		= 0xf2,	/* xmm escape 1 */
213 	Pf3		= 0xf3,	/* xmm escape 2 */
214 	Pm38	= 0x38,	/* 0f.38 opcode */
215 	Pm3a	= 0x3a,	/* 0f.3a opcode */
216 	Pw		= 0x48,	/* Rex.w */
217 	Py		= 0x80,	/* defaults to 64-bit mode */
218 
219 	P2		=	1<<9,	/* flag: two operand (avx only) */
220 
221 	Rxf		= 1<<9,	/* internal flag for Rxr on from */
222 	Rxt		= 1<<8,	/* internal flag for Rxr on to */
223 	Rxw		= 1<<3,	/* =1, 64-bit operand size */
224 	Rxr		= 1<<2,	/* extend modrm reg */
225 	Rxx		= 1<<1,	/* extend sib index */
226 	Rxb		= 1<<0,	/* extend modrm r/m, sib base, or opcode reg */
227 
228 	Vex2	= 0xc5,	/* 2-byte vex prefix */
229 	Vex3	= 0xc4,	/* 3-byte vex prefix */
230 
231 	/* vex flags */
232 	Vexr	= 1<<7,		/* byte 1, both */
233 	Vexx	= 1<<6,		/* byte 1, 3-byte */
234 	Vexb	= 1<<5,		/* byte 1, 3-byte */
235 	Vexw	= 1<<7,		/* byte 2, 3-byte */
236 	Vexl	= 1<<2,		/* 256-bit vector */
237 
238 	Vexnr	= 0xF<<3,	/* no reg */
239 	Vexp0	= 0,		/* no SIMD prefix */
240 	Vexp66	= 1,		/* prefix 66 */
241 	Vexpf3	= 2,		/* prefix f3 */
242 	Vexpf2	= 3,		/* prefix f2 */
243 
244 	Vex0f	= 1,		/* 0F opcode byte */
245 	Vex0f38	= 2,		/* 0F 38 opcode bytes */
246 	Vex0f3a	= 3,		/* 0F 3A opcode bytes */
247 
248 	Roffset	= 22,		/* no. bits for offset in relocation address */
249 	Rindex	= 10,		/* no. bits for index in relocation address */
250 };
251 
252 EXTERN union
253 {
254 	struct
255 	{
256 		char	obuf[MAXIO];			/* output buffer */
257 		uchar	ibuf[MAXIO];			/* input buffer */
258 	} u;
259 	char	dbuf[1];
260 } buf;
261 
262 #define	cbuf	u.obuf
263 #define	xbuf	u.ibuf
264 
265 #pragma	varargck	type	"A"	int
266 #pragma	varargck	type	"A"	uint
267 #pragma	varargck	type	"D"	Adr*
268 #pragma	varargck	type	"P"	Prog*
269 #pragma	varargck	type	"R"	int
270 #pragma	varargck	type	"R"	uint
271 #pragma	varargck	type	"S"	char*
272 
273 #pragma	varargck	argpos	diag 1
274 
275 EXTERN	long	HEADR;
276 EXTERN	long	HEADTYPE;
277 EXTERN	vlong	INITDAT;
278 EXTERN	long	INITRND;
279 EXTERN	vlong	INITTEXT;
280 EXTERN	vlong	INITTEXTP;
281 EXTERN	char*	INITENTRY;		/* entry point */
282 EXTERN	Biobuf	bso;
283 EXTERN	long	bsssize;
284 EXTERN	int	cbc;
285 EXTERN	char*	cbp;
286 EXTERN	char*	pcstr;
287 EXTERN	int	cout;
288 EXTERN	Auto*	curauto;
289 EXTERN	Auto*	curhist;
290 EXTERN	Prog*	curp;
291 EXTERN	Prog*	curtext;
292 EXTERN	Prog*	datap;
293 EXTERN	Prog*	edatap;
294 EXTERN	vlong	datsize;
295 EXTERN	char	debug[128];
296 EXTERN	char	literal[32];
297 EXTERN	Prog*	etextp;
298 EXTERN	Prog*	firstp;
299 EXTERN	uchar	fnuxi8[8];
300 EXTERN	uchar	fnuxi4[4];
301 EXTERN	Sym*	hash[NHASH];
302 EXTERN	Sym*	histfrog[MAXHIST];
303 EXTERN	int	histfrogp;
304 EXTERN	int	histgen;
305 EXTERN	char*	library[50];
306 EXTERN	char*	libraryobj[50];
307 EXTERN	int	libraryp;
308 EXTERN	int	xrefresolv;
309 EXTERN	char*	hunk;
310 EXTERN	uchar	inuxi1[1];
311 EXTERN	uchar	inuxi2[2];
312 EXTERN	uchar	inuxi4[4];
313 EXTERN	uchar	inuxi8[8];
314 EXTERN	char	ycover[Ymax*Ymax];
315 EXTERN	uchar*	andptr;
316 EXTERN	uchar*	rexptr;
317 EXTERN	uchar	and[30];
318 EXTERN	int	reg[D_XREG];
319 EXTERN	int	regrex[D_XREG+1];
320 EXTERN	Prog*	lastp;
321 EXTERN	long	lcsize;
322 EXTERN	int	nerrors;
323 EXTERN	long	nhunk;
324 EXTERN	long	nsymbol;
325 EXTERN	char*	noname;
326 EXTERN	char*	outfile;
327 EXTERN	vlong	pc;
328 EXTERN	long	spsize;
329 EXTERN	Sym*	symlist;
330 EXTERN	long	symsize;
331 EXTERN	Prog*	textp;
332 EXTERN	vlong	textsize;
333 EXTERN	long	thunk;
334 EXTERN	int	version;
335 EXTERN	int	vexed;
336 EXTERN	Prog	zprg;
337 EXTERN	int	dtype;
338 EXTERN	char*	paramspace;
339 
340 EXTERN	Adr*	reloca;
341 EXTERN	int	doexp, dlm;
342 EXTERN	int	imports, nimports;
343 EXTERN	int	exports, nexports, allexport;
344 EXTERN	char*	EXPTAB;
345 EXTERN	Prog	undefp;
346 
347 #define	UP	(&undefp)
348 
349 extern	Optab	optab[];
350 extern	Optab*	opindex[];
351 extern	char*	anames[];
352 
353 int	Aconv(Fmt*);
354 int	Dconv(Fmt*);
355 int	Pconv(Fmt*);
356 int	Rconv(Fmt*);
357 int	Sconv(Fmt*);
358 void	addhist(long, int);
359 void	addlibpath(char*);
360 Prog*	appendp(Prog*);
361 void	asmb(void);
362 void	asmdyn(void);
363 void	asmins(Prog*);
364 void	asmlc(void);
365 void	asmsp(void);
366 void	asmsym(void);
367 vlong	atolwhex(char*);
368 Prog*	brchain(Prog*);
369 Prog*	brloop(Prog*);
370 void	buildop(void);
371 void	cflush(void);
372 void	ckoff(Sym*, long);
373 Prog*	copyp(Prog*);
374 double	cputime(void);
375 void	datblk(long, long);
376 void	diag(char*, ...);
377 void	dodata(void);
378 void	doinit(void);
379 void	doprof1(void);
380 void	doprof2(void);
381 void	dostkoff(void);
382 void	dynreloc(Sym*, ulong, int);
383 vlong	entryvalue(void);
384 void	errorexit(void);
385 void	export(void);
386 int	fileexists(char*);
387 int	find1(long, int);
388 int	find2(long, int);
389 char*	findlib(char*);
390 void	follow(void);
391 void	gethunk(void);
392 void	histtoauto(void);
393 double	ieeedtod(Ieee*);
394 long	ieeedtof(Ieee*);
395 void	import(void);
396 int	isxyreg(int);
397 void	ldobj(int, long, char*);
398 void	loadlib(void);
399 void	listinit(void);
400 void	llput(vlong v);
401 void	llputl(vlong v);
402 Sym*	lookup(char*, int);
403 void	lput(long);
404 void	lputl(long);
405 void	main(int, char*[]);
406 void	mkfwd(void);
407 void*	mysbrk(ulong);
408 void	nuxiinit(void);
409 void	objfile(char*);
410 int	opsize(Prog*);
411 void	patch(void);
412 Prog*	prg(void);
413 void	readundefs(char*, int);
414 int	relinv(int);
415 long	reuse(Prog*, Sym*);
416 vlong	rnd(vlong, vlong);
417 void	span(void);
418 void	strnput(char*, int);
419 void	undef(void);
420 void	undefsym(Sym*);
421 vlong	vaddr(Adr*);
422 void	wput(long);
423 void	wputl(long);
424 void	xdefine(char*, int, vlong);
425 void	xfol(Prog*);
426 int	zaddr(uchar*, Adr*, Sym*[]);
427 void	zerosig(char*);
428