xref: /inferno-os/utils/6l/l.h (revision 50b0dbb170df61467e42c7ea4deb0b5692d15f4c)
1 #include	<lib9.h>
2 #include	<bio.h>
3 #include	"../6c/6.out.h"
4 #include	"../ld/elf.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 		uchar	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	vlong	INITTEXTP;
256 EXTERN	char*	INITENTRY;		/* entry point */
257 EXTERN	Biobuf	bso;
258 EXTERN	long	bsssize;
259 EXTERN	int	cbc;
260 EXTERN	uchar*	cbp;
261 EXTERN	char*	pcstr;
262 EXTERN	int	cout;
263 EXTERN	Auto*	curauto;
264 EXTERN	Auto*	curhist;
265 EXTERN	Prog*	curp;
266 EXTERN	Prog*	curtext;
267 EXTERN	Prog*	datap;
268 EXTERN	Prog*	edatap;
269 EXTERN	vlong	datsize;
270 EXTERN	char	debug[128];
271 EXTERN	char	literal[32];
272 EXTERN	Prog*	etextp;
273 EXTERN	Prog*	firstp;
274 EXTERN	uchar	fnuxi8[8];
275 EXTERN	uchar	fnuxi4[4];
276 EXTERN	Sym*	hash[NHASH];
277 EXTERN	Sym*	histfrog[MAXHIST];
278 EXTERN	int	histfrogp;
279 EXTERN	int	histgen;
280 EXTERN	char*	library[50];
281 EXTERN	char*	libraryobj[50];
282 EXTERN	int	libraryp;
283 EXTERN	int	xrefresolv;
284 EXTERN	char*	hunk;
285 EXTERN	uchar	inuxi1[1];
286 EXTERN	uchar	inuxi2[2];
287 EXTERN	uchar	inuxi4[4];
288 EXTERN	uchar	inuxi8[8];
289 EXTERN	char	ycover[Ymax*Ymax];
290 EXTERN	uchar*	andptr;
291 EXTERN	uchar*	rexptr;
292 EXTERN	uchar	and[30];
293 EXTERN	int	reg[D_NONE];
294 EXTERN	int	regrex[D_NONE+1];
295 EXTERN	Prog*	lastp;
296 EXTERN	long	lcsize;
297 EXTERN	int	nerrors;
298 EXTERN	long	nhunk;
299 EXTERN	long	nsymbol;
300 EXTERN	char*	noname;
301 EXTERN	char*	outfile;
302 EXTERN	vlong	pc;
303 EXTERN	long	spsize;
304 EXTERN	Sym*	symlist;
305 EXTERN	long	symsize;
306 EXTERN	Prog*	textp;
307 EXTERN	vlong	textsize;
308 EXTERN	long	thunk;
309 EXTERN	int	version;
310 EXTERN	Prog	zprg;
311 EXTERN	int	dtype;
312 EXTERN	char*	paramspace;
313 
314 EXTERN	Adr*	reloca;
315 EXTERN	int	doexp, dlm;
316 EXTERN	int	imports, nimports;
317 EXTERN	int	exports, nexports;
318 EXTERN	char*	EXPTAB;
319 EXTERN	Prog	undefp;
320 
321 #define	UP	(&undefp)
322 
323 extern	Optab	optab[];
324 extern	Optab*	opindex[];
325 extern	char*	anames[];
326 
327 int	Aconv(Fmt*);
328 int	Dconv(Fmt*);
329 int	Pconv(Fmt*);
330 int	Rconv(Fmt*);
331 int	Sconv(Fmt*);
332 void	addhist(long, int);
333 void	addlibpath(char*);
334 Prog*	appendp(Prog*);
335 void	asmb(void);
336 void	asmdyn(void);
337 void	asmins(Prog*);
338 void	asmlc(void);
339 void	asmsp(void);
340 void	asmsym(void);
341 vlong	atolwhex(char*);
342 Prog*	brchain(Prog*);
343 Prog*	brloop(Prog*);
344 void	buildop(void);
345 void	cflush(void);
346 void	ckoff(Sym*, long);
347 Prog*	copyp(Prog*);
348 double	cputime(void);
349 void	datblk(long, long);
350 void	diag(char*, ...);
351 void	dodata(void);
352 void	doinit(void);
353 void	doprof1(void);
354 void	doprof2(void);
355 void	dostkoff(void);
356 void	dynreloc(Sym*, ulong, int);
357 vlong	entryvalue(void);
358 void	errorexit(void);
359 void	export(void);
360 int	fileexists(char*);
361 int	find1(long, int);
362 int	find2(long, int);
363 char*	findlib(char*);
364 void	follow(void);
365 void	gethunk(void);
366 void	histtoauto(void);
367 double	ieeedtod(Ieee*);
368 long	ieeedtof(Ieee*);
369 void	import(void);
370 void	ldobj(int, long, char*);
371 void	loadlib(void);
372 void	listinit(void);
373 Sym*	lookup(char*, int);
374 void	llput(vlong v);
375 void	llputl(vlong v);
376 void	lput(long);
377 void	lputl(long);
378 void	main(int, char*[]);
379 void	mkfwd(void);
380 void*	mysbrk(ulong);
381 void	nuxiinit(void);
382 void	objfile(char*);
383 int	opsize(Prog*);
384 void	patch(void);
385 Prog*	prg(void);
386 void	readundefs(char*, int);
387 int	relinv(int);
388 long	reuse(Prog*, Sym*);
389 vlong	rnd(vlong, vlong);
390 void	span(void);
391 void	strnput(char*, int);
392 void	undef(void);
393 void	undefsym(Sym*);
394 vlong	vaddr(Adr*);
395 void	wput(long);
396 void	wputl(long);
397 void	xdefine(char*, int, vlong);
398 void	xfol(Prog*);
399 int	zaddr(uchar*, Adr*, Sym*[]);
400 void	zerosig(char*);
401