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