xref: /plan9/sys/src/cmd/vl/l.h (revision a587111c8770e522e3667ff2b63cba8a77811dd9)
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"
58153b942SDavid du Colombier #include	"../8l/elf.h"
63e12c5d1SDavid du Colombier 
77dd7cddfSDavid du Colombier #ifndef	EXTERN
87dd7cddfSDavid du Colombier #define	EXTERN	extern
97dd7cddfSDavid du Colombier #endif
107dd7cddfSDavid du Colombier 
11b87cd620SDavid du Colombier #define	LIBNAMELEN	300
12b87cd620SDavid du Colombier 
133e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
143e12c5d1SDavid du Colombier typedef	struct	Sym	Sym;
153e12c5d1SDavid du Colombier typedef	struct	Autom	Auto;
163e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
173e12c5d1SDavid du Colombier typedef	struct	Optab	Optab;
183e12c5d1SDavid du Colombier typedef	struct	Oprang	Oprang;
193e12c5d1SDavid du Colombier typedef	uchar	Opcross[32][2][32];
20219b2ee8SDavid du Colombier typedef	struct	Count	Count;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier #define	P		((Prog*)0)
233e12c5d1SDavid du Colombier #define	S		((Sym*)0)
24219b2ee8SDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier struct	Adr
273e12c5d1SDavid du Colombier {
283e12c5d1SDavid du Colombier 	union
293e12c5d1SDavid du Colombier 	{
307dd7cddfSDavid du Colombier 		long	u0offset;
317dd7cddfSDavid du Colombier 		char*	u0sval;
327dd7cddfSDavid du Colombier 		Ieee*	u0ieee;
337dd7cddfSDavid du Colombier 	} u0;
343e12c5d1SDavid du Colombier 	union
353e12c5d1SDavid du Colombier 	{
367dd7cddfSDavid du Colombier 		Auto*	u1autom;
377dd7cddfSDavid du Colombier 		Sym*	u1sym;
387dd7cddfSDavid du Colombier 	} u1;
393e12c5d1SDavid du Colombier 	char	type;
403e12c5d1SDavid du Colombier 	char	reg;
413e12c5d1SDavid du Colombier 	char	name;
423e12c5d1SDavid du Colombier 	char	class;
433e12c5d1SDavid du Colombier };
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier #define	offset	u0.u0offset
467dd7cddfSDavid du Colombier #define	sval	u0.u0sval
477dd7cddfSDavid du Colombier #define	ieee	u0.u0ieee
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier #define	autom	u1.u1autom
507dd7cddfSDavid du Colombier #define	sym	u1.u1sym
517dd7cddfSDavid du Colombier 
523e12c5d1SDavid du Colombier struct	Prog
533e12c5d1SDavid du Colombier {
543e12c5d1SDavid du Colombier 	Adr	from;
553e12c5d1SDavid du Colombier 	Adr	to;
563e12c5d1SDavid du Colombier 	union
573e12c5d1SDavid du Colombier 	{
587dd7cddfSDavid du Colombier 		long	u0regused;
597dd7cddfSDavid du Colombier 		Prog*	u0forwd;
607dd7cddfSDavid du Colombier 	} u0;
613e12c5d1SDavid du Colombier 	Prog*	cond;
623e12c5d1SDavid du Colombier 	Prog*	link;
63*a587111cSDavid du Colombier 	vlong	pc;
643e12c5d1SDavid du Colombier 	long	line;
653e12c5d1SDavid du Colombier 	uchar	mark;
663e12c5d1SDavid du Colombier 	uchar	optab;
673e12c5d1SDavid du Colombier 	char	as;
683e12c5d1SDavid du Colombier 	char	reg;
693e12c5d1SDavid du Colombier };
707dd7cddfSDavid du Colombier #define	regused	u0.u0regused
717dd7cddfSDavid du Colombier #define	forwd	u0.u0forwd
727dd7cddfSDavid du Colombier 
733e12c5d1SDavid du Colombier struct	Sym
743e12c5d1SDavid du Colombier {
75219b2ee8SDavid du Colombier 	char	*name;
763e12c5d1SDavid du Colombier 	short	type;
773e12c5d1SDavid du Colombier 	short	version;
78219b2ee8SDavid du Colombier 	short	become;
79219b2ee8SDavid du Colombier 	short	frame;
80*a587111cSDavid du Colombier 	vlong	value;
813e12c5d1SDavid du Colombier 	Sym*	link;
823e12c5d1SDavid du Colombier };
833e12c5d1SDavid du Colombier struct	Autom
843e12c5d1SDavid du Colombier {
857dd7cddfSDavid du Colombier 	Sym*	asym;
863e12c5d1SDavid du Colombier 	Auto*	link;
877dd7cddfSDavid du Colombier 	long	aoffset;
883e12c5d1SDavid du Colombier 	short	type;
893e12c5d1SDavid du Colombier };
903e12c5d1SDavid du Colombier struct	Optab
913e12c5d1SDavid du Colombier {
923e12c5d1SDavid du Colombier 	char	as;
933e12c5d1SDavid du Colombier 	char	a1;
943e12c5d1SDavid du Colombier 	char	a2;
953e12c5d1SDavid du Colombier 	char	a3;
963e12c5d1SDavid du Colombier 	char	type;
973e12c5d1SDavid du Colombier 	char	size;
983e12c5d1SDavid du Colombier 	char	param;
993e12c5d1SDavid du Colombier };
1003e12c5d1SDavid du Colombier struct	Oprang
1013e12c5d1SDavid du Colombier {
1023e12c5d1SDavid du Colombier 	Optab*	start;
1033e12c5d1SDavid du Colombier 	Optab*	stop;
1043e12c5d1SDavid du Colombier };
105219b2ee8SDavid du Colombier struct	Count
1063e12c5d1SDavid du Colombier {
107219b2ee8SDavid du Colombier 	long	count;
108219b2ee8SDavid du Colombier 	long	outof;
1093e12c5d1SDavid du Colombier };
1103e12c5d1SDavid du Colombier 
1113e12c5d1SDavid du Colombier enum
1123e12c5d1SDavid du Colombier {
1133e12c5d1SDavid du Colombier 	STEXT		= 1,
1143e12c5d1SDavid du Colombier 	SDATA,
1153e12c5d1SDavid du Colombier 	SBSS,
1163e12c5d1SDavid du Colombier 	SDATA1,
1173e12c5d1SDavid du Colombier 	SXREF,
1183e12c5d1SDavid du Colombier 	SLEAF,
1193e12c5d1SDavid du Colombier 	SFILE,
120219b2ee8SDavid du Colombier 	SCONST,
1219a747e4fSDavid du Colombier 	SSTRING,
1223e12c5d1SDavid du Colombier 
1233e12c5d1SDavid du Colombier 	C_NONE		= 0,
1243e12c5d1SDavid du Colombier 	C_REG,
1253e12c5d1SDavid du Colombier 	C_FREG,
1263e12c5d1SDavid du Colombier 	C_FCREG,
1273e12c5d1SDavid du Colombier 	C_MREG,
1283e12c5d1SDavid du Colombier 	C_HI,
1293e12c5d1SDavid du Colombier 	C_LO,
1303e12c5d1SDavid du Colombier 	C_ZCON,
1313e12c5d1SDavid du Colombier 	C_SCON,
1323e12c5d1SDavid du Colombier 	C_ADD0CON,
1333e12c5d1SDavid du Colombier 	C_AND0CON,
1343e12c5d1SDavid du Colombier 	C_ADDCON,
1353e12c5d1SDavid du Colombier 	C_ANDCON,
1363e12c5d1SDavid du Colombier 	C_UCON,
1373e12c5d1SDavid du Colombier 	C_LCON,
1383e12c5d1SDavid du Colombier 	C_SACON,
1393e12c5d1SDavid du Colombier 	C_SECON,
1403e12c5d1SDavid du Colombier 	C_LACON,
1413e12c5d1SDavid du Colombier 	C_LECON,
1423e12c5d1SDavid du Colombier 	C_SBRA,
1433e12c5d1SDavid du Colombier 	C_LBRA,
1443e12c5d1SDavid du Colombier 	C_SAUTO,
1453e12c5d1SDavid du Colombier 	C_SEXT,
1463e12c5d1SDavid du Colombier 	C_LAUTO,
1473e12c5d1SDavid du Colombier 	C_LEXT,
1483e12c5d1SDavid du Colombier 	C_ZOREG,
1493e12c5d1SDavid du Colombier 	C_SOREG,
1503e12c5d1SDavid du Colombier 	C_LOREG,
1513e12c5d1SDavid du Colombier 	C_GOK,
1523e12c5d1SDavid du Colombier 
153219b2ee8SDavid du Colombier 	NSCHED		= 20,
1543e12c5d1SDavid du Colombier 
155219b2ee8SDavid du Colombier /* mark flags */
156219b2ee8SDavid du Colombier 	FOLL		= 1<<0,
157219b2ee8SDavid du Colombier 	LABEL		= 1<<1,
158219b2ee8SDavid du Colombier 	LEAF		= 1<<2,
159219b2ee8SDavid du Colombier 	SYNC		= 1<<3,
1603e12c5d1SDavid du Colombier 	BRANCH		= 1<<4,
1613e12c5d1SDavid du Colombier 	LOAD		= 1<<5,
162219b2ee8SDavid du Colombier 	FCMP		= 1<<6,
163219b2ee8SDavid du Colombier 	NOSCHED		= 1<<7,
1643e12c5d1SDavid du Colombier 
1653e12c5d1SDavid du Colombier 	BIG		= 32766,
1663e12c5d1SDavid du Colombier 	STRINGSZ	= 200,
1673e12c5d1SDavid du Colombier 	NHASH		= 10007,
1683e12c5d1SDavid du Colombier 	NHUNK		= 100000,
1693e12c5d1SDavid du Colombier 	MINSIZ		= 64,
1703e12c5d1SDavid du Colombier 	NENT		= 100,
171219b2ee8SDavid du Colombier 	MAXIO		= 8192,
172219b2ee8SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1733e12c5d1SDavid du Colombier };
1743e12c5d1SDavid du Colombier 
1757dd7cddfSDavid du Colombier EXTERN union
176219b2ee8SDavid du Colombier {
177219b2ee8SDavid du Colombier 	struct
178219b2ee8SDavid du Colombier 	{
1797dd7cddfSDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
1807dd7cddfSDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
1817dd7cddfSDavid du Colombier 	} u;
182219b2ee8SDavid du Colombier 	char	dbuf[1];
183219b2ee8SDavid du Colombier } buf;
184219b2ee8SDavid du Colombier 
1857dd7cddfSDavid du Colombier #define	cbuf	u.obuf
1867dd7cddfSDavid du Colombier #define	xbuf	u.ibuf
187219b2ee8SDavid du Colombier 
1887dd7cddfSDavid du Colombier EXTERN	long	HEADR;			/* length of header */
1897dd7cddfSDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
190*a587111cSDavid du Colombier EXTERN	vlong	INITDAT;		/* data location */
191*a587111cSDavid du Colombier EXTERN	vlong	INITRND;		/* data round above text location */
192*a587111cSDavid du Colombier EXTERN	vlong	INITTEXT;		/* text location */
193*a587111cSDavid du Colombier EXTERN	vlong	INITTEXTP;		/* text location (physical) */
1947dd7cddfSDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
1957dd7cddfSDavid du Colombier EXTERN	long	autosize;
1967dd7cddfSDavid du Colombier EXTERN	Biobuf	bso;
1977dd7cddfSDavid du Colombier EXTERN	long	bsssize;
1987dd7cddfSDavid du Colombier EXTERN	int	cbc;
1997dd7cddfSDavid du Colombier EXTERN	uchar*	cbp;
2007dd7cddfSDavid du Colombier EXTERN	int	cout;
2017dd7cddfSDavid du Colombier EXTERN	Auto*	curauto;
2027dd7cddfSDavid du Colombier EXTERN	Auto*	curhist;
2037dd7cddfSDavid du Colombier EXTERN	Prog*	curp;
2047dd7cddfSDavid du Colombier EXTERN	Prog*	curtext;
2057dd7cddfSDavid du Colombier EXTERN	Prog*	datap;
2067dd7cddfSDavid du Colombier EXTERN	long	datsize;
2077dd7cddfSDavid du Colombier EXTERN	char	debug[128];
2087dd7cddfSDavid du Colombier EXTERN	Prog*	etextp;
2097dd7cddfSDavid du Colombier EXTERN	Prog*	firstp;
2106a9fc400SDavid du Colombier EXTERN	char	fnuxi4[4];	/* for 3l [sic] */
2117dd7cddfSDavid du Colombier EXTERN	char	fnuxi8[8];
2127dd7cddfSDavid du Colombier EXTERN	char*	noname;
2137dd7cddfSDavid du Colombier EXTERN	Sym*	hash[NHASH];
2147dd7cddfSDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
2157dd7cddfSDavid du Colombier EXTERN	int	histfrogp;
2167dd7cddfSDavid du Colombier EXTERN	int	histgen;
2177dd7cddfSDavid du Colombier EXTERN	char*	library[50];
21880ee5cbfSDavid du Colombier EXTERN	char*	libraryobj[50];
2197dd7cddfSDavid du Colombier EXTERN	int	libraryp;
2207dd7cddfSDavid du Colombier EXTERN	int	xrefresolv;
2217dd7cddfSDavid du Colombier EXTERN	char*	hunk;
2227dd7cddfSDavid du Colombier EXTERN	char	inuxi1[1];
2237dd7cddfSDavid du Colombier EXTERN	char	inuxi2[2];
2247dd7cddfSDavid du Colombier EXTERN	char	inuxi4[4];
2257dd7cddfSDavid du Colombier EXTERN	Prog*	lastp;
2267dd7cddfSDavid du Colombier EXTERN	long	lcsize;
2277dd7cddfSDavid du Colombier EXTERN	char	literal[32];
2287dd7cddfSDavid du Colombier EXTERN	int	nerrors;
2297dd7cddfSDavid du Colombier EXTERN	long	nhunk;
2307dd7cddfSDavid du Colombier EXTERN	long	instoffset;
2317dd7cddfSDavid du Colombier EXTERN	Opcross	opcross[10];
2327dd7cddfSDavid du Colombier EXTERN	Oprang	oprange[ALAST];
2337dd7cddfSDavid du Colombier EXTERN	char*	outfile;
234*a587111cSDavid du Colombier EXTERN	vlong	pc;
2357dd7cddfSDavid du Colombier EXTERN	uchar	repop[ALAST];
2367dd7cddfSDavid du Colombier EXTERN	long	symsize;
2377dd7cddfSDavid du Colombier EXTERN	Prog*	textp;
238*a587111cSDavid du Colombier EXTERN	vlong	textsize;
2397dd7cddfSDavid du Colombier EXTERN	long	thunk;
2407dd7cddfSDavid du Colombier EXTERN	int	version;
2417dd7cddfSDavid du Colombier EXTERN	char	xcmp[32][32];
2427dd7cddfSDavid du Colombier EXTERN	Prog	zprg;
2437dd7cddfSDavid du Colombier EXTERN	int	dtype;
24491178603SDavid du Colombier EXTERN	int	little;
2457dd7cddfSDavid du Colombier 
2467dd7cddfSDavid du Colombier EXTERN	struct
247219b2ee8SDavid du Colombier {
248219b2ee8SDavid du Colombier 	Count	branch;
249219b2ee8SDavid du Colombier 	Count	fcmp;
250219b2ee8SDavid du Colombier 	Count	load;
251219b2ee8SDavid du Colombier 	Count	mfrom;
252219b2ee8SDavid du Colombier 	Count	page;
253219b2ee8SDavid du Colombier 	Count	jump;
25458b97a46SDavid du Colombier 	Count	store;
255219b2ee8SDavid du Colombier } nop;
2563e12c5d1SDavid du Colombier 
2573e12c5d1SDavid du Colombier extern	char*	anames[];
2583e12c5d1SDavid du Colombier extern	Optab	optab[];
2593e12c5d1SDavid du Colombier 
2607dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	int
2617dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
2627dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
2637dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
2647dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
2657dd7cddfSDavid du Colombier 
266406758d9SDavid du Colombier #pragma	varargck	argpos	diag 1
267406758d9SDavid du Colombier 
2689a747e4fSDavid du Colombier int	Aconv(Fmt*);
2699a747e4fSDavid du Colombier int	Dconv(Fmt*);
2709a747e4fSDavid du Colombier int	Nconv(Fmt*);
2719a747e4fSDavid du Colombier int	Pconv(Fmt*);
2729a747e4fSDavid du Colombier int	Sconv(Fmt*);
2733e12c5d1SDavid du Colombier int	aclass(Adr*);
2743e12c5d1SDavid du Colombier void	addhist(long, int);
275b87cd620SDavid du Colombier void	addlibpath(char*);
2763e12c5d1SDavid du Colombier void	addnop(Prog*);
2773e12c5d1SDavid du Colombier void	append(Prog*, Prog*);
2783e12c5d1SDavid du Colombier void	asmb(void);
2793e12c5d1SDavid du Colombier void	asmlc(void);
2803e12c5d1SDavid du Colombier int	asmout(Prog*, Optab*, int);
2813e12c5d1SDavid du Colombier void	asmsym(void);
282*a587111cSDavid du Colombier vlong	atolwhex(char*);
2833e12c5d1SDavid du Colombier Prog*	brloop(Prog*);
2843e12c5d1SDavid du Colombier void	buildop(void);
2853e12c5d1SDavid du Colombier void	buildrep(int, int);
2863e12c5d1SDavid du Colombier void	cflush(void);
2873e12c5d1SDavid du Colombier int	cmp(int, int);
2888153b942SDavid du Colombier void	cput(long);
2893e12c5d1SDavid du Colombier int	compound(Prog*);
2903e12c5d1SDavid du Colombier double	cputime(void);
2919a747e4fSDavid du Colombier void	datblk(long, long, int);
2923e12c5d1SDavid du Colombier void	diag(char*, ...);
2933e12c5d1SDavid du Colombier void	dodata(void);
2943e12c5d1SDavid du Colombier void	doprof1(void);
2953e12c5d1SDavid du Colombier void	doprof2(void);
2963e12c5d1SDavid du Colombier long	entryvalue(void);
2973e12c5d1SDavid du Colombier void	errorexit(void);
2983e12c5d1SDavid du Colombier void	exchange(Prog*);
299b87cd620SDavid du Colombier int	fileexists(char*);
3003e12c5d1SDavid du Colombier int	find1(long, int);
301b87cd620SDavid du Colombier char*	findlib(char*);
3023e12c5d1SDavid du Colombier void	follow(void);
3033e12c5d1SDavid du Colombier void	gethunk(void);
3043e12c5d1SDavid du Colombier void	histtoauto(void);
3053e12c5d1SDavid du Colombier double	ieeedtod(Ieee*);
3063e12c5d1SDavid du Colombier long	ieeedtof(Ieee*);
307219b2ee8SDavid du Colombier int	isnop(Prog*);
3083e12c5d1SDavid du Colombier void	ldobj(int, long, char*);
3097dd7cddfSDavid du Colombier void	loadlib(void);
3103e12c5d1SDavid du Colombier void	listinit(void);
3113e12c5d1SDavid du Colombier Sym*	lookup(char*, int);
3128153b942SDavid du Colombier void	llput(vlong);
3138153b942SDavid du Colombier void	llputl(vlong);
3143e12c5d1SDavid du Colombier void	lput(long);
3158153b942SDavid du Colombier void	lputl(long);
31691178603SDavid du Colombier void	bput(long);
3173e12c5d1SDavid du Colombier void	mkfwd(void);
3187dd7cddfSDavid du Colombier void*	mysbrk(ulong);
3193e12c5d1SDavid du Colombier void	names(void);
3203e12c5d1SDavid du Colombier void	nocache(Prog*);
3213e12c5d1SDavid du Colombier void	noops(void);
322*a587111cSDavid du Colombier void	nopstat(char*, Count*);
3233e12c5d1SDavid du Colombier void	nuxiinit(void);
3243e12c5d1SDavid du Colombier void	objfile(char*);
3257dd7cddfSDavid du Colombier int	ocmp(const void*, const void*);
3263e12c5d1SDavid du Colombier long	opirr(int);
3273e12c5d1SDavid du Colombier Optab*	oplook(Prog*);
3283e12c5d1SDavid du Colombier long	oprrr(int);
3293e12c5d1SDavid du Colombier void	patch(void);
3303e12c5d1SDavid du Colombier void	prasm(Prog*);
3313e12c5d1SDavid du Colombier void	prepend(Prog*, Prog*);
3323e12c5d1SDavid du Colombier Prog*	prg(void);
3333e12c5d1SDavid du Colombier int	pseudo(Prog*);
3343e12c5d1SDavid du Colombier void	putsymb(char*, int, long, int);
3353e12c5d1SDavid du Colombier long	regoff(Adr*);
3363e12c5d1SDavid du Colombier int	relinv(int);
337*a587111cSDavid du Colombier vlong	rnd(vlong, long);
3383e12c5d1SDavid du Colombier void	sched(Prog*, Prog*);
3393e12c5d1SDavid du Colombier void	span(void);
340219b2ee8SDavid du Colombier void	strnput(char*, int);
3413e12c5d1SDavid du Colombier void	undef(void);
3428153b942SDavid du Colombier void	wput(long);
3438153b942SDavid du Colombier void	wputl(long);
3443e12c5d1SDavid du Colombier void	xdefine(char*, int, long);
3453e12c5d1SDavid du Colombier void	xfol(Prog*);
3463e12c5d1SDavid du Colombier void	xfol(Prog*);
347