xref: /plan9-contrib/sys/src/cmd/6l/l.h (revision 178702b161d3fe3e021aa6cb2f305be898e56ca0)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../6c/6.out.h"
5 
6 #ifndef	EXTERN
7 #define	EXTERN	extern
8 #endif
9 
10 #define	P		((Prog*)0)
11 #define	S		((Sym*)0)
12 #define	TNAME		(curtext?curtext->from.sym->name:noname)
13 #define	cput(c)\
14 	{ *cbp++ = c;\
15 	if(--cbc <= 0)\
16 		cflush(); }
17 
18 #define	LIBNAMELEN	300
19 
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 	uchar	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		= 8192,
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,
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 	Pw		= 0x48,	/* Rex.w */
215 	Py		= 0x80,	/* defaults to 64-bit mode */
216 
217 	Rxf		= 1<<9,	/* internal flag for Rxr on from */
218 	Rxt		= 1<<8,	/* internal flag for Rxr on to */
219 	Rxw		= 1<<3,	/* =1, 64-bit operand size */
220 	Rxr		= 1<<2,	/* extend modrm reg */
221 	Rxx		= 1<<1,	/* extend sib index */
222 	Rxb		= 1<<0,	/* extend modrm r/m, sib base, or opcode reg */
223 
224 	Roffset	= 22,		/* no. bits for offset in relocation address */
225 	Rindex	= 10,		/* no. bits for index in relocation address */
226 };
227 
228 EXTERN union
229 {
230 	struct
231 	{
232 		char	obuf[MAXIO];			/* output buffer */
233 		uchar	ibuf[MAXIO];			/* input buffer */
234 	} u;
235 	char	dbuf[1];
236 } buf;
237 
238 #define	cbuf	u.obuf
239 #define	xbuf	u.ibuf
240 
241 #pragma	varargck	type	"A"	int
242 #pragma	varargck	type	"A"	uint
243 #pragma	varargck	type	"D"	Adr*
244 #pragma	varargck	type	"P"	Prog*
245 #pragma	varargck	type	"R"	int
246 #pragma	varargck	type	"S"	char*
247 
248 #pragma	varargck	argpos	diag 1
249 
250 EXTERN	long	HEADR;
251 EXTERN	long	HEADTYPE;
252 EXTERN	vlong	INITDAT;
253 EXTERN	long	INITRND;
254 EXTERN	vlong	INITTEXT;
255 EXTERN	char*	INITENTRY;		/* entry point */
256 EXTERN	Biobuf	bso;
257 EXTERN	long	bsssize;
258 EXTERN	int	cbc;
259 EXTERN	char*	cbp;
260 EXTERN	char*	pcstr;
261 EXTERN	int	cout;
262 EXTERN	Auto*	curauto;
263 EXTERN	Auto*	curhist;
264 EXTERN	Prog*	curp;
265 EXTERN	Prog*	curtext;
266 EXTERN	Prog*	datap;
267 EXTERN	Prog*	edatap;
268 EXTERN	vlong	datsize;
269 EXTERN	char	debug[128];
270 EXTERN	char	literal[32];
271 EXTERN	Prog*	etextp;
272 EXTERN	Prog*	firstp;
273 EXTERN	uchar	fnuxi8[8];
274 EXTERN	uchar	fnuxi4[4];
275 EXTERN	Sym*	hash[NHASH];
276 EXTERN	Sym*	histfrog[MAXHIST];
277 EXTERN	int	histfrogp;
278 EXTERN	int	histgen;
279 EXTERN	char*	library[50];
280 EXTERN	char*	libraryobj[50];
281 EXTERN	int	libraryp;
282 EXTERN	int	xrefresolv;
283 EXTERN	char*	hunk;
284 EXTERN	uchar	inuxi1[1];
285 EXTERN	uchar	inuxi2[2];
286 EXTERN	uchar	inuxi4[4];
287 EXTERN	uchar	inuxi8[8];
288 EXTERN	char	ycover[Ymax*Ymax];
289 EXTERN	uchar*	andptr;
290 EXTERN	uchar*	rexptr;
291 EXTERN	uchar	and[30];
292 EXTERN	int	reg[D_NONE];
293 EXTERN	int	regrex[D_NONE+1];
294 EXTERN	Prog*	lastp;
295 EXTERN	long	lcsize;
296 EXTERN	int	nerrors;
297 EXTERN	long	nhunk;
298 EXTERN	long	nsymbol;
299 EXTERN	char*	noname;
300 EXTERN	char*	outfile;
301 EXTERN	vlong	pc;
302 EXTERN	long	spsize;
303 EXTERN	Sym*	symlist;
304 EXTERN	long	symsize;
305 EXTERN	Prog*	textp;
306 EXTERN	vlong	textsize;
307 EXTERN	long	thunk;
308 EXTERN	int	version;
309 EXTERN	Prog	zprg;
310 EXTERN	int	dtype;
311 EXTERN	char*	paramspace;
312 
313 EXTERN	Adr*	reloca;
314 EXTERN	int	doexp, dlm;
315 EXTERN	int	imports, nimports;
316 EXTERN	int	exports, nexports;
317 EXTERN	char*	EXPTAB;
318 EXTERN	Prog	undefp;
319 
320 #define	UP	(&undefp)
321 
322 extern	Optab	optab[];
323 extern	Optab*	opindex[];
324 extern	char*	anames[];
325 
326 int	Aconv(Fmt*);
327 int	Dconv(Fmt*);
328 int	Pconv(Fmt*);
329 int	Rconv(Fmt*);
330 int	Sconv(Fmt*);
331 void	addhist(long, int);
332 void	addlibpath(char*);
333 Prog*	appendp(Prog*);
334 void	asmb(void);
335 void	asmdyn(void);
336 void	asmins(Prog*);
337 void	asmlc(void);
338 void	asmsp(void);
339 void	asmsym(void);
340 vlong	atolwhex(char*);
341 Prog*	brchain(Prog*);
342 Prog*	brloop(Prog*);
343 void	buildop(void);
344 void	cflush(void);
345 void	ckoff(Sym*, long);
346 Prog*	copyp(Prog*);
347 double	cputime(void);
348 void	datblk(long, long);
349 void	diag(char*, ...);
350 void	dodata(void);
351 void	doinit(void);
352 void	doprof1(void);
353 void	doprof2(void);
354 void	dostkoff(void);
355 void	dynreloc(Sym*, ulong, int);
356 vlong	entryvalue(void);
357 void	errorexit(void);
358 void	export(void);
359 int	fileexists(char*);
360 int	find1(long, int);
361 int	find2(long, int);
362 char*	findlib(char*);
363 void	follow(void);
364 void	gethunk(void);
365 void	histtoauto(void);
366 double	ieeedtod(Ieee*);
367 long	ieeedtof(Ieee*);
368 void	import(void);
369 void	ldobj(int, long, char*);
370 void	loadlib(void);
371 void	listinit(void);
372 Sym*	lookup(char*, int);
373 void	lput(long);
374 void	lputl(long);
375 void	main(int, char*[]);
376 void	mkfwd(void);
377 void*	mysbrk(ulong);
378 void	nuxiinit(void);
379 void	objfile(char*);
380 int	opsize(Prog*);
381 void	patch(void);
382 Prog*	prg(void);
383 void	readundefs(char*, int);
384 int	relinv(int);
385 long	reuse(Prog*, Sym*);
386 vlong	rnd(vlong, vlong);
387 void	span(void);
388 void	undef(void);
389 void	undefsym(Sym*);
390 vlong	vaddr(Adr*);
391 void	wput(ushort);
392 void	xdefine(char*, int, vlong);
393 void	xfol(Prog*);
394 int	zaddr(uchar*, Adr*, Sym*[]);
395 void	zerosig(char*);
396