xref: /plan9/sys/src/cmd/ql/l.h (revision 8153b942127462338e00e239914941524d579a3b)
17dd7cddfSDavid du Colombier #include	<u.h>
27dd7cddfSDavid du Colombier #include	<libc.h>
37dd7cddfSDavid du Colombier #include	<bio.h>
47dd7cddfSDavid du Colombier #include	"../qc/q.out.h"
5*8153b942SDavid du Colombier #include	"../8l/elf.h"
67dd7cddfSDavid du Colombier 
7375daca8SDavid du Colombier #ifndef	EXTERN
8375daca8SDavid du Colombier #define	EXTERN	extern
9375daca8SDavid du Colombier #endif
10375daca8SDavid du Colombier 
11b87cd620SDavid du Colombier #define	LIBNAMELEN	300
12b87cd620SDavid du Colombier 
137dd7cddfSDavid du Colombier typedef	struct	Adr	Adr;
147dd7cddfSDavid du Colombier typedef	struct	Sym	Sym;
157dd7cddfSDavid du Colombier typedef	struct	Autom	Auto;
167dd7cddfSDavid du Colombier typedef	struct	Prog	Prog;
177dd7cddfSDavid du Colombier typedef	struct	Optab	Optab;
187dd7cddfSDavid du Colombier 
197dd7cddfSDavid du Colombier #define	P		((Prog*)0)
207dd7cddfSDavid du Colombier #define	S		((Sym*)0)
217dd7cddfSDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier struct	Adr
247dd7cddfSDavid du Colombier {
257dd7cddfSDavid du Colombier 	union
267dd7cddfSDavid du Colombier 	{
27375daca8SDavid du Colombier 		long	u0offset;
28375daca8SDavid du Colombier 		char	u0sval[NSNAME];
29375daca8SDavid du Colombier 		Ieee	u0ieee;
30375daca8SDavid du Colombier 	}u0;
317dd7cddfSDavid du Colombier 	Sym	*sym;
327dd7cddfSDavid du Colombier 	Auto	*autom;
337dd7cddfSDavid du Colombier 	char	type;
347dd7cddfSDavid du Colombier 	uchar	reg;
357dd7cddfSDavid du Colombier 	char	name;
367dd7cddfSDavid du Colombier 	char	class;
377dd7cddfSDavid du Colombier };
38375daca8SDavid du Colombier 
39375daca8SDavid du Colombier #define	offset	u0.u0offset
40375daca8SDavid du Colombier #define	sval	u0.u0sval
41375daca8SDavid du Colombier #define	ieee	u0.u0ieee
42375daca8SDavid du Colombier 
437dd7cddfSDavid du Colombier struct	Prog
447dd7cddfSDavid du Colombier {
457dd7cddfSDavid du Colombier 	Adr	from;
467dd7cddfSDavid du Colombier 	Adr	from3;	/* fma and rlwm */
477dd7cddfSDavid du Colombier 	Adr	to;
487dd7cddfSDavid du Colombier 	Prog	*forwd;
497dd7cddfSDavid du Colombier 	Prog	*cond;
507dd7cddfSDavid du Colombier 	Prog	*link;
517dd7cddfSDavid du Colombier 	long	pc;
527dd7cddfSDavid du Colombier 	long	regused;
537dd7cddfSDavid du Colombier 	short	line;
547dd7cddfSDavid du Colombier 	short	mark;
557dd7cddfSDavid du Colombier 	short	optab;		/* could be uchar */
562ddf2468SDavid du Colombier 	ushort	as;
577dd7cddfSDavid du Colombier 	char	reg;
587dd7cddfSDavid du Colombier };
597dd7cddfSDavid du Colombier struct	Sym
607dd7cddfSDavid du Colombier {
617dd7cddfSDavid du Colombier 	char	*name;
627dd7cddfSDavid du Colombier 	short	type;
637dd7cddfSDavid du Colombier 	short	version;
647dd7cddfSDavid du Colombier 	short	become;
657dd7cddfSDavid du Colombier 	short	frame;
66375daca8SDavid du Colombier 	uchar	subtype;
67375daca8SDavid du Colombier 	ushort	file;
687dd7cddfSDavid du Colombier 	long	value;
69375daca8SDavid du Colombier 	long	sig;
707dd7cddfSDavid du Colombier 	Sym	*link;
717dd7cddfSDavid du Colombier };
727dd7cddfSDavid du Colombier struct	Autom
737dd7cddfSDavid du Colombier {
747dd7cddfSDavid du Colombier 	Sym	*sym;
757dd7cddfSDavid du Colombier 	Auto	*link;
76375daca8SDavid du Colombier 	long	aoffset;
777dd7cddfSDavid du Colombier 	short	type;
787dd7cddfSDavid du Colombier };
797dd7cddfSDavid du Colombier struct	Optab
807dd7cddfSDavid du Colombier {
812ddf2468SDavid du Colombier 	ushort	as;
827dd7cddfSDavid du Colombier 	char	a1;
837dd7cddfSDavid du Colombier 	char	a2;
847dd7cddfSDavid du Colombier 	char	a3;
857dd7cddfSDavid du Colombier 	char	a4;
867dd7cddfSDavid du Colombier 	char	type;
877dd7cddfSDavid du Colombier 	char	size;
887dd7cddfSDavid du Colombier 	char	param;
897dd7cddfSDavid du Colombier };
907dd7cddfSDavid du Colombier struct
917dd7cddfSDavid du Colombier {
927dd7cddfSDavid du Colombier 	Optab*	start;
937dd7cddfSDavid du Colombier 	Optab*	stop;
943f193c01SDavid du Colombier } oprange[ALAST];
957dd7cddfSDavid du Colombier 
967dd7cddfSDavid du Colombier enum
977dd7cddfSDavid du Colombier {
987dd7cddfSDavid du Colombier 	FPCHIP		= 1,
997dd7cddfSDavid du Colombier 	BIG		= 32768-8,
1007dd7cddfSDavid du Colombier 	STRINGSZ	= 200,
1017dd7cddfSDavid du Colombier 	MAXIO		= 8192,
1027dd7cddfSDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1037dd7cddfSDavid du Colombier 	DATBLK		= 1024,
1047dd7cddfSDavid du Colombier 	NHASH		= 10007,
1057dd7cddfSDavid du Colombier 	NHUNK		= 100000,
1067dd7cddfSDavid du Colombier 	MINSIZ		= 64,
1077dd7cddfSDavid du Colombier 	NENT		= 100,
1087dd7cddfSDavid du Colombier 	NSCHED		= 20,
1097dd7cddfSDavid du Colombier 
1107dd7cddfSDavid du Colombier /* mark flags */
1117dd7cddfSDavid du Colombier 	LABEL		= 1<<0,
1127dd7cddfSDavid du Colombier 	LEAF		= 1<<1,
1137dd7cddfSDavid du Colombier 	FLOAT		= 1<<2,
1147dd7cddfSDavid du Colombier 	BRANCH		= 1<<3,
1157dd7cddfSDavid du Colombier 	LOAD		= 1<<4,
1167dd7cddfSDavid du Colombier 	FCMP		= 1<<5,
1177dd7cddfSDavid du Colombier 	SYNC		= 1<<6,
1187dd7cddfSDavid du Colombier 	LIST		= 1<<7,
1197dd7cddfSDavid du Colombier 	FOLL		= 1<<8,
1207dd7cddfSDavid du Colombier 	NOSCHED		= 1<<9,
1217dd7cddfSDavid du Colombier 
1227dd7cddfSDavid du Colombier 	STEXT		= 1,
1237dd7cddfSDavid du Colombier 	SDATA,
1247dd7cddfSDavid du Colombier 	SBSS,
1257dd7cddfSDavid du Colombier 	SDATA1,
1267dd7cddfSDavid du Colombier 	SXREF,
1277dd7cddfSDavid du Colombier 	SLEAF,
1287dd7cddfSDavid du Colombier 	SFILE,
1297dd7cddfSDavid du Colombier 	SCONST,
130375daca8SDavid du Colombier 	SUNDEF,
131375daca8SDavid du Colombier 
132375daca8SDavid du Colombier 	SIMPORT,
133375daca8SDavid du Colombier 	SEXPORT,
1347dd7cddfSDavid du Colombier 
1357dd7cddfSDavid du Colombier 	C_NONE		= 0,
1367dd7cddfSDavid du Colombier 	C_REG,
1377dd7cddfSDavid du Colombier 	C_FREG,
1387dd7cddfSDavid du Colombier 	C_CREG,
1397dd7cddfSDavid du Colombier 	C_SPR,		/* special processor register */
1407dd7cddfSDavid du Colombier 	C_SREG,		/* segment register (32 bit implementations only) */
1417dd7cddfSDavid du Colombier 	C_ZCON,
1427dd7cddfSDavid du Colombier 	C_SCON,		/* 16 bit signed */
1437dd7cddfSDavid du Colombier 	C_UCON,		/* low 16 bits 0 */
1447dd7cddfSDavid du Colombier 	C_ADDCON,	/* -0x8000 <= v < 0 */
1457dd7cddfSDavid du Colombier 	C_ANDCON,	/* 0 < v <= 0xFFFF */
1467dd7cddfSDavid du Colombier 	C_LCON,		/* other */
1477dd7cddfSDavid du Colombier 	C_SACON,
1487dd7cddfSDavid du Colombier 	C_SECON,
1497dd7cddfSDavid du Colombier 	C_LACON,
1507dd7cddfSDavid du Colombier 	C_LECON,
1517dd7cddfSDavid du Colombier 	C_SBRA,
1527dd7cddfSDavid du Colombier 	C_LBRA,
1537dd7cddfSDavid du Colombier 	C_SAUTO,
1547dd7cddfSDavid du Colombier 	C_LAUTO,
1557dd7cddfSDavid du Colombier 	C_SEXT,
1567dd7cddfSDavid du Colombier 	C_LEXT,
1577dd7cddfSDavid du Colombier 	C_ZOREG,
1587dd7cddfSDavid du Colombier 	C_SOREG,
1597dd7cddfSDavid du Colombier 	C_LOREG,
1607dd7cddfSDavid du Colombier 	C_FPSCR,
1617dd7cddfSDavid du Colombier 	C_MSR,
1627dd7cddfSDavid du Colombier 	C_XER,
1637dd7cddfSDavid du Colombier 	C_LR,
1647dd7cddfSDavid du Colombier 	C_CTR,
1657dd7cddfSDavid du Colombier 	C_ANY,
1667dd7cddfSDavid du Colombier 	C_GOK,
167375daca8SDavid du Colombier 	C_ADDR,
1687dd7cddfSDavid du Colombier 
169375daca8SDavid du Colombier 	C_NCLASS,
170375daca8SDavid du Colombier 
171375daca8SDavid du Colombier 	Roffset	= 22,		/* no. bits for offset in relocation address */
172375daca8SDavid du Colombier 	Rindex	= 10		/* no. bits for index in relocation address */
1737dd7cddfSDavid du Colombier };
1747dd7cddfSDavid du Colombier 
175375daca8SDavid du Colombier EXTERN union
1767dd7cddfSDavid du Colombier {
1777dd7cddfSDavid du Colombier 	struct
1787dd7cddfSDavid du Colombier 	{
179375daca8SDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
180375daca8SDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
181375daca8SDavid du Colombier 	} u;
1827dd7cddfSDavid du Colombier 	char	dbuf[1];
1837dd7cddfSDavid du Colombier } buf;
1847dd7cddfSDavid du Colombier 
185375daca8SDavid du Colombier #define	cbuf	u.obuf
186375daca8SDavid du Colombier #define	xbuf	u.ibuf
187375daca8SDavid du Colombier 
188375daca8SDavid du Colombier EXTERN	long	HEADR;			/* length of header */
189375daca8SDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
190375daca8SDavid du Colombier EXTERN	long	INITDAT;		/* data location */
191375daca8SDavid du Colombier EXTERN	long	INITRND;		/* data round above text location */
192375daca8SDavid du Colombier EXTERN	long	INITTEXT;		/* text location */
193*8153b942SDavid du Colombier EXTERN	long	INITTEXTP;		/* text location (physical) */
194375daca8SDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
195375daca8SDavid du Colombier EXTERN	long	autosize;
196375daca8SDavid du Colombier EXTERN	Biobuf	bso;
197375daca8SDavid du Colombier EXTERN	long	bsssize;
198375daca8SDavid du Colombier EXTERN	int	cbc;
199375daca8SDavid du Colombier EXTERN	uchar*	cbp;
200375daca8SDavid du Colombier EXTERN	int	cout;
201375daca8SDavid du Colombier EXTERN	Auto*	curauto;
202375daca8SDavid du Colombier EXTERN	Auto*	curhist;
203375daca8SDavid du Colombier EXTERN	Prog*	curp;
204375daca8SDavid du Colombier EXTERN	Prog*	curtext;
205375daca8SDavid du Colombier EXTERN	Prog*	datap;
206375daca8SDavid du Colombier EXTERN	Prog*	prog_movsw;
207375daca8SDavid du Colombier EXTERN	Prog*	prog_movdw;
208375daca8SDavid du Colombier EXTERN	Prog*	prog_movws;
209375daca8SDavid du Colombier EXTERN	Prog*	prog_movwd;
210375daca8SDavid du Colombier EXTERN	long	datsize;
211375daca8SDavid du Colombier EXTERN	char	debug[128];
212375daca8SDavid du Colombier EXTERN	Prog*	firstp;
213375daca8SDavid du Colombier EXTERN	char	fnuxi8[8];
214375daca8SDavid du Colombier EXTERN	Sym*	hash[NHASH];
215375daca8SDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
216375daca8SDavid du Colombier EXTERN	int	histfrogp;
217375daca8SDavid du Colombier EXTERN	int	histgen;
218375daca8SDavid du Colombier EXTERN	char*	library[50];
219375daca8SDavid du Colombier EXTERN	char*	libraryobj[50];
220375daca8SDavid du Colombier EXTERN	int	libraryp;
221375daca8SDavid du Colombier EXTERN	int	xrefresolv;
222375daca8SDavid du Colombier EXTERN	char*	hunk;
223375daca8SDavid du Colombier EXTERN	char	inuxi1[1];
224375daca8SDavid du Colombier EXTERN	char	inuxi2[2];
225375daca8SDavid du Colombier EXTERN	char	inuxi4[4];
226375daca8SDavid du Colombier EXTERN	Prog*	lastp;
227375daca8SDavid du Colombier EXTERN	long	lcsize;
228375daca8SDavid du Colombier EXTERN	char	literal[32];
229375daca8SDavid du Colombier EXTERN	int	nerrors;
230375daca8SDavid du Colombier EXTERN	long	nhunk;
231375daca8SDavid du Colombier EXTERN	char*	noname;
232375daca8SDavid du Colombier EXTERN	long	instoffset;
233375daca8SDavid du Colombier EXTERN	char*	outfile;
234375daca8SDavid du Colombier EXTERN	long	pc;
235375daca8SDavid du Colombier EXTERN	int	r0iszero;
236375daca8SDavid du Colombier EXTERN	long	symsize;
237375daca8SDavid du Colombier EXTERN	long	staticgen;
238375daca8SDavid du Colombier EXTERN	Prog*	textp;
239375daca8SDavid du Colombier EXTERN	long	textsize;
240375daca8SDavid du Colombier EXTERN	long	tothunk;
241375daca8SDavid du Colombier EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
242375daca8SDavid du Colombier EXTERN	int	version;
243375daca8SDavid du Colombier EXTERN	Prog	zprg;
244375daca8SDavid du Colombier EXTERN	int	dtype;
245375daca8SDavid du Colombier 
246375daca8SDavid du Colombier EXTERN	int	doexp, dlm;
247375daca8SDavid du Colombier EXTERN	int	imports, nimports;
248375daca8SDavid du Colombier EXTERN	int	exports, nexports;
249375daca8SDavid du Colombier EXTERN	char*	EXPTAB;
250375daca8SDavid du Colombier EXTERN	Prog	undefp;
251375daca8SDavid du Colombier 
252375daca8SDavid du Colombier #define	UP	(&undefp)
2537dd7cddfSDavid du Colombier 
2547dd7cddfSDavid du Colombier extern	Optab	optab[];
2557dd7cddfSDavid du Colombier extern	char*	anames[];
2567dd7cddfSDavid du Colombier extern	char*	cnames[];
2577dd7cddfSDavid du Colombier 
2589a747e4fSDavid du Colombier int	Aconv(Fmt*);
2599a747e4fSDavid du Colombier int	Dconv(Fmt*);
2609a747e4fSDavid du Colombier int	Nconv(Fmt*);
2619a747e4fSDavid du Colombier int	Pconv(Fmt*);
2629a747e4fSDavid du Colombier int	Sconv(Fmt*);
2639a747e4fSDavid du Colombier int	Rconv(Fmt*);
2647dd7cddfSDavid du Colombier int	aclass(Adr*);
2657dd7cddfSDavid du Colombier void	addhist(long, int);
2667dd7cddfSDavid du Colombier void	histtoauto(void);
267b87cd620SDavid du Colombier void	addlibpath(char*);
2687dd7cddfSDavid du Colombier void	addnop(Prog*);
2697dd7cddfSDavid du Colombier void	append(Prog*, Prog*);
2707dd7cddfSDavid du Colombier void	asmb(void);
271375daca8SDavid du Colombier void	asmdyn(void);
2727dd7cddfSDavid du Colombier void	asmlc(void);
2737dd7cddfSDavid du Colombier int	asmout(Prog*, Optab*, int);
2747dd7cddfSDavid du Colombier void	asmsym(void);
2757dd7cddfSDavid du Colombier long	atolwhex(char*);
2767dd7cddfSDavid du Colombier Prog*	brloop(Prog*);
2777dd7cddfSDavid du Colombier void	buildop(void);
2787dd7cddfSDavid du Colombier void	cflush(void);
279375daca8SDavid du Colombier void	ckoff(Sym*, long);
2807dd7cddfSDavid du Colombier int	cmp(int, int);
281375daca8SDavid du Colombier void	cput(long);
2827dd7cddfSDavid du Colombier int	compound(Prog*);
2837dd7cddfSDavid du Colombier double	cputime(void);
2847dd7cddfSDavid du Colombier void	datblk(long, long);
2857dd7cddfSDavid du Colombier void	diag(char*, ...);
2867dd7cddfSDavid du Colombier void	dodata(void);
2877dd7cddfSDavid du Colombier void	doprof1(void);
2887dd7cddfSDavid du Colombier void	doprof2(void);
289375daca8SDavid du Colombier void	dynreloc(Sym*, long, int, int, int);
2907dd7cddfSDavid du Colombier long	entryvalue(void);
2917dd7cddfSDavid du Colombier void	errorexit(void);
2927dd7cddfSDavid du Colombier void	exchange(Prog*);
293375daca8SDavid du Colombier void	export(void);
294b87cd620SDavid du Colombier int	fileexists(char*);
2957dd7cddfSDavid du Colombier int	find1(long, int);
296b87cd620SDavid du Colombier char*	findlib(char*);
2977dd7cddfSDavid du Colombier void	follow(void);
2987dd7cddfSDavid du Colombier void	gethunk(void);
2997dd7cddfSDavid du Colombier double	ieeedtod(Ieee*);
3007dd7cddfSDavid du Colombier long	ieeedtof(Ieee*);
301375daca8SDavid du Colombier void	import(void);
3027dd7cddfSDavid du Colombier int	isnop(Prog*);
3037dd7cddfSDavid du Colombier void	ldobj(int, long, char*);
3047dd7cddfSDavid du Colombier void	loadlib(void);
3057dd7cddfSDavid du Colombier void	listinit(void);
3067dd7cddfSDavid du Colombier void	initmuldiv(void);
3077dd7cddfSDavid du Colombier Sym*	lookup(char*, int);
308*8153b942SDavid du Colombier void	llput(vlong);
309*8153b942SDavid du Colombier void	llputl(vlong);
3107dd7cddfSDavid du Colombier void	lput(long);
311*8153b942SDavid du Colombier void	lputl(long);
3127dd7cddfSDavid du Colombier void	mkfwd(void);
313375daca8SDavid du Colombier void*	mysbrk(ulong);
3147dd7cddfSDavid du Colombier void	names(void);
3157dd7cddfSDavid du Colombier void	nocache(Prog*);
3167dd7cddfSDavid du Colombier void	noops(void);
3176891d857SDavid du Colombier void	nopout(Prog*);
3187dd7cddfSDavid du Colombier void	nuxiinit(void);
3197dd7cddfSDavid du Colombier void	objfile(char*);
3207dd7cddfSDavid du Colombier int	ocmp(void*, void*);
3217dd7cddfSDavid du Colombier long	opcode(int);
3227dd7cddfSDavid du Colombier Optab*	oplook(Prog*);
3237dd7cddfSDavid du Colombier void	patch(void);
3247dd7cddfSDavid du Colombier void	prasm(Prog*);
3257dd7cddfSDavid du Colombier void	prepend(Prog*, Prog*);
3267dd7cddfSDavid du Colombier Prog*	prg(void);
3277dd7cddfSDavid du Colombier int	pseudo(Prog*);
3287dd7cddfSDavid du Colombier void	putsymb(char*, int, long, int);
329375daca8SDavid du Colombier void	readundefs(char*, int);
3307dd7cddfSDavid du Colombier long	regoff(Adr*);
3317dd7cddfSDavid du Colombier int	relinv(int);
3327dd7cddfSDavid du Colombier long	rnd(long, long);
3337dd7cddfSDavid du Colombier void	sched(Prog*, Prog*);
3347dd7cddfSDavid du Colombier void	span(void);
335*8153b942SDavid du Colombier void	strnput(char*, int);
3367dd7cddfSDavid du Colombier void	undef(void);
337375daca8SDavid du Colombier void	undefsym(Sym*);
338375daca8SDavid du Colombier void	wput(long);
339*8153b942SDavid du Colombier void	wputl(long);
3407dd7cddfSDavid du Colombier void	xdefine(char*, int, long);
3417dd7cddfSDavid du Colombier void	xfol(Prog*);
342375daca8SDavid du Colombier void	zerosig(char*);
3437dd7cddfSDavid du Colombier 
344406758d9SDavid du Colombier #pragma	varargck	type	"A"	int
345406758d9SDavid du Colombier #pragma	varargck	type	"A"	uint
3467dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
3477dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
3487dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
3497dd7cddfSDavid du Colombier #pragma	varargck	type	"R"	int
3507dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
351406758d9SDavid du Colombier 
352406758d9SDavid du Colombier #pragma	varargck	argpos	diag 1
353