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