xref: /plan9/sys/src/cmd/vl/l.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier #include	"../vc/v.out.h"
53e12c5d1SDavid du Colombier 
67dd7cddfSDavid du Colombier #ifndef	EXTERN
77dd7cddfSDavid du Colombier #define	EXTERN	extern
87dd7cddfSDavid du Colombier #endif
97dd7cddfSDavid du Colombier 
103e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
113e12c5d1SDavid du Colombier typedef	struct	Sym	Sym;
123e12c5d1SDavid du Colombier typedef	struct	Autom	Auto;
133e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
143e12c5d1SDavid du Colombier typedef	struct	Optab	Optab;
153e12c5d1SDavid du Colombier typedef	struct	Oprang	Oprang;
163e12c5d1SDavid du Colombier typedef	uchar	Opcross[32][2][32];
17219b2ee8SDavid du Colombier typedef	struct	Count	Count;
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier #define	P		((Prog*)0)
203e12c5d1SDavid du Colombier #define	S		((Sym*)0)
21219b2ee8SDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier struct	Adr
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier 	union
263e12c5d1SDavid du Colombier 	{
277dd7cddfSDavid du Colombier 		long	u0offset;
287dd7cddfSDavid du Colombier 		char*	u0sval;
297dd7cddfSDavid du Colombier 		Ieee*	u0ieee;
307dd7cddfSDavid du Colombier 	} u0;
313e12c5d1SDavid du Colombier 	union
323e12c5d1SDavid du Colombier 	{
337dd7cddfSDavid du Colombier 		Auto*	u1autom;
347dd7cddfSDavid du Colombier 		Sym*	u1sym;
357dd7cddfSDavid du Colombier 	} u1;
363e12c5d1SDavid du Colombier 	char	type;
373e12c5d1SDavid du Colombier 	char	reg;
383e12c5d1SDavid du Colombier 	char	name;
393e12c5d1SDavid du Colombier 	char	class;
403e12c5d1SDavid du Colombier };
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier #define	offset	u0.u0offset
437dd7cddfSDavid du Colombier #define	sval	u0.u0sval
447dd7cddfSDavid du Colombier #define	ieee	u0.u0ieee
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier #define	autom	u1.u1autom
477dd7cddfSDavid du Colombier #define	sym	u1.u1sym
487dd7cddfSDavid du Colombier 
493e12c5d1SDavid du Colombier struct	Prog
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier 	Adr	from;
523e12c5d1SDavid du Colombier 	Adr	to;
533e12c5d1SDavid du Colombier 	union
543e12c5d1SDavid du Colombier 	{
557dd7cddfSDavid du Colombier 		long	u0regused;
567dd7cddfSDavid du Colombier 		Prog*	u0forwd;
577dd7cddfSDavid du Colombier 	} u0;
583e12c5d1SDavid du Colombier 	Prog*	cond;
593e12c5d1SDavid du Colombier 	Prog*	link;
603e12c5d1SDavid du Colombier 	long	pc;
613e12c5d1SDavid du Colombier 	long	line;
623e12c5d1SDavid du Colombier 	uchar	mark;
633e12c5d1SDavid du Colombier 	uchar	optab;
643e12c5d1SDavid du Colombier 	char	as;
653e12c5d1SDavid du Colombier 	char	reg;
663e12c5d1SDavid du Colombier };
677dd7cddfSDavid du Colombier #define	regused	u0.u0regused
687dd7cddfSDavid du Colombier #define	forwd	u0.u0forwd
697dd7cddfSDavid du Colombier 
703e12c5d1SDavid du Colombier struct	Sym
713e12c5d1SDavid du Colombier {
72219b2ee8SDavid du Colombier 	char	*name;
733e12c5d1SDavid du Colombier 	short	type;
743e12c5d1SDavid du Colombier 	short	version;
75219b2ee8SDavid du Colombier 	short	become;
76219b2ee8SDavid du Colombier 	short	frame;
773e12c5d1SDavid du Colombier 	long	value;
783e12c5d1SDavid du Colombier 	Sym*	link;
793e12c5d1SDavid du Colombier };
803e12c5d1SDavid du Colombier struct	Autom
813e12c5d1SDavid du Colombier {
827dd7cddfSDavid du Colombier 	Sym*	asym;
833e12c5d1SDavid du Colombier 	Auto*	link;
847dd7cddfSDavid du Colombier 	long	aoffset;
853e12c5d1SDavid du Colombier 	short	type;
863e12c5d1SDavid du Colombier };
873e12c5d1SDavid du Colombier struct	Optab
883e12c5d1SDavid du Colombier {
893e12c5d1SDavid du Colombier 	char	as;
903e12c5d1SDavid du Colombier 	char	a1;
913e12c5d1SDavid du Colombier 	char	a2;
923e12c5d1SDavid du Colombier 	char	a3;
933e12c5d1SDavid du Colombier 	char	type;
943e12c5d1SDavid du Colombier 	char	size;
953e12c5d1SDavid du Colombier 	char	param;
963e12c5d1SDavid du Colombier };
973e12c5d1SDavid du Colombier struct	Oprang
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier 	Optab*	start;
1003e12c5d1SDavid du Colombier 	Optab*	stop;
1013e12c5d1SDavid du Colombier };
102219b2ee8SDavid du Colombier struct	Count
1033e12c5d1SDavid du Colombier {
104219b2ee8SDavid du Colombier 	long	count;
105219b2ee8SDavid du Colombier 	long	outof;
1063e12c5d1SDavid du Colombier };
1073e12c5d1SDavid du Colombier 
1083e12c5d1SDavid du Colombier enum
1093e12c5d1SDavid du Colombier {
1103e12c5d1SDavid du Colombier 	STEXT		= 1,
1113e12c5d1SDavid du Colombier 	SDATA,
1123e12c5d1SDavid du Colombier 	SBSS,
1133e12c5d1SDavid du Colombier 	SDATA1,
1143e12c5d1SDavid du Colombier 	SXREF,
1153e12c5d1SDavid du Colombier 	SLEAF,
1163e12c5d1SDavid du Colombier 	SFILE,
117219b2ee8SDavid du Colombier 	SCONST,
118*9a747e4fSDavid du Colombier 	SSTRING,
1193e12c5d1SDavid du Colombier 
1203e12c5d1SDavid du Colombier 	C_NONE		= 0,
1213e12c5d1SDavid du Colombier 	C_REG,
1223e12c5d1SDavid du Colombier 	C_FREG,
1233e12c5d1SDavid du Colombier 	C_FCREG,
1243e12c5d1SDavid du Colombier 	C_MREG,
1253e12c5d1SDavid du Colombier 	C_HI,
1263e12c5d1SDavid du Colombier 	C_LO,
1273e12c5d1SDavid du Colombier 	C_ZCON,
1283e12c5d1SDavid du Colombier 	C_SCON,
1293e12c5d1SDavid du Colombier 	C_ADD0CON,
1303e12c5d1SDavid du Colombier 	C_AND0CON,
1313e12c5d1SDavid du Colombier 	C_ADDCON,
1323e12c5d1SDavid du Colombier 	C_ANDCON,
1333e12c5d1SDavid du Colombier 	C_UCON,
1343e12c5d1SDavid du Colombier 	C_LCON,
1353e12c5d1SDavid du Colombier 	C_SACON,
1363e12c5d1SDavid du Colombier 	C_SECON,
1373e12c5d1SDavid du Colombier 	C_LACON,
1383e12c5d1SDavid du Colombier 	C_LECON,
1393e12c5d1SDavid du Colombier 	C_SBRA,
1403e12c5d1SDavid du Colombier 	C_LBRA,
1413e12c5d1SDavid du Colombier 	C_SAUTO,
1423e12c5d1SDavid du Colombier 	C_SEXT,
1433e12c5d1SDavid du Colombier 	C_LAUTO,
1443e12c5d1SDavid du Colombier 	C_LEXT,
1453e12c5d1SDavid du Colombier 	C_ZOREG,
1463e12c5d1SDavid du Colombier 	C_SOREG,
1473e12c5d1SDavid du Colombier 	C_LOREG,
1483e12c5d1SDavid du Colombier 	C_GOK,
1493e12c5d1SDavid du Colombier 
150219b2ee8SDavid du Colombier 	NSCHED		= 20,
1513e12c5d1SDavid du Colombier 
152219b2ee8SDavid du Colombier /* mark flags */
153219b2ee8SDavid du Colombier 	FOLL		= 1<<0,
154219b2ee8SDavid du Colombier 	LABEL		= 1<<1,
155219b2ee8SDavid du Colombier 	LEAF		= 1<<2,
156219b2ee8SDavid du Colombier 	SYNC		= 1<<3,
1573e12c5d1SDavid du Colombier 	BRANCH		= 1<<4,
1583e12c5d1SDavid du Colombier 	LOAD		= 1<<5,
159219b2ee8SDavid du Colombier 	FCMP		= 1<<6,
160219b2ee8SDavid du Colombier 	NOSCHED		= 1<<7,
1613e12c5d1SDavid du Colombier 
1623e12c5d1SDavid du Colombier 	BIG		= 32766,
1633e12c5d1SDavid du Colombier 	STRINGSZ	= 200,
1643e12c5d1SDavid du Colombier 	NHASH		= 10007,
1653e12c5d1SDavid du Colombier 	NHUNK		= 100000,
1663e12c5d1SDavid du Colombier 	MINSIZ		= 64,
1673e12c5d1SDavid du Colombier 	NENT		= 100,
168219b2ee8SDavid du Colombier 	MAXIO		= 8192,
169219b2ee8SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1703e12c5d1SDavid du Colombier };
1713e12c5d1SDavid du Colombier 
1727dd7cddfSDavid du Colombier EXTERN union
173219b2ee8SDavid du Colombier {
174219b2ee8SDavid du Colombier 	struct
175219b2ee8SDavid du Colombier 	{
1767dd7cddfSDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
1777dd7cddfSDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
1787dd7cddfSDavid du Colombier 	} u;
179219b2ee8SDavid du Colombier 	char	dbuf[1];
180219b2ee8SDavid du Colombier } buf;
181219b2ee8SDavid du Colombier 
1827dd7cddfSDavid du Colombier #define	cbuf	u.obuf
1837dd7cddfSDavid du Colombier #define	xbuf	u.ibuf
184219b2ee8SDavid du Colombier 
1857dd7cddfSDavid du Colombier EXTERN	long	HEADR;			/* length of header */
1867dd7cddfSDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
1877dd7cddfSDavid du Colombier EXTERN	long	INITDAT;		/* data location */
1887dd7cddfSDavid du Colombier EXTERN	long	INITRND;		/* data round above text location */
1897dd7cddfSDavid du Colombier EXTERN	long	INITTEXT;		/* text location */
1907dd7cddfSDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
1917dd7cddfSDavid du Colombier EXTERN	long	autosize;
1927dd7cddfSDavid du Colombier EXTERN	Biobuf	bso;
1937dd7cddfSDavid du Colombier EXTERN	long	bsssize;
1947dd7cddfSDavid du Colombier EXTERN	int	cbc;
1957dd7cddfSDavid du Colombier EXTERN	uchar*	cbp;
1967dd7cddfSDavid du Colombier EXTERN	int	cout;
1977dd7cddfSDavid du Colombier EXTERN	Auto*	curauto;
1987dd7cddfSDavid du Colombier EXTERN	Auto*	curhist;
1997dd7cddfSDavid du Colombier EXTERN	Prog*	curp;
2007dd7cddfSDavid du Colombier EXTERN	Prog*	curtext;
2017dd7cddfSDavid du Colombier EXTERN	Prog*	datap;
2027dd7cddfSDavid du Colombier EXTERN	long	datsize;
2037dd7cddfSDavid du Colombier EXTERN	char	debug[128];
2047dd7cddfSDavid du Colombier EXTERN	Prog*	etextp;
2057dd7cddfSDavid du Colombier EXTERN	Prog*	firstp;
2067dd7cddfSDavid du Colombier EXTERN	char	fnuxi8[8];
2077dd7cddfSDavid du Colombier EXTERN	char*	noname;
2087dd7cddfSDavid du Colombier EXTERN	Sym*	hash[NHASH];
2097dd7cddfSDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
2107dd7cddfSDavid du Colombier EXTERN	int	histfrogp;
2117dd7cddfSDavid du Colombier EXTERN	int	histgen;
2127dd7cddfSDavid du Colombier EXTERN	char*	library[50];
21380ee5cbfSDavid du Colombier EXTERN	char*	libraryobj[50];
2147dd7cddfSDavid du Colombier EXTERN	int	libraryp;
2157dd7cddfSDavid du Colombier EXTERN	int	xrefresolv;
2167dd7cddfSDavid du Colombier EXTERN	char*	hunk;
2177dd7cddfSDavid du Colombier EXTERN	char	inuxi1[1];
2187dd7cddfSDavid du Colombier EXTERN	char	inuxi2[2];
2197dd7cddfSDavid du Colombier EXTERN	char	inuxi4[4];
2207dd7cddfSDavid du Colombier EXTERN	Prog*	lastp;
2217dd7cddfSDavid du Colombier EXTERN	long	lcsize;
2227dd7cddfSDavid du Colombier EXTERN	char	literal[32];
2237dd7cddfSDavid du Colombier EXTERN	int	nerrors;
2247dd7cddfSDavid du Colombier EXTERN	long	nhunk;
2257dd7cddfSDavid du Colombier EXTERN	long	instoffset;
2267dd7cddfSDavid du Colombier EXTERN	Opcross	opcross[10];
2277dd7cddfSDavid du Colombier EXTERN	Oprang	oprange[ALAST];
2287dd7cddfSDavid du Colombier EXTERN	char*	outfile;
2297dd7cddfSDavid du Colombier EXTERN	long	pc;
2307dd7cddfSDavid du Colombier EXTERN	uchar	repop[ALAST];
2317dd7cddfSDavid du Colombier EXTERN	long	symsize;
2327dd7cddfSDavid du Colombier EXTERN	Prog*	textp;
2337dd7cddfSDavid du Colombier EXTERN	long	textsize;
2347dd7cddfSDavid du Colombier EXTERN	long	thunk;
2357dd7cddfSDavid du Colombier EXTERN	int	version;
2367dd7cddfSDavid du Colombier EXTERN	char	xcmp[32][32];
2377dd7cddfSDavid du Colombier EXTERN	Prog	zprg;
2387dd7cddfSDavid du Colombier EXTERN	int	dtype;
2397dd7cddfSDavid du Colombier 
2407dd7cddfSDavid du Colombier EXTERN	struct
241219b2ee8SDavid du Colombier {
242219b2ee8SDavid du Colombier 	Count	branch;
243219b2ee8SDavid du Colombier 	Count	fcmp;
244219b2ee8SDavid du Colombier 	Count	load;
245219b2ee8SDavid du Colombier 	Count	mfrom;
246219b2ee8SDavid du Colombier 	Count	page;
247219b2ee8SDavid du Colombier 	Count	jump;
248219b2ee8SDavid du Colombier } nop;
2493e12c5d1SDavid du Colombier 
2503e12c5d1SDavid du Colombier extern	char*	anames[];
2513e12c5d1SDavid du Colombier extern	Optab	optab[];
2523e12c5d1SDavid du Colombier 
2537dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	int
2547dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
2557dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
2567dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
2577dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
2587dd7cddfSDavid du Colombier 
259*9a747e4fSDavid du Colombier int	Aconv(Fmt*);
260*9a747e4fSDavid du Colombier int	Dconv(Fmt*);
261*9a747e4fSDavid du Colombier int	Nconv(Fmt*);
262*9a747e4fSDavid du Colombier int	Pconv(Fmt*);
263*9a747e4fSDavid du Colombier int	Sconv(Fmt*);
2643e12c5d1SDavid du Colombier int	aclass(Adr*);
2653e12c5d1SDavid du Colombier void	addhist(long, int);
2663e12c5d1SDavid du Colombier void	addnop(Prog*);
2673e12c5d1SDavid du Colombier void	append(Prog*, Prog*);
2683e12c5d1SDavid du Colombier void	asmb(void);
2693e12c5d1SDavid du Colombier void	asmlc(void);
2703e12c5d1SDavid du Colombier int	asmout(Prog*, Optab*, int);
2713e12c5d1SDavid du Colombier void	asmsym(void);
2723e12c5d1SDavid du Colombier long	atolwhex(char*);
2733e12c5d1SDavid du Colombier Prog*	brloop(Prog*);
2743e12c5d1SDavid du Colombier Biobuf	bso;
2753e12c5d1SDavid du Colombier void	buildop(void);
2763e12c5d1SDavid du Colombier void	buildrep(int, int);
2773e12c5d1SDavid du Colombier void	cflush(void);
2783e12c5d1SDavid du Colombier int	cmp(int, int);
2793e12c5d1SDavid du Colombier int	compound(Prog*);
2803e12c5d1SDavid du Colombier double	cputime(void);
281*9a747e4fSDavid du Colombier void	datblk(long, long, int);
2823e12c5d1SDavid du Colombier void	diag(char*, ...);
2833e12c5d1SDavid du Colombier void	dodata(void);
2843e12c5d1SDavid du Colombier void	doprof1(void);
2853e12c5d1SDavid du Colombier void	doprof2(void);
2863e12c5d1SDavid du Colombier long	entryvalue(void);
2873e12c5d1SDavid du Colombier void	errorexit(void);
2883e12c5d1SDavid du Colombier void	exchange(Prog*);
2893e12c5d1SDavid du Colombier int	find1(long, int);
2903e12c5d1SDavid du Colombier void	follow(void);
2913e12c5d1SDavid du Colombier void	gethunk(void);
2923e12c5d1SDavid du Colombier void	histtoauto(void);
2933e12c5d1SDavid du Colombier double	ieeedtod(Ieee*);
2943e12c5d1SDavid du Colombier long	ieeedtof(Ieee*);
295219b2ee8SDavid du Colombier int	isnop(Prog*);
2963e12c5d1SDavid du Colombier void	ldobj(int, long, char*);
2977dd7cddfSDavid du Colombier void	loadlib(void);
2983e12c5d1SDavid du Colombier void	listinit(void);
2993e12c5d1SDavid du Colombier Sym*	lookup(char*, int);
3003e12c5d1SDavid du Colombier void	lput(long);
3013e12c5d1SDavid du Colombier void	mkfwd(void);
3027dd7cddfSDavid du Colombier void*	mysbrk(ulong);
3033e12c5d1SDavid du Colombier void	names(void);
3043e12c5d1SDavid du Colombier void	nocache(Prog*);
3053e12c5d1SDavid du Colombier void	noops(void);
3063e12c5d1SDavid du Colombier void	nuxiinit(void);
3073e12c5d1SDavid du Colombier void	objfile(char*);
3087dd7cddfSDavid du Colombier int	ocmp(const void*, const void*);
3093e12c5d1SDavid du Colombier long	opirr(int);
3103e12c5d1SDavid du Colombier Optab*	oplook(Prog*);
3113e12c5d1SDavid du Colombier long	oprrr(int);
3123e12c5d1SDavid du Colombier void	patch(void);
3133e12c5d1SDavid du Colombier void	prasm(Prog*);
3143e12c5d1SDavid du Colombier void	prepend(Prog*, Prog*);
3153e12c5d1SDavid du Colombier Prog*	prg(void);
3163e12c5d1SDavid du Colombier int	pseudo(Prog*);
3173e12c5d1SDavid du Colombier void	putsymb(char*, int, long, int);
3183e12c5d1SDavid du Colombier long	regoff(Adr*);
3193e12c5d1SDavid du Colombier int	relinv(int);
3203e12c5d1SDavid du Colombier long	rnd(long, long);
3213e12c5d1SDavid du Colombier void	sched(Prog*, Prog*);
3223e12c5d1SDavid du Colombier void	span(void);
323219b2ee8SDavid du Colombier void	strnput(char*, int);
3243e12c5d1SDavid du Colombier void	undef(void);
3253e12c5d1SDavid du Colombier void	xdefine(char*, int, long);
3263e12c5d1SDavid du Colombier void	xfol(Prog*);
3273e12c5d1SDavid du Colombier void	xfol(Prog*);
328219b2ee8SDavid du Colombier void	nopstat(char*, Count*);
329