xref: /inferno-os/utils/5l/l.h (revision e45fa0eb0763b57d6fb0649c064bc3b95ccdea6c)
1 #include	<lib9.h>
2 #include	<bio.h>
3 #include	"../5c/5.out.h"
4 #include	"../ld/elf.h"
5 
6 #ifndef	EXTERN
7 #define	EXTERN	extern
8 #endif
9 
10 #define	LIBNAMELEN	300
11 
12 void	addlibpath(char*);
13 int	fileexists(char*);
14 char*	findlib(char*);
15 
16 typedef	struct	Adr	Adr;
17 typedef	struct	Sym	Sym;
18 typedef	struct	Autom	Auto;
19 typedef	struct	Prog	Prog;
20 typedef	struct	Optab	Optab;
21 typedef	struct	Oprang	Oprang;
22 typedef	uchar	Opcross[32][2][32];
23 typedef	struct	Count	Count;
24 
25 #define	P		((Prog*)0)
26 #define	S		((Sym*)0)
27 #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
28 
29 struct	Adr
30 {
31 	union
32 	{
33 		long	u0offset;
34 		char*	u0sval;
35 		Ieee*	u0ieee;
36 	} u0;
37 	union
38 	{
39 		Auto*	u1autom;
40 		Sym*	u1sym;
41 	} u1;
42 	char	type;
43 	char	reg;
44 	char	name;
45 	char	class;
46 };
47 
48 #define	offset	u0.u0offset
49 #define	sval	u0.u0sval
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 	union
60 	{
61 		long	u0regused;
62 		Prog*	u0forwd;
63 	} u0;
64 	Prog*	cond;
65 	Prog*	link;
66 	long	pc;
67 	long	line;
68 	uchar	mark;
69 	uchar	optab;
70 	uchar	as;
71 	uchar	scond;
72 	uchar	reg;
73 };
74 #define	regused	u0.u0regused
75 #define	forwd	u0.u0forwd
76 
77 struct	Sym
78 {
79 	char	*name;
80 	short	type;
81 	short	version;
82 	short	become;
83 	short	frame;
84 	uchar	subtype;
85 	uchar	used;
86 	ushort	file;
87 	long	value;
88 	long	sig;
89 	Sym*	link;
90 };
91 
92 #define SIGNINTERN	(1729*325*1729)
93 
94 struct	Autom
95 {
96 	Sym*	asym;
97 	Auto*	link;
98 	long	aoffset;
99 	short	type;
100 };
101 struct	Optab
102 {
103 	char	as;
104 	char	a1;
105 	char	a2;
106 	char	a3;
107 	char	type;
108 	char	size;
109 	char	param;
110 	char	flag;
111 };
112 struct	Oprang
113 {
114 	Optab*	start;
115 	Optab*	stop;
116 };
117 struct	Count
118 {
119 	long	count;
120 	long	outof;
121 };
122 
123 enum
124 {
125 	STEXT		= 1,
126 	SDATA,
127 	SBSS,
128 	SDATA1,
129 	SXREF,
130 	SLEAF,
131 	SFILE,
132 	SCONST,
133 	SSTRING,
134 	SUNDEF,
135 
136 	SIMPORT,
137 	SEXPORT,
138 
139 	LFROM		= 1<<0,
140 	LTO		= 1<<1,
141 	LPOOL		= 1<<2,
142 	V4		= 1<<3,	/* arm v4 arch */
143 	VFP		= 1<<4,	/* arm vfpv3 floating point */
144 
145 	C_NONE		= 0,
146 	C_REG,
147 	C_REGREG,
148 	C_SHIFT,
149 	C_FREG,
150 	C_PSR,
151 	C_FCR,
152 
153 	C_RCON,		/* 0xff rotated */
154 	C_NCON,		/* ~RCON */
155 	C_SCON,		/* 0xffff */
156 	C_LCON,
157 	C_FCON,
158 
159 	C_RACON,
160 	C_LACON,
161 
162 	C_RECON,
163 	C_LECON,
164 
165 	C_SBRA,
166 	C_LBRA,
167 
168 	C_HAUTO,	/* halfword insn offset (-0xff to 0xff) */
169 	C_FAUTO,	/* float insn offset (0 to 0x3fc, word aligned) */
170 	C_HFAUTO,	/* both H and F */
171 	C_SAUTO,	/* -0xfff to 0xfff */
172 	C_LAUTO,
173 
174 	C_HEXT,
175 	C_FEXT,
176 	C_HFEXT,
177 	C_SEXT,
178 	C_LEXT,
179 
180 	C_HOREG,
181 	C_FOREG,
182 	C_HFOREG,
183 	C_SOREG,
184 	C_ROREG,
185 	C_SROREG,	/* both S and R */
186 	C_LOREG,
187 
188 	C_ADDR,		/* relocatable address */
189 
190 	C_GOK,
191 
192 /* mark flags */
193 	FOLL		= 1<<0,
194 	LABEL		= 1<<1,
195 	LEAF		= 1<<2,
196 
197 	BIG		= (1<<12)-4,
198 	STRINGSZ	= 200,
199 	NHASH		= 10007,
200 	NHUNK		= 100000,
201 	MINSIZ		= 64,
202 	NENT		= 100,
203 	MAXIO		= 8192,
204 	MAXHIST		= 20,	/* limit of path elements for history symbols */
205 
206 	Roffset	= 22,		/* no. bits for offset in relocation address */
207 	Rindex	= 10,		/* no. bits for index in relocation address */
208 };
209 
210 EXTERN union
211 {
212 	struct
213 	{
214 		uchar	obuf[MAXIO];			/* output buffer */
215 		uchar	ibuf[MAXIO];			/* input buffer */
216 	} u;
217 	char	dbuf[1];
218 } buf;
219 
220 #define	cbuf	u.obuf
221 #define	xbuf	u.ibuf
222 
223 #ifndef COFFCVT
224 
225 EXTERN	long	HEADR;			/* length of header */
226 EXTERN	int	HEADTYPE;		/* type of header */
227 EXTERN	long	INITDAT;		/* data location */
228 EXTERN	long	INITRND;		/* data round above text location */
229 EXTERN	long	INITTEXT;		/* text location */
230 EXTERN	long	INITTEXTP;		/* text location (physical) */
231 EXTERN	char*	INITENTRY;		/* entry point */
232 EXTERN	long	autosize;
233 EXTERN	Biobuf	bso;
234 EXTERN	long	bsssize;
235 EXTERN	int	cbc;
236 EXTERN	uchar*	cbp;
237 EXTERN	int	cout;
238 EXTERN	Auto*	curauto;
239 EXTERN	Auto*	curhist;
240 EXTERN	Prog*	curp;
241 EXTERN	Prog*	curtext;
242 EXTERN	Prog*	datap;
243 EXTERN	long	datsize;
244 EXTERN	char	debug[128];
245 EXTERN	Prog*	etextp;
246 EXTERN	Prog*	firstp;
247 EXTERN	char	fnuxi4[4];
248 EXTERN	char	fnuxi8[8];
249 EXTERN	char*	noname;
250 EXTERN	Sym*	hash[NHASH];
251 EXTERN	Sym*	histfrog[MAXHIST];
252 EXTERN	int	histfrogp;
253 EXTERN	int	histgen;
254 EXTERN	char*	library[50];
255 EXTERN	char*	libraryobj[50];
256 EXTERN	int	libraryp;
257 EXTERN	int	xrefresolv;
258 EXTERN	char*	hunk;
259 EXTERN	char	inuxi1[1];
260 EXTERN	char	inuxi2[2];
261 EXTERN	char	inuxi4[4];
262 EXTERN	Prog*	lastp;
263 EXTERN	long	lcsize;
264 EXTERN	char	literal[32];
265 EXTERN	int	nerrors;
266 EXTERN	long	nhunk;
267 EXTERN	long	instoffset;
268 EXTERN	Opcross	opcross[8];
269 EXTERN	Oprang	oprange[ALAST];
270 EXTERN	char*	outfile;
271 EXTERN	long	pc;
272 EXTERN	uchar	repop[ALAST];
273 EXTERN	long	symsize;
274 EXTERN	Prog*	textp;
275 EXTERN	long	textsize;
276 EXTERN	long	thunk;
277 EXTERN	int	version;
278 EXTERN	char	xcmp[C_GOK+1][C_GOK+1];
279 EXTERN	Prog	zprg;
280 EXTERN	int	dtype;
281 EXTERN	int	armv4;
282 EXTERN	int vfp;
283 
284 EXTERN	int	doexp, dlm;
285 EXTERN	int	imports, nimports;
286 EXTERN	int	exports, nexports;
287 EXTERN	char*	EXPTAB;
288 EXTERN	Prog	undefp;
289 
290 #define	UP	(&undefp)
291 
292 extern	char*	anames[];
293 extern	Optab	optab[];
294 
295 void	addpool(Prog*, Adr*);
296 EXTERN	Prog*	blitrl;
297 EXTERN	Prog*	elitrl;
298 
299 void	initdiv(void);
300 EXTERN	Prog*	prog_div;
301 EXTERN	Prog*	prog_divu;
302 EXTERN	Prog*	prog_mod;
303 EXTERN	Prog*	prog_modu;
304 
305 #pragma	varargck	type	"A"	int
306 #pragma	varargck	type	"A"	uint
307 #pragma	varargck	type	"C"	int
308 #pragma	varargck	type	"D"	Adr*
309 #pragma	varargck	type	"N"	Adr*
310 #pragma	varargck	type	"P"	Prog*
311 #pragma	varargck	type	"S"	char*
312 
313 #pragma	varargck	argpos	diag 1
314 
315 int	Aconv(Fmt*);
316 int	Cconv(Fmt*);
317 int	Dconv(Fmt*);
318 int	Nconv(Fmt*);
319 int	Pconv(Fmt*);
320 int	Sconv(Fmt*);
321 int	aclass(Adr*);
322 void	addhist(long, int);
323 void	addlibpath(char*);
324 void	append(Prog*, Prog*);
325 void	asmb(void);
326 void	asmdyn(void);
327 void	asmlc(void);
328 void	asmout(Prog*, Optab*);
329 void	asmsym(void);
330 long	atolwhex(char*);
331 Prog*	brloop(Prog*);
332 void	buildop(void);
333 void	buildrep(int, int);
334 void	cflush(void);
335 void	ckoff(Sym*, long);
336 int	chipfloat(Ieee*);
337 int	cmp(int, int);
338 int	compound(Prog*);
339 double	cputime(void);
340 void	datblk(long, long, int);
341 void	diag(char*, ...);
342 void	divsig(void);
343 void	dodata(void);
344 void	doprof1(void);
345 void	doprof2(void);
346 void	dynreloc(Sym*, long, int);
347 long	entryvalue(void);
348 void	errorexit(void);
349 void	exchange(Prog*);
350 void	export(void);
351 int	fileexists(char*);
352 int	find1(long, int);
353 char*	findlib(char*);
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 int	isnop(Prog*);
361 void	ldobj(int, long, char*);
362 void	loadlib(void);
363 void	listinit(void);
364 Sym*	lookup(char*, int);
365 void	cput(int);
366 void	llput(vlong);
367 void	llputl(vlong);
368 void	lput(long);
369 void	lputl(long);
370 void	mkfwd(void);
371 void*	mysbrk(ulong);
372 void	names(void);
373 void	nocache(Prog*);
374 void	nuxiinit(void);
375 void	objfile(char*);
376 int	ocmp(void*, void*);
377 long	opirr(int);
378 Optab*	oplook(Prog*);
379 long	oprrr(int, int);
380 long	opvfprrr(int, int);
381 long	olr(long, int, int, int);
382 long	olhr(long, int, int, int);
383 long	olrr(int, int, int, int);
384 long	olhrr(int, int, int, int);
385 long	osr(int, int, long, int, int);
386 long	oshr(int, long, int, int);
387 long	ofsr(int, int, long, int, int, Prog*);
388 long	osrr(int, int, int, int);
389 long	oshrr(int, int, int, int);
390 long	omvl(Prog*, Adr*, int);
391 void	patch(void);
392 void	prasm(Prog*);
393 void	prepend(Prog*, Prog*);
394 Prog*	prg(void);
395 int	pseudo(Prog*);
396 void	putsymb(char*, int, long, int);
397 void	readundefs(char*, int);
398 long	regoff(Adr*);
399 int	relinv(int);
400 long	rnd(long, long);
401 void	span(void);
402 void	strnput(char*, int);
403 void	undef(void);
404 void	undefsym(Sym*);
405 void	wput(long);
406 void	wputl(long);
407 void	xdefine(char*, int, long);
408 void	xfol(Prog*);
409 void	zerosig(char*);
410 void	noops(void);
411 long	immrot(ulong);
412 long	immaddr(long);
413 long	opbra(int, int);
414 
415 #endif
416