xref: /plan9/sys/src/cmd/5l/l.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include	<u.h>
2*7dd7cddfSDavid du Colombier #include	<libc.h>
3*7dd7cddfSDavid du Colombier #include	<bio.h>
4*7dd7cddfSDavid du Colombier #include	"../5c/5.out.h"
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier #ifndef	EXTERN
7*7dd7cddfSDavid du Colombier #define	EXTERN	extern
8*7dd7cddfSDavid du Colombier #endif
9*7dd7cddfSDavid du Colombier 
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier typedef	struct	Adr	Adr;
12*7dd7cddfSDavid du Colombier typedef	struct	Sym	Sym;
13*7dd7cddfSDavid du Colombier typedef	struct	Autom	Auto;
14*7dd7cddfSDavid du Colombier typedef	struct	Prog	Prog;
15*7dd7cddfSDavid du Colombier typedef	struct	Optab	Optab;
16*7dd7cddfSDavid du Colombier typedef	struct	Oprang	Oprang;
17*7dd7cddfSDavid du Colombier typedef	uchar	Opcross[32][2][32];
18*7dd7cddfSDavid du Colombier typedef	struct	Count	Count;
19*7dd7cddfSDavid du Colombier 
20*7dd7cddfSDavid du Colombier #define	P		((Prog*)0)
21*7dd7cddfSDavid du Colombier #define	S		((Sym*)0)
22*7dd7cddfSDavid du Colombier #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
23*7dd7cddfSDavid du Colombier 
24*7dd7cddfSDavid du Colombier struct	Adr
25*7dd7cddfSDavid du Colombier {
26*7dd7cddfSDavid du Colombier 	union
27*7dd7cddfSDavid du Colombier 	{
28*7dd7cddfSDavid du Colombier 		long	u0offset;
29*7dd7cddfSDavid du Colombier 		char*	u0sval;
30*7dd7cddfSDavid du Colombier 		Ieee*	u0ieee;
31*7dd7cddfSDavid du Colombier 	} u0;
32*7dd7cddfSDavid du Colombier 	union
33*7dd7cddfSDavid du Colombier 	{
34*7dd7cddfSDavid du Colombier 		Auto*	u1autom;
35*7dd7cddfSDavid du Colombier 		Sym*	u1sym;
36*7dd7cddfSDavid du Colombier 	} u1;
37*7dd7cddfSDavid du Colombier 	char	type;
38*7dd7cddfSDavid du Colombier 	char	reg;
39*7dd7cddfSDavid du Colombier 	char	name;
40*7dd7cddfSDavid du Colombier 	char	class;
41*7dd7cddfSDavid du Colombier };
42*7dd7cddfSDavid du Colombier 
43*7dd7cddfSDavid du Colombier #define	offset	u0.u0offset
44*7dd7cddfSDavid du Colombier #define	sval	u0.u0sval
45*7dd7cddfSDavid du Colombier #define	ieee	u0.u0ieee
46*7dd7cddfSDavid du Colombier 
47*7dd7cddfSDavid du Colombier #define	autom	u1.u1autom
48*7dd7cddfSDavid du Colombier #define	sym	u1.u1sym
49*7dd7cddfSDavid du Colombier 
50*7dd7cddfSDavid du Colombier struct	Prog
51*7dd7cddfSDavid du Colombier {
52*7dd7cddfSDavid du Colombier 	Adr	from;
53*7dd7cddfSDavid du Colombier 	Adr	to;
54*7dd7cddfSDavid du Colombier 	union
55*7dd7cddfSDavid du Colombier 	{
56*7dd7cddfSDavid du Colombier 		long	u0regused;
57*7dd7cddfSDavid du Colombier 		Prog*	u0forwd;
58*7dd7cddfSDavid du Colombier 	} u0;
59*7dd7cddfSDavid du Colombier 	Prog*	cond;
60*7dd7cddfSDavid du Colombier 	Prog*	link;
61*7dd7cddfSDavid du Colombier 	long	pc;
62*7dd7cddfSDavid du Colombier 	long	line;
63*7dd7cddfSDavid du Colombier 	uchar	mark;
64*7dd7cddfSDavid du Colombier 	uchar	optab;
65*7dd7cddfSDavid du Colombier 	uchar	as;
66*7dd7cddfSDavid du Colombier 	uchar	scond;
67*7dd7cddfSDavid du Colombier 	uchar	reg;
68*7dd7cddfSDavid du Colombier };
69*7dd7cddfSDavid du Colombier #define	regused	u0.u0regused
70*7dd7cddfSDavid du Colombier #define	forwd	u0.u0forwd
71*7dd7cddfSDavid du Colombier 
72*7dd7cddfSDavid du Colombier struct	Sym
73*7dd7cddfSDavid du Colombier {
74*7dd7cddfSDavid du Colombier 	char	*name;
75*7dd7cddfSDavid du Colombier 	short	type;
76*7dd7cddfSDavid du Colombier 	short	version;
77*7dd7cddfSDavid du Colombier 	short	become;
78*7dd7cddfSDavid du Colombier 	short	frame;
79*7dd7cddfSDavid du Colombier 	long	value;
80*7dd7cddfSDavid du Colombier 	Sym*	link;
81*7dd7cddfSDavid du Colombier };
82*7dd7cddfSDavid du Colombier struct	Autom
83*7dd7cddfSDavid du Colombier {
84*7dd7cddfSDavid du Colombier 	Sym*	asym;
85*7dd7cddfSDavid du Colombier 	Auto*	link;
86*7dd7cddfSDavid du Colombier 	long	aoffset;
87*7dd7cddfSDavid du Colombier 	short	type;
88*7dd7cddfSDavid du Colombier };
89*7dd7cddfSDavid du Colombier struct	Optab
90*7dd7cddfSDavid du Colombier {
91*7dd7cddfSDavid du Colombier 	char	as;
92*7dd7cddfSDavid du Colombier 	char	a1;
93*7dd7cddfSDavid du Colombier 	char	a2;
94*7dd7cddfSDavid du Colombier 	char	a3;
95*7dd7cddfSDavid du Colombier 	char	type;
96*7dd7cddfSDavid du Colombier 	char	size;
97*7dd7cddfSDavid du Colombier 	char	param;
98*7dd7cddfSDavid du Colombier 	char	lit;
99*7dd7cddfSDavid du Colombier };
100*7dd7cddfSDavid du Colombier struct	Oprang
101*7dd7cddfSDavid du Colombier {
102*7dd7cddfSDavid du Colombier 	Optab*	start;
103*7dd7cddfSDavid du Colombier 	Optab*	stop;
104*7dd7cddfSDavid du Colombier };
105*7dd7cddfSDavid du Colombier struct	Count
106*7dd7cddfSDavid du Colombier {
107*7dd7cddfSDavid du Colombier 	long	count;
108*7dd7cddfSDavid du Colombier 	long	outof;
109*7dd7cddfSDavid du Colombier };
110*7dd7cddfSDavid du Colombier 
111*7dd7cddfSDavid du Colombier enum
112*7dd7cddfSDavid du Colombier {
113*7dd7cddfSDavid du Colombier 	STEXT		= 1,
114*7dd7cddfSDavid du Colombier 	SDATA,
115*7dd7cddfSDavid du Colombier 	SBSS,
116*7dd7cddfSDavid du Colombier 	SDATA1,
117*7dd7cddfSDavid du Colombier 	SXREF,
118*7dd7cddfSDavid du Colombier 	SLEAF,
119*7dd7cddfSDavid du Colombier 	SFILE,
120*7dd7cddfSDavid du Colombier 	SCONST,
121*7dd7cddfSDavid du Colombier 
122*7dd7cddfSDavid du Colombier 	LFROM		= 1,
123*7dd7cddfSDavid du Colombier 	LTO,
124*7dd7cddfSDavid du Colombier 	LPOOL,
125*7dd7cddfSDavid du Colombier 
126*7dd7cddfSDavid du Colombier 	C_NONE		= 0,
127*7dd7cddfSDavid du Colombier 	C_REG,
128*7dd7cddfSDavid du Colombier 	C_SHIFT,
129*7dd7cddfSDavid du Colombier 	C_FREG,
130*7dd7cddfSDavid du Colombier 	C_PSR,
131*7dd7cddfSDavid du Colombier 	C_FCR,
132*7dd7cddfSDavid du Colombier 
133*7dd7cddfSDavid du Colombier 	C_RCON,		/* 0xff rotated */
134*7dd7cddfSDavid du Colombier 	C_NCON,		/* ~RCON */
135*7dd7cddfSDavid du Colombier 	C_SCON,		/* 0xffff */
136*7dd7cddfSDavid du Colombier 	C_LCON,
137*7dd7cddfSDavid du Colombier 	C_FCON,
138*7dd7cddfSDavid du Colombier 
139*7dd7cddfSDavid du Colombier 	C_RACON,
140*7dd7cddfSDavid du Colombier 	C_LACON,
141*7dd7cddfSDavid du Colombier 
142*7dd7cddfSDavid du Colombier 	C_RECON,
143*7dd7cddfSDavid du Colombier 	C_LECON,
144*7dd7cddfSDavid du Colombier 
145*7dd7cddfSDavid du Colombier 	C_SBRA,
146*7dd7cddfSDavid du Colombier 	C_LBRA,
147*7dd7cddfSDavid du Colombier 
148*7dd7cddfSDavid du Colombier 	C_FAUTO,
149*7dd7cddfSDavid du Colombier 	C_SAUTO,
150*7dd7cddfSDavid du Colombier 	C_LAUTO,
151*7dd7cddfSDavid du Colombier 
152*7dd7cddfSDavid du Colombier 	C_FEXT,
153*7dd7cddfSDavid du Colombier 	C_SEXT,
154*7dd7cddfSDavid du Colombier 	C_LEXT,
155*7dd7cddfSDavid du Colombier 
156*7dd7cddfSDavid du Colombier 	C_FOREG,
157*7dd7cddfSDavid du Colombier 	C_BOREG,	/* both */
158*7dd7cddfSDavid du Colombier 	C_ROREG,
159*7dd7cddfSDavid du Colombier 	C_SOREG,
160*7dd7cddfSDavid du Colombier 	C_LOREG,
161*7dd7cddfSDavid du Colombier 
162*7dd7cddfSDavid du Colombier 	C_GOK,
163*7dd7cddfSDavid du Colombier 
164*7dd7cddfSDavid du Colombier /* mark flags */
165*7dd7cddfSDavid du Colombier 	FOLL		= 1<<0,
166*7dd7cddfSDavid du Colombier 	LABEL		= 1<<1,
167*7dd7cddfSDavid du Colombier 	LEAF		= 1<<2,
168*7dd7cddfSDavid du Colombier 
169*7dd7cddfSDavid du Colombier 	BIG		= (1<<12)-4,
170*7dd7cddfSDavid du Colombier 	STRINGSZ	= 200,
171*7dd7cddfSDavid du Colombier 	NHASH		= 10007,
172*7dd7cddfSDavid du Colombier 	NHUNK		= 100000,
173*7dd7cddfSDavid du Colombier 	MINSIZ		= 64,
174*7dd7cddfSDavid du Colombier 	NENT		= 100,
175*7dd7cddfSDavid du Colombier 	MAXIO		= 8192,
176*7dd7cddfSDavid du Colombier 	MAXHIST		= 20,	/* limit of path elements for history symbols */
177*7dd7cddfSDavid du Colombier };
178*7dd7cddfSDavid du Colombier 
179*7dd7cddfSDavid du Colombier EXTERN union
180*7dd7cddfSDavid du Colombier {
181*7dd7cddfSDavid du Colombier 	struct
182*7dd7cddfSDavid du Colombier 	{
183*7dd7cddfSDavid du Colombier 		uchar	obuf[MAXIO];			/* output buffer */
184*7dd7cddfSDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
185*7dd7cddfSDavid du Colombier 	} u;
186*7dd7cddfSDavid du Colombier 	char	dbuf[1];
187*7dd7cddfSDavid du Colombier } buf;
188*7dd7cddfSDavid du Colombier 
189*7dd7cddfSDavid du Colombier #define	cbuf	u.obuf
190*7dd7cddfSDavid du Colombier #define	xbuf	u.ibuf
191*7dd7cddfSDavid du Colombier 
192*7dd7cddfSDavid du Colombier EXTERN	long	HEADR;			/* length of header */
193*7dd7cddfSDavid du Colombier EXTERN	int	HEADTYPE;		/* type of header */
194*7dd7cddfSDavid du Colombier EXTERN	long	INITDAT;		/* data location */
195*7dd7cddfSDavid du Colombier EXTERN	long	INITRND;		/* data round above text location */
196*7dd7cddfSDavid du Colombier EXTERN	long	INITTEXT;		/* text location */
197*7dd7cddfSDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
198*7dd7cddfSDavid du Colombier EXTERN	long	autosize;
199*7dd7cddfSDavid du Colombier EXTERN	Biobuf	bso;
200*7dd7cddfSDavid du Colombier EXTERN	long	bsssize;
201*7dd7cddfSDavid du Colombier EXTERN	int	cbc;
202*7dd7cddfSDavid du Colombier EXTERN	uchar*	cbp;
203*7dd7cddfSDavid du Colombier EXTERN	int	cout;
204*7dd7cddfSDavid du Colombier EXTERN	Auto*	curauto;
205*7dd7cddfSDavid du Colombier EXTERN	Auto*	curhist;
206*7dd7cddfSDavid du Colombier EXTERN	Prog*	curp;
207*7dd7cddfSDavid du Colombier EXTERN	Prog*	curtext;
208*7dd7cddfSDavid du Colombier EXTERN	Prog*	datap;
209*7dd7cddfSDavid du Colombier EXTERN	long	datsize;
210*7dd7cddfSDavid du Colombier EXTERN	char	debug[128];
211*7dd7cddfSDavid du Colombier EXTERN	Prog*	etextp;
212*7dd7cddfSDavid du Colombier EXTERN	Prog*	firstp;
213*7dd7cddfSDavid du Colombier EXTERN	char	fnuxi4[4];
214*7dd7cddfSDavid du Colombier EXTERN	char	fnuxi8[8];
215*7dd7cddfSDavid du Colombier EXTERN	char*	noname;
216*7dd7cddfSDavid du Colombier EXTERN	Sym*	hash[NHASH];
217*7dd7cddfSDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
218*7dd7cddfSDavid du Colombier EXTERN	int	histfrogp;
219*7dd7cddfSDavid du Colombier EXTERN	int	histgen;
220*7dd7cddfSDavid du Colombier EXTERN	char*	library[50];
221*7dd7cddfSDavid du Colombier EXTERN	int	libraryp;
222*7dd7cddfSDavid du Colombier EXTERN	char*	hunk;
223*7dd7cddfSDavid du Colombier EXTERN	char	inuxi1[1];
224*7dd7cddfSDavid du Colombier EXTERN	char	inuxi2[2];
225*7dd7cddfSDavid du Colombier EXTERN	char	inuxi4[4];
226*7dd7cddfSDavid du Colombier EXTERN	Prog*	lastp;
227*7dd7cddfSDavid du Colombier EXTERN	long	lcsize;
228*7dd7cddfSDavid du Colombier EXTERN	char	literal[32];
229*7dd7cddfSDavid du Colombier EXTERN	int	nerrors;
230*7dd7cddfSDavid du Colombier EXTERN	long	nhunk;
231*7dd7cddfSDavid du Colombier EXTERN	long	instoffset;
232*7dd7cddfSDavid du Colombier EXTERN	Opcross	opcross[8];
233*7dd7cddfSDavid du Colombier EXTERN	Oprang	oprange[ALAST];
234*7dd7cddfSDavid du Colombier EXTERN	char*	outfile;
235*7dd7cddfSDavid du Colombier EXTERN	long	pc;
236*7dd7cddfSDavid du Colombier EXTERN	uchar	repop[ALAST];
237*7dd7cddfSDavid du Colombier EXTERN	long	symsize;
238*7dd7cddfSDavid du Colombier EXTERN	Prog*	textp;
239*7dd7cddfSDavid du Colombier EXTERN	long	textsize;
240*7dd7cddfSDavid du Colombier EXTERN	long	thunk;
241*7dd7cddfSDavid du Colombier EXTERN	int	version;
242*7dd7cddfSDavid du Colombier EXTERN	char	xcmp[32][32];
243*7dd7cddfSDavid du Colombier EXTERN	Prog	zprg;
244*7dd7cddfSDavid du Colombier EXTERN	int	dtype;
245*7dd7cddfSDavid du Colombier 
246*7dd7cddfSDavid du Colombier extern	char*	anames[];
247*7dd7cddfSDavid du Colombier extern	Optab	optab[];
248*7dd7cddfSDavid du Colombier 
249*7dd7cddfSDavid du Colombier void	addpool(Prog*, Adr*);
250*7dd7cddfSDavid du Colombier EXTERN	Prog*	blitrl;
251*7dd7cddfSDavid du Colombier EXTERN	Prog*	elitrl;
252*7dd7cddfSDavid du Colombier 
253*7dd7cddfSDavid du Colombier void	initdiv(void);
254*7dd7cddfSDavid du Colombier EXTERN	Prog*	prog_div;
255*7dd7cddfSDavid du Colombier EXTERN	Prog*	prog_divu;
256*7dd7cddfSDavid du Colombier EXTERN	Prog*	prog_mod;
257*7dd7cddfSDavid du Colombier EXTERN	Prog*	prog_modu;
258*7dd7cddfSDavid du Colombier 
259*7dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	int
260*7dd7cddfSDavid du Colombier #pragma	varargck	type	"C"	int
261*7dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
262*7dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
263*7dd7cddfSDavid du Colombier #pragma	varargck	type	"N"	Adr*
264*7dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
265*7dd7cddfSDavid du Colombier 
266*7dd7cddfSDavid du Colombier int	Aconv(va_list*, Fconv*);
267*7dd7cddfSDavid du Colombier int	Cconv(va_list*, Fconv*);
268*7dd7cddfSDavid du Colombier int	Dconv(va_list*, Fconv*);
269*7dd7cddfSDavid du Colombier int	Nconv(va_list*, Fconv*);
270*7dd7cddfSDavid du Colombier int	Pconv(va_list*, Fconv*);
271*7dd7cddfSDavid du Colombier int	Sconv(va_list*, Fconv*);
272*7dd7cddfSDavid du Colombier int	aclass(Adr*);
273*7dd7cddfSDavid du Colombier void	addhist(long, int);
274*7dd7cddfSDavid du Colombier void	append(Prog*, Prog*);
275*7dd7cddfSDavid du Colombier void	asmb(void);
276*7dd7cddfSDavid du Colombier void	asmlc(void);
277*7dd7cddfSDavid du Colombier void	asmout(Prog*, Optab*);
278*7dd7cddfSDavid du Colombier void	asmsym(void);
279*7dd7cddfSDavid du Colombier long	atolwhex(char*);
280*7dd7cddfSDavid du Colombier Prog*	brloop(Prog*);
281*7dd7cddfSDavid du Colombier Biobuf	bso;
282*7dd7cddfSDavid du Colombier void	buildop(void);
283*7dd7cddfSDavid du Colombier void	buildrep(int, int);
284*7dd7cddfSDavid du Colombier void	cflush(void);
285*7dd7cddfSDavid du Colombier int	chipfloat(Ieee*);
286*7dd7cddfSDavid du Colombier int	cmp(int, int);
287*7dd7cddfSDavid du Colombier int	compound(Prog*);
288*7dd7cddfSDavid du Colombier double	cputime(void);
289*7dd7cddfSDavid du Colombier void	datblk(long, long);
290*7dd7cddfSDavid du Colombier void	diag(char*, ...);
291*7dd7cddfSDavid du Colombier void	dodata(void);
292*7dd7cddfSDavid du Colombier void	doprof1(void);
293*7dd7cddfSDavid du Colombier void	doprof2(void);
294*7dd7cddfSDavid du Colombier long	entryvalue(void);
295*7dd7cddfSDavid du Colombier void	errorexit(void);
296*7dd7cddfSDavid du Colombier void	exchange(Prog*);
297*7dd7cddfSDavid du Colombier int	find1(long, int);
298*7dd7cddfSDavid du Colombier void	follow(void);
299*7dd7cddfSDavid du Colombier void	gethunk(void);
300*7dd7cddfSDavid du Colombier void	histtoauto(void);
301*7dd7cddfSDavid du Colombier double	ieeedtod(Ieee*);
302*7dd7cddfSDavid du Colombier long	ieeedtof(Ieee*);
303*7dd7cddfSDavid du Colombier int	isnop(Prog*);
304*7dd7cddfSDavid du Colombier void	ldobj(int, long, char*);
305*7dd7cddfSDavid du Colombier void	loadlib(int, int);
306*7dd7cddfSDavid du Colombier void	listinit(void);
307*7dd7cddfSDavid du Colombier Sym*	lookup(char*, int);
308*7dd7cddfSDavid du Colombier void	lput(long);
309*7dd7cddfSDavid du Colombier void	lputl(long);
310*7dd7cddfSDavid du Colombier void	mkfwd(void);
311*7dd7cddfSDavid du Colombier void*	mysbrk(ulong);
312*7dd7cddfSDavid du Colombier void	names(void);
313*7dd7cddfSDavid du Colombier void	nocache(Prog*);
314*7dd7cddfSDavid du Colombier void	nuxiinit(void);
315*7dd7cddfSDavid du Colombier void	objfile(char*);
316*7dd7cddfSDavid du Colombier int	ocmp(const void*, const void*);
317*7dd7cddfSDavid du Colombier long	opirr(int);
318*7dd7cddfSDavid du Colombier Optab*	oplook(Prog*);
319*7dd7cddfSDavid du Colombier long	oprrr(int, int);
320*7dd7cddfSDavid du Colombier long	olr(long, int, int, int);
321*7dd7cddfSDavid du Colombier long	olrr(int, int, int, int);
322*7dd7cddfSDavid du Colombier long	osr(int, int, long, int, int);
323*7dd7cddfSDavid du Colombier long	ofsr(int, int, long, int, int);
324*7dd7cddfSDavid du Colombier long	osrr(int, int, int, int);
325*7dd7cddfSDavid du Colombier long	oshrr(int, int, int, int);
326*7dd7cddfSDavid du Colombier void	patch(void);
327*7dd7cddfSDavid du Colombier void	prasm(Prog*);
328*7dd7cddfSDavid du Colombier void	prepend(Prog*, Prog*);
329*7dd7cddfSDavid du Colombier Prog*	prg(void);
330*7dd7cddfSDavid du Colombier int	pseudo(Prog*);
331*7dd7cddfSDavid du Colombier void	putsymb(char*, int, long, int);
332*7dd7cddfSDavid du Colombier long	regoff(Adr*);
333*7dd7cddfSDavid du Colombier int	relinv(int);
334*7dd7cddfSDavid du Colombier long	rnd(long, long);
335*7dd7cddfSDavid du Colombier void	span(void);
336*7dd7cddfSDavid du Colombier void	strnput(char*, int);
337*7dd7cddfSDavid du Colombier void	undef(void);
338*7dd7cddfSDavid du Colombier void	xdefine(char*, int, long);
339*7dd7cddfSDavid du Colombier void	xfol(Prog*);
340*7dd7cddfSDavid du Colombier void	xfol(Prog*);
341*7dd7cddfSDavid du Colombier void	noops(void);
342*7dd7cddfSDavid du Colombier long	immrot(ulong);
343*7dd7cddfSDavid du Colombier long	immaddr(long);
344*7dd7cddfSDavid du Colombier long	opbra(int, int);
345