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