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