xref: /plan9-contrib/sys/src/cmd/4l/l.h (revision f8bc6aaf8056e137bcdfb6117a990ac3eff62cc9)
17edc7532SDavid du Colombier #include	<u.h>
27edc7532SDavid du Colombier #include	<libc.h>
37edc7532SDavid du Colombier #include	<bio.h>
4*f8bc6aafSDavid du Colombier #include	"../4c/4.out.h"
5*f8bc6aafSDavid du Colombier #include	"../8l/elf.h"
67edc7532SDavid du Colombier 
77edc7532SDavid du Colombier #ifndef	EXTERN
87edc7532SDavid du Colombier #define	EXTERN	extern
97edc7532SDavid du Colombier #endif
107edc7532SDavid du Colombier 
11*f8bc6aafSDavid du Colombier #define	LIBNAMELEN	300
12*f8bc6aafSDavid du Colombier 
137edc7532SDavid du Colombier typedef	struct	Adr	Adr;
147edc7532SDavid du Colombier typedef	struct	Sym	Sym;
157edc7532SDavid du Colombier typedef	struct	Autom	Auto;
167edc7532SDavid du Colombier typedef	struct	Prog	Prog;
177edc7532SDavid du Colombier typedef	struct	Optab	Optab;
187edc7532SDavid du Colombier typedef	struct	Oprang	Oprang;
197edc7532SDavid du Colombier typedef	uchar	Opcross[32][2][32];
207edc7532SDavid du Colombier typedef	struct	Count	Count;
217edc7532SDavid du Colombier 
227edc7532SDavid du Colombier #define	P		((Prog*)0)
237edc7532SDavid du Colombier #define	S		((Sym*)0)
247edc7532SDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
257edc7532SDavid du Colombier 
267edc7532SDavid du Colombier struct	Adr
277edc7532SDavid du Colombier {
287edc7532SDavid du Colombier 	union
297edc7532SDavid du Colombier 	{
30*f8bc6aafSDavid du Colombier 		vlong	u0offset;
317edc7532SDavid du Colombier 		char*	u0sval;
327edc7532SDavid du Colombier 		Ieee*	u0ieee;
337edc7532SDavid du Colombier 	} u0;
347edc7532SDavid du Colombier 	union
357edc7532SDavid du Colombier 	{
367edc7532SDavid du Colombier 		Auto*	u1autom;
377edc7532SDavid du Colombier 		Sym*	u1sym;
387edc7532SDavid du Colombier 	} u1;
397edc7532SDavid du Colombier 	char	type;
407edc7532SDavid du Colombier 	char	reg;
417edc7532SDavid du Colombier 	char	name;
427edc7532SDavid du Colombier 	char	class;
437edc7532SDavid du Colombier };
447edc7532SDavid du Colombier 
457edc7532SDavid du Colombier #define	offset	u0.u0offset
467edc7532SDavid du Colombier #define	sval	u0.u0sval
477edc7532SDavid du Colombier #define	ieee	u0.u0ieee
487edc7532SDavid du Colombier 
497edc7532SDavid du Colombier #define	autom	u1.u1autom
507edc7532SDavid du Colombier #define	sym	u1.u1sym
517edc7532SDavid du Colombier 
527edc7532SDavid du Colombier struct	Prog
537edc7532SDavid du Colombier {
547edc7532SDavid du Colombier 	Adr	from;
557edc7532SDavid du Colombier 	Adr	to;
567edc7532SDavid du Colombier 	union
577edc7532SDavid du Colombier 	{
587edc7532SDavid du Colombier 		long	u0regused;
597edc7532SDavid du Colombier 		Prog*	u0forwd;
607edc7532SDavid du Colombier 	} u0;
617edc7532SDavid du Colombier 	Prog*	cond;
627edc7532SDavid du Colombier 	Prog*	link;
637edc7532SDavid du Colombier 	vlong	pc;
647edc7532SDavid du Colombier 	long	line;
657edc7532SDavid du Colombier 	uchar	mark;
667edc7532SDavid du Colombier 	uchar	optab;
677edc7532SDavid du Colombier 	char	as;
687edc7532SDavid du Colombier 	char	reg;
697edc7532SDavid du Colombier };
707edc7532SDavid du Colombier #define	regused	u0.u0regused
717edc7532SDavid du Colombier #define	forwd	u0.u0forwd
727edc7532SDavid du Colombier 
737edc7532SDavid du Colombier struct	Sym
747edc7532SDavid du Colombier {
757edc7532SDavid du Colombier 	char	*name;
767edc7532SDavid du Colombier 	short	type;
777edc7532SDavid du Colombier 	short	version;
787edc7532SDavid du Colombier 	short	become;
797edc7532SDavid du Colombier 	short	frame;
807edc7532SDavid du Colombier 	vlong	value;
817edc7532SDavid du Colombier 	Sym*	link;
827edc7532SDavid du Colombier };
837edc7532SDavid du Colombier struct	Autom
847edc7532SDavid du Colombier {
857edc7532SDavid du Colombier 	Sym*	asym;
867edc7532SDavid du Colombier 	Auto*	link;
877edc7532SDavid du Colombier 	long	aoffset;
887edc7532SDavid du Colombier 	short	type;
897edc7532SDavid du Colombier };
907edc7532SDavid du Colombier struct	Optab
917edc7532SDavid du Colombier {
927edc7532SDavid du Colombier 	char	as;
937edc7532SDavid du Colombier 	char	a1;
947edc7532SDavid du Colombier 	char	a2;
957edc7532SDavid du Colombier 	char	a3;
967edc7532SDavid du Colombier 	char	type;
977edc7532SDavid du Colombier 	char	size;
987edc7532SDavid du Colombier 	char	param;
997edc7532SDavid du Colombier };
1007edc7532SDavid du Colombier struct	Oprang
1017edc7532SDavid du Colombier {
1027edc7532SDavid du Colombier 	Optab*	start;
1037edc7532SDavid du Colombier 	Optab*	stop;
1047edc7532SDavid du Colombier };
1057edc7532SDavid du Colombier struct	Count
1067edc7532SDavid du Colombier {
1077edc7532SDavid du Colombier 	long	count;
1087edc7532SDavid du Colombier 	long	outof;
1097edc7532SDavid du Colombier };
1107edc7532SDavid du Colombier 
1117edc7532SDavid du Colombier enum
1127edc7532SDavid du Colombier {
1137edc7532SDavid du Colombier 	STEXT		= 1,
1147edc7532SDavid du Colombier 	SDATA,
1157edc7532SDavid du Colombier 	SBSS,
1167edc7532SDavid du Colombier 	SDATA1,
1177edc7532SDavid du Colombier 	SXREF,
1187edc7532SDavid du Colombier 	SLEAF,
1197edc7532SDavid du Colombier 	SFILE,
1207edc7532SDavid du Colombier 	SCONST,
121*f8bc6aafSDavid du Colombier 	SSTRING,
1227edc7532SDavid du Colombier 
1237edc7532SDavid du Colombier 	C_NONE		= 0,
1247edc7532SDavid du Colombier 	C_REG,
1257edc7532SDavid du Colombier 	C_FREG,
1267edc7532SDavid du Colombier 	C_FCREG,
1277edc7532SDavid du Colombier 	C_MREG,
1287edc7532SDavid du Colombier 	C_HI,
1297edc7532SDavid du Colombier 	C_LO,
1307edc7532SDavid du Colombier 	C_ZCON,
1317edc7532SDavid du Colombier 	C_SCON,
1327edc7532SDavid du Colombier 	C_ADD0CON,
1337edc7532SDavid du Colombier 	C_AND0CON,
1347edc7532SDavid du Colombier 	C_ADDCON,
1357edc7532SDavid du Colombier 	C_ANDCON,
1367edc7532SDavid du Colombier 	C_UCON,
1377edc7532SDavid du Colombier 	C_LCON,
1387edc7532SDavid du Colombier 	C_SACON,
1397edc7532SDavid du Colombier 	C_SECON,
1407edc7532SDavid du Colombier 	C_LACON,
1417edc7532SDavid du Colombier 	C_LECON,
1427edc7532SDavid du Colombier 	C_SBRA,
1437edc7532SDavid du Colombier 	C_LBRA,
1447edc7532SDavid du Colombier 	C_SAUTO,
1457edc7532SDavid du Colombier 	C_SEXT,
1467edc7532SDavid du Colombier 	C_LAUTO,
1477edc7532SDavid du Colombier 	C_LEXT,
1487edc7532SDavid du Colombier 	C_ZOREG,
1497edc7532SDavid du Colombier 	C_SOREG,
1507edc7532SDavid du Colombier 	C_LOREG,
1517edc7532SDavid du Colombier 	C_GOK,
1527edc7532SDavid du Colombier 
1537edc7532SDavid du Colombier 	NSCHED		= 20,
1547edc7532SDavid du Colombier 
1557edc7532SDavid du Colombier /* mark flags */
1567edc7532SDavid du Colombier 	FOLL		= 1<<0,
1577edc7532SDavid du Colombier 	LABEL		= 1<<1,
1587edc7532SDavid du Colombier 	LEAF		= 1<<2,
1597edc7532SDavid du Colombier 	SYNC		= 1<<3,
1607edc7532SDavid du Colombier 	BRANCH		= 1<<4,
1617edc7532SDavid du Colombier 	LOAD		= 1<<5,
1627edc7532SDavid du Colombier 	FCMP		= 1<<6,
1637edc7532SDavid du Colombier 	NOSCHED		= 1<<7,
1647edc7532SDavid du Colombier 
1657edc7532SDavid du Colombier 	BIG		= 32766,
1667edc7532SDavid du Colombier 	STRINGSZ	= 200,
1677edc7532SDavid du Colombier 	NHASH		= 10007,
1687edc7532SDavid du Colombier 	NHUNK		= 100000,
1697edc7532SDavid du Colombier 	MINSIZ		= 64,
1707edc7532SDavid du Colombier 	NENT		= 100,
1717edc7532SDavid du Colombier 	MAXIO		= 8192,
1727edc7532SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1737edc7532SDavid du Colombier };
1747edc7532SDavid du Colombier 
1757edc7532SDavid du Colombier EXTERN union
1767edc7532SDavid du Colombier {
1777edc7532SDavid du Colombier 	struct
1787edc7532SDavid du Colombier 	{
1797edc7532SDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
1807edc7532SDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
1817edc7532SDavid du Colombier 	} u;
1827edc7532SDavid du Colombier 	char	dbuf[1];
1837edc7532SDavid du Colombier } buf;
1847edc7532SDavid du Colombier 
1857edc7532SDavid du Colombier #define	cbuf	u.obuf
1867edc7532SDavid du Colombier #define	xbuf	u.ibuf
1877edc7532SDavid du Colombier 
1887edc7532SDavid du Colombier EXTERN	long	HEADR;			/* length of header */
1897edc7532SDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
1907edc7532SDavid du Colombier EXTERN	vlong	INITDAT;		/* data location */
1917edc7532SDavid du Colombier EXTERN	vlong	INITRND;		/* data round above text location */
1927edc7532SDavid du Colombier EXTERN	vlong	INITTEXT;		/* text location */
193*f8bc6aafSDavid du Colombier EXTERN	vlong	INITTEXTP;		/* text location (physical) */
1947edc7532SDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
1957edc7532SDavid du Colombier EXTERN	int	M64;
1967edc7532SDavid du Colombier EXTERN	long	autosize;
1977edc7532SDavid du Colombier EXTERN	Biobuf	bso;
1987edc7532SDavid du Colombier EXTERN	long	bsssize;
1997edc7532SDavid du Colombier EXTERN	int	cbc;
2007edc7532SDavid du Colombier EXTERN	uchar*	cbp;
2017edc7532SDavid du Colombier EXTERN	int	cout;
2027edc7532SDavid du Colombier EXTERN	Auto*	curauto;
2037edc7532SDavid du Colombier EXTERN	Auto*	curhist;
2047edc7532SDavid du Colombier EXTERN	Prog*	curp;
2057edc7532SDavid du Colombier EXTERN	Prog*	curtext;
2067edc7532SDavid du Colombier EXTERN	Prog*	datap;
2077edc7532SDavid du Colombier EXTERN	long	datsize;
2087edc7532SDavid du Colombier EXTERN	char	debug[128];
2097edc7532SDavid du Colombier EXTERN	Prog*	etextp;
2107edc7532SDavid du Colombier EXTERN	Prog*	firstp;
211*f8bc6aafSDavid du Colombier EXTERN	char	fnuxi4[4];	/* for 3l [sic] */
2127edc7532SDavid du Colombier EXTERN	char	fnuxi8[8];
2137edc7532SDavid du Colombier EXTERN	char*	noname;
2147edc7532SDavid du Colombier EXTERN	Sym*	hash[NHASH];
2157edc7532SDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
2167edc7532SDavid du Colombier EXTERN	int	histfrogp;
2177edc7532SDavid du Colombier EXTERN	int	histgen;
2187edc7532SDavid du Colombier EXTERN	char*	library[50];
2197edc7532SDavid du Colombier EXTERN	char*	libraryobj[50];
2207edc7532SDavid du Colombier EXTERN	int	libraryp;
221*f8bc6aafSDavid du Colombier EXTERN	int	xrefresolv;
2227edc7532SDavid du Colombier EXTERN	char*	hunk;
2237edc7532SDavid du Colombier EXTERN	char	inuxi1[1];
2247edc7532SDavid du Colombier EXTERN	char	inuxi2[2];
2257edc7532SDavid du Colombier EXTERN	char	inuxi4[4];
226*f8bc6aafSDavid du Colombier EXTERN	char	inuxi8[8];
2277edc7532SDavid du Colombier EXTERN	Prog*	lastp;
2287edc7532SDavid du Colombier EXTERN	long	lcsize;
2297edc7532SDavid du Colombier EXTERN	char	literal[32];
2307edc7532SDavid du Colombier EXTERN	int	nerrors;
2317edc7532SDavid du Colombier EXTERN	long	nhunk;
2327edc7532SDavid du Colombier EXTERN	vlong	instoffset;
2337edc7532SDavid du Colombier EXTERN	Opcross	opcross[10];
2347edc7532SDavid du Colombier EXTERN	Oprang	oprange[ALAST];
2357edc7532SDavid du Colombier EXTERN	char*	outfile;
2367edc7532SDavid du Colombier EXTERN	vlong	pc;
2377edc7532SDavid du Colombier EXTERN	uchar	repop[ALAST];
2387edc7532SDavid du Colombier EXTERN	long	symsize;
2397edc7532SDavid du Colombier EXTERN	Prog*	textp;
240*f8bc6aafSDavid du Colombier EXTERN	vlong	textsize;
2417edc7532SDavid du Colombier EXTERN	long	thunk;
2427edc7532SDavid du Colombier EXTERN	int	version;
2437edc7532SDavid du Colombier EXTERN	char	xcmp[32][32];
2447edc7532SDavid du Colombier EXTERN	Prog	zprg;
2457edc7532SDavid du Colombier EXTERN	int	dtype;
246*f8bc6aafSDavid du Colombier EXTERN	int	little;
2477edc7532SDavid du Colombier 
2487edc7532SDavid du Colombier EXTERN	struct
2497edc7532SDavid du Colombier {
2507edc7532SDavid du Colombier 	Count	branch;
2517edc7532SDavid du Colombier 	Count	fcmp;
2527edc7532SDavid du Colombier 	Count	load;
2537edc7532SDavid du Colombier 	Count	mfrom;
2547edc7532SDavid du Colombier 	Count	page;
2557edc7532SDavid du Colombier 	Count	jump;
256*f8bc6aafSDavid du Colombier 	Count	store;
2577edc7532SDavid du Colombier } nop;
2587edc7532SDavid du Colombier 
2597edc7532SDavid du Colombier extern	char*	anames[];
2607edc7532SDavid du Colombier extern	Optab	optab[];
2617edc7532SDavid du Colombier 
262*f8bc6aafSDavid du Colombier #pragma	varargck	type	"A"	int
263*f8bc6aafSDavid du Colombier #pragma	varargck	type	"D"	Adr*
264*f8bc6aafSDavid du Colombier #pragma	varargck	type	"N"	Adr*
265*f8bc6aafSDavid du Colombier #pragma	varargck	type	"P"	Prog*
266*f8bc6aafSDavid du Colombier #pragma	varargck	type	"S"	char*
267*f8bc6aafSDavid du Colombier 
268*f8bc6aafSDavid du Colombier #pragma	varargck	argpos	diag 1
269*f8bc6aafSDavid du Colombier 
2707edc7532SDavid du Colombier int	Aconv(Fmt*);
2717edc7532SDavid du Colombier int	Dconv(Fmt*);
2727edc7532SDavid du Colombier int	Nconv(Fmt*);
2737edc7532SDavid du Colombier int	Pconv(Fmt*);
2747edc7532SDavid du Colombier int	Sconv(Fmt*);
2757edc7532SDavid du Colombier int	aclass(Adr*);
2767edc7532SDavid du Colombier void	addhist(long, int);
277*f8bc6aafSDavid du Colombier void	addlibpath(char*);
2787edc7532SDavid du Colombier void	addnop(Prog*);
2797edc7532SDavid du Colombier void	append(Prog*, Prog*);
2807edc7532SDavid du Colombier void	asmb(void);
2817edc7532SDavid du Colombier void	asmlc(void);
2827edc7532SDavid du Colombier int	asmout(Prog*, Optab*, int);
2837edc7532SDavid du Colombier void	asmsym(void);
284*f8bc6aafSDavid du Colombier vlong	atolwhex(char*);
2857edc7532SDavid du Colombier vlong	atovlwhex(char*);
2867edc7532SDavid du Colombier Prog*	brloop(Prog*);
2877edc7532SDavid du Colombier void	buildop(void);
2887edc7532SDavid du Colombier void	buildrep(int, int);
2897edc7532SDavid du Colombier void	cflush(void);
2907edc7532SDavid du Colombier int	cmp(int, int);
291*f8bc6aafSDavid du Colombier void	cput(long);
2927edc7532SDavid du Colombier int	compound(Prog*);
2937edc7532SDavid du Colombier double	cputime(void);
294*f8bc6aafSDavid du Colombier void	datblk(long, long, int);
2957edc7532SDavid du Colombier void	diag(char*, ...);
2967edc7532SDavid du Colombier void	dodata(void);
2977edc7532SDavid du Colombier void	doprof1(void);
2987edc7532SDavid du Colombier void	doprof2(void);
299*f8bc6aafSDavid du Colombier vlong	entryvalue(void);
3007edc7532SDavid du Colombier void	errorexit(void);
3017edc7532SDavid du Colombier void	exchange(Prog*);
302*f8bc6aafSDavid du Colombier int	fileexists(char*);
3037edc7532SDavid du Colombier int	find1(long, int);
304*f8bc6aafSDavid du Colombier char*	findlib(char*);
3057edc7532SDavid du Colombier void	follow(void);
3067edc7532SDavid du Colombier void	gethunk(void);
3077edc7532SDavid du Colombier void	histtoauto(void);
3087edc7532SDavid du Colombier vlong	ieeedtov(Ieee*);
3097edc7532SDavid du Colombier double	ieeedtod(Ieee*);
3107edc7532SDavid du Colombier long	ieeedtof(Ieee*);
311*f8bc6aafSDavid du Colombier int	isint32(vlong);
312*f8bc6aafSDavid du Colombier int	isuint32(uvlong);
3137edc7532SDavid du Colombier int	isnop(Prog*);
3147edc7532SDavid du Colombier void	ldobj(int, long, char*);
315*f8bc6aafSDavid du Colombier void	loadlib(void);
3167edc7532SDavid du Colombier void	listinit(void);
3177edc7532SDavid du Colombier Sym*	lookup(char*, int);
318*f8bc6aafSDavid du Colombier void	llput(vlong);
319*f8bc6aafSDavid du Colombier void	llputl(vlong);
3207edc7532SDavid du Colombier void	lput(long);
321*f8bc6aafSDavid du Colombier void	lputl(long);
322*f8bc6aafSDavid du Colombier void	bput(long);
3237edc7532SDavid du Colombier void	mkfwd(void);
3247edc7532SDavid du Colombier void*	mysbrk(ulong);
3257edc7532SDavid du Colombier void	names(void);
3267edc7532SDavid du Colombier void	nocache(Prog*);
3277edc7532SDavid du Colombier void	noops(void);
328*f8bc6aafSDavid du Colombier void	nopstat(char*, Count*);
3297edc7532SDavid du Colombier void	nuxiinit(void);
3307edc7532SDavid du Colombier void	objfile(char*);
3317edc7532SDavid du Colombier int	ocmp(const void*, const void*);
3327edc7532SDavid du Colombier long	opirr(int);
3337edc7532SDavid du Colombier Optab*	oplook(Prog*);
3347edc7532SDavid du Colombier long	oprrr(int);
3357edc7532SDavid du Colombier void	patch(void);
3367edc7532SDavid du Colombier void	prasm(Prog*);
3377edc7532SDavid du Colombier void	prepend(Prog*, Prog*);
3387edc7532SDavid du Colombier Prog*	prg(void);
3397edc7532SDavid du Colombier int	pseudo(Prog*);
340*f8bc6aafSDavid du Colombier void	putsymb(char*, int, vlong, int);
3417edc7532SDavid du Colombier long	regoff(Adr*);
3427edc7532SDavid du Colombier int	relinv(int);
343*f8bc6aafSDavid du Colombier vlong	rnd(vlong, long);
3447edc7532SDavid du Colombier void	sched(Prog*, Prog*);
3457edc7532SDavid du Colombier void	span(void);
3467edc7532SDavid du Colombier void	strnput(char*, int);
3477edc7532SDavid du Colombier void	undef(void);
348*f8bc6aafSDavid du Colombier void	wput(long);
349*f8bc6aafSDavid du Colombier void	wputl(long);
350*f8bc6aafSDavid du Colombier void	xdefine(char*, int, vlong);
3517edc7532SDavid du Colombier void	xfol(Prog*);
3527edc7532SDavid du Colombier void	xfol(Prog*);
353