xref: /plan9/sys/src/cmd/8l/l.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier #include	"../8c/8.out.h"
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier #define	P		((Prog*)0)
73e12c5d1SDavid du Colombier #define	S		((Sym*)0)
83e12c5d1SDavid du Colombier #define	TNAME		(curtext?curtext->from.sym->name:noname)
93e12c5d1SDavid du Colombier #define	CPUT(c)\
103e12c5d1SDavid du Colombier 	{ *cbp++ = c;\
113e12c5d1SDavid du Colombier 	if(--cbc <= 0)\
123e12c5d1SDavid du Colombier 		cflush(); }
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
153e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
163e12c5d1SDavid du Colombier typedef	struct	Sym	Sym;
173e12c5d1SDavid du Colombier typedef	struct	Auto	Auto;
183e12c5d1SDavid du Colombier typedef	struct	Optab	Optab;
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier struct	Adr
213e12c5d1SDavid du Colombier {
223e12c5d1SDavid du Colombier 	union
233e12c5d1SDavid du Colombier 	{
243e12c5d1SDavid du Colombier 		long	offset;
253e12c5d1SDavid du Colombier 		char	scon[8];
263e12c5d1SDavid du Colombier 		Prog	*cond;	/* not used, but should be D_BRANCH */
273e12c5d1SDavid du Colombier 		Ieee	ieee;
283e12c5d1SDavid du Colombier 	};
293e12c5d1SDavid du Colombier 	union
303e12c5d1SDavid du Colombier 	{
313e12c5d1SDavid du Colombier 		Auto*	autom;
323e12c5d1SDavid du Colombier 		Sym*	sym;
333e12c5d1SDavid du Colombier 	};
343e12c5d1SDavid du Colombier 	short	type;
353e12c5d1SDavid du Colombier 	char	index;
363e12c5d1SDavid du Colombier 	char	scale;
373e12c5d1SDavid du Colombier };
383e12c5d1SDavid du Colombier 
393e12c5d1SDavid du Colombier struct	Prog
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	Adr	from;
423e12c5d1SDavid du Colombier 	Adr	to;
433e12c5d1SDavid du Colombier 	union
443e12c5d1SDavid du Colombier 	{
453e12c5d1SDavid du Colombier 		Prog	*forwd;
463e12c5d1SDavid du Colombier 	};
473e12c5d1SDavid du Colombier 	Prog*	link;
483e12c5d1SDavid du Colombier 	Prog*	cond;	/* work on this */
493e12c5d1SDavid du Colombier 	long	pc;
503e12c5d1SDavid du Colombier 	long	line;
513e12c5d1SDavid du Colombier 	uchar	mark;	/* work on these */
523e12c5d1SDavid du Colombier 	uchar	back;
533e12c5d1SDavid du Colombier 
543e12c5d1SDavid du Colombier 	short	as;
553e12c5d1SDavid du Colombier 	char	width;		/* fake for DATA */
563e12c5d1SDavid du Colombier };
573e12c5d1SDavid du Colombier struct	Auto
583e12c5d1SDavid du Colombier {
593e12c5d1SDavid du Colombier 	Sym*	sym;
603e12c5d1SDavid du Colombier 	Auto*	link;
613e12c5d1SDavid du Colombier 	long	offset;
623e12c5d1SDavid du Colombier 	short	type;
633e12c5d1SDavid du Colombier };
643e12c5d1SDavid du Colombier struct	Sym
653e12c5d1SDavid du Colombier {
66*219b2ee8SDavid du Colombier 	char	*name;
673e12c5d1SDavid du Colombier 	short	type;
683e12c5d1SDavid du Colombier 	short	version;
69*219b2ee8SDavid du Colombier 	short	become;
70*219b2ee8SDavid du Colombier 	short	frame;
713e12c5d1SDavid du Colombier 	long	value;
723e12c5d1SDavid du Colombier 	Sym*	link;
733e12c5d1SDavid du Colombier };
743e12c5d1SDavid du Colombier struct	Optab
753e12c5d1SDavid du Colombier {
763e12c5d1SDavid du Colombier 	short	as;
773e12c5d1SDavid du Colombier 	uchar*	ytab;
783e12c5d1SDavid du Colombier 	uchar	prefix;
793e12c5d1SDavid du Colombier 	uchar	op[10];
803e12c5d1SDavid du Colombier };
813e12c5d1SDavid du Colombier 
823e12c5d1SDavid du Colombier enum
833e12c5d1SDavid du Colombier {
843e12c5d1SDavid du Colombier 	STEXT		= 1,
853e12c5d1SDavid du Colombier 	SDATA,
863e12c5d1SDavid du Colombier 	SBSS,
873e12c5d1SDavid du Colombier 	SDATA1,
883e12c5d1SDavid du Colombier 	SXREF,
893e12c5d1SDavid du Colombier 	SFILE,
90*219b2ee8SDavid du Colombier 	SCONST,
91*219b2ee8SDavid du Colombier 
923e12c5d1SDavid du Colombier 	NHASH		= 10007,
933e12c5d1SDavid du Colombier 	NHUNK		= 100000,
943e12c5d1SDavid du Colombier 	MINSIZ		= 4,
953e12c5d1SDavid du Colombier 	STRINGSZ	= 200,
963e12c5d1SDavid du Colombier 	MINLC		= 1,
97*219b2ee8SDavid du Colombier 	MAXIO		= 8192,
98*219b2ee8SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
993e12c5d1SDavid du Colombier 
1003e12c5d1SDavid du Colombier 	Yxxx		= 0,
1013e12c5d1SDavid du Colombier 	Ynone,
1023e12c5d1SDavid du Colombier 	Yi0,
1033e12c5d1SDavid du Colombier 	Yi1,
1043e12c5d1SDavid du Colombier 	Yi8,
1053e12c5d1SDavid du Colombier 	Yi32,
106*219b2ee8SDavid du Colombier 	Yiauto,
1073e12c5d1SDavid du Colombier 	Yal,
1083e12c5d1SDavid du Colombier 	Ycl,
1093e12c5d1SDavid du Colombier 	Yax,
1103e12c5d1SDavid du Colombier 	Ycx,
1113e12c5d1SDavid du Colombier 	Yrb,
1123e12c5d1SDavid du Colombier 	Yrl,
1133e12c5d1SDavid du Colombier 	Yrf,
1143e12c5d1SDavid du Colombier 	Yf0,
1153e12c5d1SDavid du Colombier 	Yrx,
1163e12c5d1SDavid du Colombier 	Ymb,
1173e12c5d1SDavid du Colombier 	Yml,
1183e12c5d1SDavid du Colombier 	Ym,
1193e12c5d1SDavid du Colombier 	Ybr,
1203e12c5d1SDavid du Colombier 	Ycol,
1213e12c5d1SDavid du Colombier 
1223e12c5d1SDavid du Colombier 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
1233e12c5d1SDavid du Colombier 	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
1243e12c5d1SDavid du Colombier 	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,
1253e12c5d1SDavid du Colombier 	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
1263e12c5d1SDavid du Colombier 	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,
1273e12c5d1SDavid du Colombier 	Ymax,
1283e12c5d1SDavid du Colombier 
1293e12c5d1SDavid du Colombier 	Zxxx		= 0,
1303e12c5d1SDavid du Colombier 
1313e12c5d1SDavid du Colombier 	Zlit,
1323e12c5d1SDavid du Colombier 	Z_rp,
1333e12c5d1SDavid du Colombier 	Zbr,
1343e12c5d1SDavid du Colombier 	Zcall,
1353e12c5d1SDavid du Colombier 	Zib_,
1363e12c5d1SDavid du Colombier 	Zib_rp,
1373e12c5d1SDavid du Colombier 	Zibo_m,
1383e12c5d1SDavid du Colombier 	Zil_,
1393e12c5d1SDavid du Colombier 	Zil_rp,
1403e12c5d1SDavid du Colombier 	Zilo_m,
1413e12c5d1SDavid du Colombier 	Zjmp,
1423e12c5d1SDavid du Colombier 	Zloop,
1433e12c5d1SDavid du Colombier 	Zm_o,
1443e12c5d1SDavid du Colombier 	Zm_r,
145*219b2ee8SDavid du Colombier 	Zaut_r,
1463e12c5d1SDavid du Colombier 	Zo_m,
1473e12c5d1SDavid du Colombier 	Zpseudo,
1483e12c5d1SDavid du Colombier 	Zr_m,
1493e12c5d1SDavid du Colombier 	Zrp_,
1503e12c5d1SDavid du Colombier 	Z_ib,
1513e12c5d1SDavid du Colombier 	Z_il,
1523e12c5d1SDavid du Colombier 	Zm_ibo,
1533e12c5d1SDavid du Colombier 	Zm_ilo,
1543e12c5d1SDavid du Colombier 	Zclr,
1553e12c5d1SDavid du Colombier 	Zbyte,
1563e12c5d1SDavid du Colombier 	Zmov,
1573e12c5d1SDavid du Colombier 	Zmax,
1583e12c5d1SDavid du Colombier 
1593e12c5d1SDavid du Colombier 	Px		= 0,
1603e12c5d1SDavid du Colombier 	Pe		= 0x66,	/* operand escape */
1613e12c5d1SDavid du Colombier 	Pm		= 0x0f,	/* 2byte opcode escape */
1623e12c5d1SDavid du Colombier 	Pq		= 0xff,	/* both escape */
1633e12c5d1SDavid du Colombier 	Pb		= 0xfe,	/* byte operands */
1643e12c5d1SDavid du Colombier };
1653e12c5d1SDavid du Colombier 
166*219b2ee8SDavid du Colombier union
167*219b2ee8SDavid du Colombier {
168*219b2ee8SDavid du Colombier 	struct
169*219b2ee8SDavid du Colombier 	{
170*219b2ee8SDavid du Colombier 		char	cbuf[MAXIO];			/* output buffer */
171*219b2ee8SDavid du Colombier 		uchar	xbuf[MAXIO];			/* input buffer */
172*219b2ee8SDavid du Colombier 	};
173*219b2ee8SDavid du Colombier 	char	dbuf[1];
174*219b2ee8SDavid du Colombier } buf;
175*219b2ee8SDavid du Colombier 
1763e12c5d1SDavid du Colombier long	HEADR;
1773e12c5d1SDavid du Colombier long	HEADTYPE;
1783e12c5d1SDavid du Colombier long	INITDAT;
1793e12c5d1SDavid du Colombier long	INITRND;
1803e12c5d1SDavid du Colombier long	INITTEXT;
1813e12c5d1SDavid du Colombier char*	INITENTRY;		/* entry point */
1823e12c5d1SDavid du Colombier Biobuf	bso;
1833e12c5d1SDavid du Colombier long	bsssize;
1843e12c5d1SDavid du Colombier long	casepc;
1853e12c5d1SDavid du Colombier int	cbc;
1863e12c5d1SDavid du Colombier char*	cbp;
1873e12c5d1SDavid du Colombier char*	pcstr;
1883e12c5d1SDavid du Colombier int	cout;
1893e12c5d1SDavid du Colombier Auto*	curauto;
1903e12c5d1SDavid du Colombier Auto*	curhist;
1913e12c5d1SDavid du Colombier Prog*	curp;
1923e12c5d1SDavid du Colombier Prog*	curtext;
1933e12c5d1SDavid du Colombier Prog*	datap;
1943e12c5d1SDavid du Colombier Prog*	edatap;
1953e12c5d1SDavid du Colombier long	datsize;
1963e12c5d1SDavid du Colombier char	debug[128];
197*219b2ee8SDavid du Colombier char	literal[32];
1983e12c5d1SDavid du Colombier Prog*	etextp;
1993e12c5d1SDavid du Colombier Prog*	firstp;
2003e12c5d1SDavid du Colombier char	fnuxi8[8];
2013e12c5d1SDavid du Colombier char	fnuxi4[4];
2023e12c5d1SDavid du Colombier Sym*	hash[NHASH];
203*219b2ee8SDavid du Colombier Sym*	histfrog[MAXHIST];
2043e12c5d1SDavid du Colombier int	histfrogp;
2053e12c5d1SDavid du Colombier int	histgen;
2063e12c5d1SDavid du Colombier char*	library[50];
2073e12c5d1SDavid du Colombier int	libraryp;
2083e12c5d1SDavid du Colombier char*	hunk;
2093e12c5d1SDavid du Colombier char	inuxi1[1];
2103e12c5d1SDavid du Colombier char	inuxi2[2];
2113e12c5d1SDavid du Colombier char	inuxi4[4];
2123e12c5d1SDavid du Colombier char	ycover[Ymax*Ymax];
2133e12c5d1SDavid du Colombier uchar*	andptr;
2143e12c5d1SDavid du Colombier uchar	and[10];
2153e12c5d1SDavid du Colombier char	reg[D_NONE];
2163e12c5d1SDavid du Colombier Prog*	lastp;
2173e12c5d1SDavid du Colombier long	lcsize;
2183e12c5d1SDavid du Colombier int	maxop;
2193e12c5d1SDavid du Colombier int	nerrors;
2203e12c5d1SDavid du Colombier long	nhunk;
2213e12c5d1SDavid du Colombier long	nsymbol;
2223e12c5d1SDavid du Colombier char*	noname;
2233e12c5d1SDavid du Colombier char*	outfile;
2243e12c5d1SDavid du Colombier long	pc;
2253e12c5d1SDavid du Colombier int	printcol;
2263e12c5d1SDavid du Colombier long	spsize;
2273e12c5d1SDavid du Colombier Sym*	symlist;
2283e12c5d1SDavid du Colombier long	symsize;
2293e12c5d1SDavid du Colombier Prog*	textp;
2303e12c5d1SDavid du Colombier long	textsize;
2313e12c5d1SDavid du Colombier long	thunk;
2323e12c5d1SDavid du Colombier int	version;
2333e12c5d1SDavid du Colombier Prog	zprg;
234*219b2ee8SDavid du Colombier int	dtype;
2353e12c5d1SDavid du Colombier 
2363e12c5d1SDavid du Colombier extern	Optab	optab[];
2373e12c5d1SDavid du Colombier extern	char*	anames[];
2383e12c5d1SDavid du Colombier 
239bd389b36SDavid du Colombier int	Aconv(void*, Fconv*);
240bd389b36SDavid du Colombier int	Dconv(void*, Fconv*);
241bd389b36SDavid du Colombier int	Pconv(void*, Fconv*);
242bd389b36SDavid du Colombier int	Rconv(void*, Fconv*);
243bd389b36SDavid du Colombier int	Sconv(void*, Fconv*);
244bd389b36SDavid du Colombier int	Xconv(void*, Fconv*);
2453e12c5d1SDavid du Colombier void	addhist(long, int);
2463e12c5d1SDavid du Colombier Prog*	appendp(Prog*);
2473e12c5d1SDavid du Colombier void	asmb(void);
2483e12c5d1SDavid du Colombier void	asmins(Prog*);
2493e12c5d1SDavid du Colombier void	asmlc(void);
2503e12c5d1SDavid du Colombier void	asmsp(void);
2513e12c5d1SDavid du Colombier void	asmsym(void);
2523e12c5d1SDavid du Colombier int	atoi(char*);
2533e12c5d1SDavid du Colombier long	atolwhex(char*);
2543e12c5d1SDavid du Colombier Prog*	brchain(Prog*);
2553e12c5d1SDavid du Colombier Prog*	brloop(Prog*);
2563e12c5d1SDavid du Colombier void	cflush(void);
2573e12c5d1SDavid du Colombier Prog*	copyp(Prog*);
2583e12c5d1SDavid du Colombier double	cputime(void);
2593e12c5d1SDavid du Colombier void	datblk(long, long);
2603e12c5d1SDavid du Colombier void	diag(char*, ...);
2613e12c5d1SDavid du Colombier void	dodata(void);
2623e12c5d1SDavid du Colombier void	doinit(void);
2633e12c5d1SDavid du Colombier void	doprof1(void);
2643e12c5d1SDavid du Colombier void	doprof2(void);
2653e12c5d1SDavid du Colombier void	dostkoff(void);
2663e12c5d1SDavid du Colombier long	entryvalue(void);
2673e12c5d1SDavid du Colombier void	errorexit(void);
2683e12c5d1SDavid du Colombier int	find1(long, int);
2693e12c5d1SDavid du Colombier int	find2(long, int);
2703e12c5d1SDavid du Colombier void	follow(void);
2713e12c5d1SDavid du Colombier void	gethunk(void);
2723e12c5d1SDavid du Colombier void	histtoauto(void);
2733e12c5d1SDavid du Colombier double	ieeedtod(Ieee*);
2743e12c5d1SDavid du Colombier long	ieeedtof(Ieee*);
2753e12c5d1SDavid du Colombier void	ldobj(int, long, char*);
2763e12c5d1SDavid du Colombier void	loadlib(int, int);
2773e12c5d1SDavid du Colombier void	listinit(void);
2783e12c5d1SDavid du Colombier Sym*	lookup(char*, int);
2793e12c5d1SDavid du Colombier void	lput(long);
2803e12c5d1SDavid du Colombier void	lputl(long);
2813e12c5d1SDavid du Colombier void	main(int, char*[]);
2823e12c5d1SDavid du Colombier void	mkfwd(void);
2833e12c5d1SDavid du Colombier void	nuxiinit(void);
2843e12c5d1SDavid du Colombier void	objfile(char*);
2853e12c5d1SDavid du Colombier int	opsize(Prog*);
2863e12c5d1SDavid du Colombier void	patch(void);
2873e12c5d1SDavid du Colombier Prog*	prg(void);
2883e12c5d1SDavid du Colombier int	relinv(int);
2893e12c5d1SDavid du Colombier long	reuse(Prog*, Sym*);
2903e12c5d1SDavid du Colombier long	rnd(long, long);
2913e12c5d1SDavid du Colombier void	s8put(char*);
2923e12c5d1SDavid du Colombier void	span(void);
2933e12c5d1SDavid du Colombier void	undef(void);
2943e12c5d1SDavid du Colombier void	xdefine(char*, int, long);
2953e12c5d1SDavid du Colombier void	xfol(Prog*);
2963e12c5d1SDavid du Colombier int	zaddr(uchar*, Adr*, Sym*[]);
2973e12c5d1SDavid du Colombier long	vaddr(Adr*);
298