xref: /plan9/sys/src/cmd/kl/l.h (revision b87cd620ecfdc8c76fc402275c5ab6ae2edfd4ee)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier #include	"../kc/k.out.h"
53e12c5d1SDavid du Colombier 
67dd7cddfSDavid du Colombier #ifndef	EXTERN
77dd7cddfSDavid du Colombier #define	EXTERN	extern
87dd7cddfSDavid du Colombier #endif
97dd7cddfSDavid du Colombier 
10*b87cd620SDavid du Colombier #define	LIBNAMELEN	300
11*b87cd620SDavid du Colombier 
123e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
133e12c5d1SDavid du Colombier typedef	struct	Sym	Sym;
143e12c5d1SDavid du Colombier typedef	struct	Autom	Auto;
153e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
163e12c5d1SDavid du Colombier typedef	struct	Optab	Optab;
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier #define	P		((Prog*)0)
193e12c5d1SDavid du Colombier #define	S		((Sym*)0)
20219b2ee8SDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier struct	Adr
233e12c5d1SDavid du Colombier {
243e12c5d1SDavid du Colombier 	union
253e12c5d1SDavid du Colombier 	{
267dd7cddfSDavid du Colombier 		long	u0offset;
277dd7cddfSDavid du Colombier 		char	u0sval[NSNAME];
287dd7cddfSDavid du Colombier 		Ieee	u0ieee;
297dd7cddfSDavid du Colombier 	} u0;
307dd7cddfSDavid du Colombier 	union
317dd7cddfSDavid du Colombier 	{
327dd7cddfSDavid du Colombier 		Auto*	u1autom;
337dd7cddfSDavid du Colombier 		Sym*	u1sym;
347dd7cddfSDavid du Colombier 	} u1;
353e12c5d1SDavid du Colombier 	char	type;
363e12c5d1SDavid du Colombier 	char	reg;
373e12c5d1SDavid du Colombier 	char	name;
383e12c5d1SDavid du Colombier 	char	class;
393e12c5d1SDavid du Colombier };
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier #define	offset	u0.u0offset
427dd7cddfSDavid du Colombier #define	sval	u0.u0sval
437dd7cddfSDavid du Colombier #define	ieee	u0.u0ieee
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier #define	autom	u1.u1autom
467dd7cddfSDavid du Colombier #define	sym	u1.u1sym
477dd7cddfSDavid du Colombier 
483e12c5d1SDavid du Colombier struct	Prog
493e12c5d1SDavid du Colombier {
503e12c5d1SDavid du Colombier 	Adr	from;
513e12c5d1SDavid du Colombier 	Adr	to;
523e12c5d1SDavid du Colombier 	Prog	*forwd;
533e12c5d1SDavid du Colombier 	Prog	*cond;
543e12c5d1SDavid du Colombier 	Prog	*link;
553e12c5d1SDavid du Colombier 	long	pc;
563e12c5d1SDavid du Colombier 	long	regused;
573e12c5d1SDavid du Colombier 	short	line;
583e12c5d1SDavid du Colombier 	short	mark;
597dd7cddfSDavid du Colombier 	uchar	optab;
603e12c5d1SDavid du Colombier 	uchar	as;
613e12c5d1SDavid du Colombier 	char	reg;
623e12c5d1SDavid du Colombier };
633e12c5d1SDavid du Colombier struct	Sym
643e12c5d1SDavid du Colombier {
65219b2ee8SDavid du Colombier 	char	*name;
663e12c5d1SDavid du Colombier 	short	type;
673e12c5d1SDavid du Colombier 	short	version;
68219b2ee8SDavid du Colombier 	short	become;
69219b2ee8SDavid du Colombier 	short	frame;
703e12c5d1SDavid du Colombier 	long	value;
713e12c5d1SDavid du Colombier 	Sym	*link;
723e12c5d1SDavid du Colombier };
733e12c5d1SDavid du Colombier struct	Autom
743e12c5d1SDavid du Colombier {
757dd7cddfSDavid du Colombier 	Sym	*asym;
763e12c5d1SDavid du Colombier 	Auto	*link;
777dd7cddfSDavid du Colombier 	long	aoffset;
783e12c5d1SDavid du Colombier 	short	type;
793e12c5d1SDavid du Colombier };
803e12c5d1SDavid du Colombier struct	Optab
813e12c5d1SDavid du Colombier {
823e12c5d1SDavid du Colombier 	uchar	as;
833e12c5d1SDavid du Colombier 	char	a1;
843e12c5d1SDavid du Colombier 	char	a2;
853e12c5d1SDavid du Colombier 	char	a3;
863e12c5d1SDavid du Colombier 	char	type;
873e12c5d1SDavid du Colombier 	char	size;
883e12c5d1SDavid du Colombier 	char	param;
893e12c5d1SDavid du Colombier };
907dd7cddfSDavid du Colombier EXTERN	struct
913e12c5d1SDavid du Colombier {
923e12c5d1SDavid du Colombier 	Optab*	start;
933e12c5d1SDavid du Colombier 	Optab*	stop;
943e12c5d1SDavid du Colombier } oprange[AEND];
953e12c5d1SDavid du Colombier 
963e12c5d1SDavid du Colombier enum
973e12c5d1SDavid du Colombier {
983e12c5d1SDavid du Colombier 	AXLD		= AEND+1,
993e12c5d1SDavid du Colombier 	AXST,
1003e12c5d1SDavid du Colombier 	FPCHIP		= 1,
1013e12c5d1SDavid du Colombier 	BIG		= 4096-8,
1023e12c5d1SDavid du Colombier 	STRINGSZ	= 200,
103219b2ee8SDavid du Colombier 	MAXIO		= 8192,
104219b2ee8SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1053e12c5d1SDavid du Colombier 	DATBLK		= 1024,
1063e12c5d1SDavid du Colombier 	NHASH		= 10007,
1073e12c5d1SDavid du Colombier 	NHUNK		= 100000,
1083e12c5d1SDavid du Colombier 	MINSIZ		= 64,
1093e12c5d1SDavid du Colombier 	NENT		= 100,
1103e12c5d1SDavid du Colombier 	NSCHED		= 20,
1113e12c5d1SDavid du Colombier 
1123e12c5d1SDavid du Colombier /* mark flags */
1133e12c5d1SDavid du Colombier 	LABEL		= 1<<0,
1143e12c5d1SDavid du Colombier 	LEAF		= 1<<1,
1153e12c5d1SDavid du Colombier 	FLOAT		= 1<<2,
1163e12c5d1SDavid du Colombier 	BRANCH		= 1<<3,
1173e12c5d1SDavid du Colombier 	LOAD		= 1<<4,
1183e12c5d1SDavid du Colombier 	FCMP		= 1<<5,
1193e12c5d1SDavid du Colombier 	SYNC		= 1<<6,
1203e12c5d1SDavid du Colombier 	LIST		= 1<<7,
1213e12c5d1SDavid du Colombier 	FOLL		= 1<<8,
122219b2ee8SDavid du Colombier 	NOSCHED		= 1<<9,
1233e12c5d1SDavid du Colombier 
1243e12c5d1SDavid du Colombier 	STEXT		= 1,
1253e12c5d1SDavid du Colombier 	SDATA,
1263e12c5d1SDavid du Colombier 	SBSS,
1273e12c5d1SDavid du Colombier 	SDATA1,
1283e12c5d1SDavid du Colombier 	SXREF,
1293e12c5d1SDavid du Colombier 	SLEAF,
1303e12c5d1SDavid du Colombier 	SFILE,
131219b2ee8SDavid du Colombier 	SCONST,
1323e12c5d1SDavid du Colombier 
1333e12c5d1SDavid du Colombier 	C_NONE		= 0,
1343e12c5d1SDavid du Colombier 
1353e12c5d1SDavid du Colombier 	C_REG,
1363e12c5d1SDavid du Colombier 	C_FREG,
1373e12c5d1SDavid du Colombier 	C_CREG,
1383e12c5d1SDavid du Colombier 	C_PREG,
1393e12c5d1SDavid du Colombier 	C_FSR,
1403e12c5d1SDavid du Colombier 	C_FQ,
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier 	C_ZCON,		/* 0 */
1433e12c5d1SDavid du Colombier 	C_SCON,		/* 13 bit signed */
1443e12c5d1SDavid du Colombier 	C_UCON,		/* low 10 bits 0 */
1453e12c5d1SDavid du Colombier 	C_LCON,		/* other */
1463e12c5d1SDavid du Colombier 
1473e12c5d1SDavid du Colombier 	C_SACON,
1483e12c5d1SDavid du Colombier 	C_SECON,
1493e12c5d1SDavid du Colombier 	C_LACON,
1503e12c5d1SDavid du Colombier 	C_LECON,
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier 	C_SBRA,
1533e12c5d1SDavid du Colombier 	C_LBRA,
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier 	C_ESAUTO,
1563e12c5d1SDavid du Colombier 	C_OSAUTO,
1573e12c5d1SDavid du Colombier 	C_SAUTO,
1583e12c5d1SDavid du Colombier 	C_OLAUTO,
1593e12c5d1SDavid du Colombier 	C_ELAUTO,
1603e12c5d1SDavid du Colombier 	C_LAUTO,
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier 	C_ESEXT,
1633e12c5d1SDavid du Colombier 	C_OSEXT,
1643e12c5d1SDavid du Colombier 	C_SEXT,
1653e12c5d1SDavid du Colombier 	C_ELEXT,
1663e12c5d1SDavid du Colombier 	C_OLEXT,
1673e12c5d1SDavid du Colombier 	C_LEXT,
1683e12c5d1SDavid du Colombier 
1693e12c5d1SDavid du Colombier 	C_ZOREG,
1703e12c5d1SDavid du Colombier 	C_SOREG,
1713e12c5d1SDavid du Colombier 	C_LOREG,
1723e12c5d1SDavid du Colombier 	C_ASI,
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier 	C_ANY,
1753e12c5d1SDavid du Colombier 
1763e12c5d1SDavid du Colombier 	C_GOK,
1773e12c5d1SDavid du Colombier 
1783e12c5d1SDavid du Colombier 	C_NCLASS
1793e12c5d1SDavid du Colombier };
1803e12c5d1SDavid du Colombier 
1817dd7cddfSDavid du Colombier EXTERN union
182219b2ee8SDavid du Colombier {
183219b2ee8SDavid du Colombier 	struct
184219b2ee8SDavid du Colombier 	{
1857dd7cddfSDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
1867dd7cddfSDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
1877dd7cddfSDavid du Colombier 	} u;
188219b2ee8SDavid du Colombier 	char	dbuf[1];
189219b2ee8SDavid du Colombier } buf;
190219b2ee8SDavid du Colombier 
1917dd7cddfSDavid du Colombier #define	cbuf	u.obuf
1927dd7cddfSDavid du Colombier #define	xbuf	u.ibuf
1937dd7cddfSDavid du Colombier 
1947dd7cddfSDavid du Colombier EXTERN	long	HEADR;			/* length of header */
1957dd7cddfSDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
1967dd7cddfSDavid du Colombier EXTERN	long	INITDAT;		/* data location */
1977dd7cddfSDavid du Colombier EXTERN	long	INITRND;		/* data round above text location */
1987dd7cddfSDavid du Colombier EXTERN	long	INITTEXT;		/* text location */
1997dd7cddfSDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
2007dd7cddfSDavid du Colombier EXTERN	long	autosize;
2017dd7cddfSDavid du Colombier EXTERN	Biobuf	bso;
2027dd7cddfSDavid du Colombier EXTERN	long	bsssize;
2037dd7cddfSDavid du Colombier EXTERN	int	cbc;
2047dd7cddfSDavid du Colombier EXTERN	uchar*	cbp;
2057dd7cddfSDavid du Colombier EXTERN	int	cout;
2067dd7cddfSDavid du Colombier EXTERN	Auto*	curauto;
2077dd7cddfSDavid du Colombier EXTERN	Auto*	curhist;
2087dd7cddfSDavid du Colombier EXTERN	Prog*	curp;
2097dd7cddfSDavid du Colombier EXTERN	Prog*	curtext;
2107dd7cddfSDavid du Colombier EXTERN	Prog*	datap;
2117dd7cddfSDavid du Colombier EXTERN	Prog*	prog_mul;
2127dd7cddfSDavid du Colombier EXTERN	Prog*	prog_div;
2137dd7cddfSDavid du Colombier EXTERN	Prog*	prog_divl;
2147dd7cddfSDavid du Colombier EXTERN	Prog*	prog_mod;
2157dd7cddfSDavid du Colombier EXTERN	Prog*	prog_modl;
2167dd7cddfSDavid du Colombier EXTERN	long	datsize;
2177dd7cddfSDavid du Colombier EXTERN	char	debug[128];
2187dd7cddfSDavid du Colombier EXTERN	Prog*	firstp;
2197dd7cddfSDavid du Colombier EXTERN	char	fnuxi8[8];
2207dd7cddfSDavid du Colombier EXTERN	Sym*	hash[NHASH];
2217dd7cddfSDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
2227dd7cddfSDavid du Colombier EXTERN	int	histfrogp;
2237dd7cddfSDavid du Colombier EXTERN	int	histgen;
2247dd7cddfSDavid du Colombier EXTERN	char*	library[50];
22580ee5cbfSDavid du Colombier EXTERN	char*	libraryobj[50];
2267dd7cddfSDavid du Colombier EXTERN	int	libraryp;
227b7b24591SDavid du Colombier EXTERN	int	xrefresolv;
2287dd7cddfSDavid du Colombier EXTERN	char*	hunk;
2297dd7cddfSDavid du Colombier EXTERN	char	inuxi1[1];
2307dd7cddfSDavid du Colombier EXTERN	char	inuxi2[2];
2317dd7cddfSDavid du Colombier EXTERN	char	inuxi4[4];
2327dd7cddfSDavid du Colombier EXTERN	Prog*	lastp;
2337dd7cddfSDavid du Colombier EXTERN	long	lcsize;
2347dd7cddfSDavid du Colombier EXTERN	char	literal[32];
2357dd7cddfSDavid du Colombier EXTERN	int	nerrors;
2367dd7cddfSDavid du Colombier EXTERN	long	nhunk;
2377dd7cddfSDavid du Colombier EXTERN	char*	noname;
2387dd7cddfSDavid du Colombier EXTERN	long	instoffset;
2397dd7cddfSDavid du Colombier EXTERN	char*	outfile;
2407dd7cddfSDavid du Colombier EXTERN	long	pc;
2417dd7cddfSDavid du Colombier EXTERN	long	symsize;
2427dd7cddfSDavid du Colombier EXTERN	long	staticgen;
2437dd7cddfSDavid du Colombier EXTERN	Prog*	textp;
2447dd7cddfSDavid du Colombier EXTERN	long	textsize;
2457dd7cddfSDavid du Colombier EXTERN	long	tothunk;
2467dd7cddfSDavid du Colombier EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
2477dd7cddfSDavid du Colombier EXTERN	int	version;
2487dd7cddfSDavid du Colombier EXTERN	Prog	zprg;
2497dd7cddfSDavid du Colombier EXTERN	int	dtype;
2503e12c5d1SDavid du Colombier 
2513e12c5d1SDavid du Colombier extern	Optab	optab[];
2523e12c5d1SDavid du Colombier extern	char*	anames[];
2533e12c5d1SDavid du Colombier 
2547dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	int
255406758d9SDavid du Colombier #pragma	varargck	type	"A"	uint
2567dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
2577dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
2587dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
2597dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
2607dd7cddfSDavid du Colombier 
261406758d9SDavid du Colombier #pragma	varargck	argpos	diag 1
262406758d9SDavid du Colombier 
2639a747e4fSDavid du Colombier int	Aconv(Fmt*);
2649a747e4fSDavid du Colombier int	Dconv(Fmt*);
2659a747e4fSDavid du Colombier int	Nconv(Fmt*);
2669a747e4fSDavid du Colombier int	Pconv(Fmt*);
2679a747e4fSDavid du Colombier int	Sconv(Fmt*);
2683e12c5d1SDavid du Colombier int	aclass(Adr*);
2693e12c5d1SDavid du Colombier void	addhist(long, int);
2703e12c5d1SDavid du Colombier void	histtoauto(void);
271*b87cd620SDavid du Colombier void	addlibpath(char*);
2723e12c5d1SDavid du Colombier void	addnop(Prog*);
2733e12c5d1SDavid du Colombier void	append(Prog*, Prog*);
2743e12c5d1SDavid du Colombier void	asmb(void);
2753e12c5d1SDavid du Colombier void	asmlc(void);
2763e12c5d1SDavid du Colombier int	asmout(Prog*, Optab*, int);
2773e12c5d1SDavid du Colombier void	asmsym(void);
2783e12c5d1SDavid du Colombier long	atolwhex(char*);
2793e12c5d1SDavid du Colombier Prog*	brloop(Prog*);
2803e12c5d1SDavid du Colombier void	buildop(void);
2813e12c5d1SDavid du Colombier void	cflush(void);
2823e12c5d1SDavid du Colombier int	cmp(int, int);
2833e12c5d1SDavid du Colombier int	compound(Prog*);
2843e12c5d1SDavid du Colombier double	cputime(void);
2853e12c5d1SDavid du Colombier void	datblk(long, long);
2863e12c5d1SDavid du Colombier void	diag(char*, ...);
2873e12c5d1SDavid du Colombier void	dodata(void);
2883e12c5d1SDavid du Colombier void	doprof1(void);
2893e12c5d1SDavid du Colombier void	doprof2(void);
2903e12c5d1SDavid du Colombier long	entryvalue(void);
2913e12c5d1SDavid du Colombier void	errorexit(void);
2923e12c5d1SDavid du Colombier void	exchange(Prog*);
293*b87cd620SDavid du Colombier int	fileexists(char*);
2943e12c5d1SDavid du Colombier int	find1(long, int);
295*b87cd620SDavid du Colombier char*	findlib(char*);
2963e12c5d1SDavid du Colombier void	follow(void);
2973e12c5d1SDavid du Colombier void	gethunk(void);
2983e12c5d1SDavid du Colombier double	ieeedtod(Ieee*);
2993e12c5d1SDavid du Colombier long	ieeedtof(Ieee*);
300219b2ee8SDavid du Colombier int	isnop(Prog*);
3013e12c5d1SDavid du Colombier void	ldobj(int, long, char*);
302b7b24591SDavid du Colombier void	loadlib(void);
3033e12c5d1SDavid du Colombier void	listinit(void);
3043e12c5d1SDavid du Colombier void	initmuldiv(void);
3053e12c5d1SDavid du Colombier Sym*	lookup(char*, int);
3063e12c5d1SDavid du Colombier void	lput(long);
3073e12c5d1SDavid du Colombier void	mkfwd(void);
3087dd7cddfSDavid du Colombier void*	mysbrk(ulong);
3093e12c5d1SDavid du Colombier void	names(void);
3103e12c5d1SDavid du Colombier void	nocache(Prog*);
3113e12c5d1SDavid du Colombier void	noops(void);
3123e12c5d1SDavid du Colombier void	nuxiinit(void);
3133e12c5d1SDavid du Colombier void	objfile(char*);
3147dd7cddfSDavid du Colombier int	ocmp(const void*, const void*);
3153e12c5d1SDavid du Colombier long	opcode(int);
3163e12c5d1SDavid du Colombier Optab*	oplook(Prog*);
3173e12c5d1SDavid du Colombier void	patch(void);
3183e12c5d1SDavid du Colombier void	prasm(Prog*);
3193e12c5d1SDavid du Colombier void	prepend(Prog*, Prog*);
3203e12c5d1SDavid du Colombier Prog*	prg(void);
3213e12c5d1SDavid du Colombier int	pseudo(Prog*);
3223e12c5d1SDavid du Colombier void	putsymb(char*, int, long, int);
3233e12c5d1SDavid du Colombier long	regoff(Adr*);
3243e12c5d1SDavid du Colombier int	relinv(int);
3253e12c5d1SDavid du Colombier long	rnd(long, long);
3263e12c5d1SDavid du Colombier void	sched(Prog*, Prog*);
3273e12c5d1SDavid du Colombier void	span(void);
3283e12c5d1SDavid du Colombier void	undef(void);
3293e12c5d1SDavid du Colombier void	xdefine(char*, int, long);
3303e12c5d1SDavid du Colombier void	xfol(Prog*);
331