xref: /plan9-contrib/sys/src/cmd/9l/l.h (revision 2ec6491f4460014c01f3ea5c06b30b1a392b0bb2)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../9c/9.out.h"
5 #include	"../8l/elf.h"
6 
7 #ifndef	EXTERN
8 #define	EXTERN	extern
9 #endif
10 
11 #define	LIBNAMELEN	300
12 
13 typedef	struct	Adr	Adr;
14 typedef	struct	Sym	Sym;
15 typedef	struct	Autom	Auto;
16 typedef	struct	Prog	Prog;
17 typedef	struct	Optab	Optab;
18 
19 #define	P		((Prog*)0)
20 #define	S		((Sym*)0)
21 #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
22 
23 struct	Adr
24 {
25 	union
26 	{
27 		vlong	u0offset;
28 		char	u0sval[NSNAME];
29 		Ieee	u0ieee;
30 	}u0;
31 	Sym	*sym;
32 	Auto	*autom;
33 	char	type;
34 	uchar	reg;
35 	char	name;
36 	char	class;
37 };
38 
39 #define	offset	u0.u0offset
40 #define	sval	u0.u0sval
41 #define	ieee	u0.u0ieee
42 
43 struct	Prog
44 {
45 	Adr	from;
46 	Adr	from3;	/* fma and rlwm */
47 	Adr	to;
48 	Prog	*forwd;
49 	Prog	*cond;
50 	Prog	*link;
51 	vlong	pc;
52 	long	regused;
53 	short	line;
54 	short	mark;
55 	short	optab;		/* could be uchar */
56 	short	as;
57 	char	reg;
58 };
59 struct	Sym
60 {
61 	char	*name;
62 	short	type;
63 	short	version;
64 	short	become;
65 	short	frame;
66 	uchar	subtype;
67 	ushort	file;
68 	vlong	value;
69 	long	sig;
70 	Sym	*link;
71 };
72 struct	Autom
73 {
74 	Sym	*sym;
75 	Auto	*link;
76 	vlong	aoffset;
77 	short	type;
78 };
79 struct	Optab
80 {
81 	short	as;
82 	char	a1;
83 	char	a2;
84 	char	a3;
85 	char	a4;
86 	char	type;
87 	char	size;
88 	char	param;
89 };
90 struct
91 {
92 	Optab*	start;
93 	Optab*	stop;
94 } oprange[ALAST];
95 
96 enum
97 {
98 	FPCHIP		= 1,
99 	BIG		= 32768-8,
100 	STRINGSZ	= 200,
101 	MAXIO		= (16*1024),
102 	MAXHIST		= 20,				/* limit of path elements for history symbols */
103 	DATBLK		= 1024,
104 	NHASH		= 10007,
105 	NHUNK		= 100000,
106 	MINSIZ		= 64,
107 	NENT		= 100,
108 	NSCHED		= 20,
109 
110 /* mark flags */
111 	LABEL		= 1<<0,
112 	LEAF		= 1<<1,
113 	FLOAT		= 1<<2,
114 	BRANCH		= 1<<3,
115 	LOAD		= 1<<4,
116 	FCMP		= 1<<5,
117 	SYNC		= 1<<6,
118 	LIST		= 1<<7,
119 	FOLL		= 1<<8,
120 	NOSCHED		= 1<<9,
121 
122 	STEXT		= 1,
123 	SDATA,
124 	SBSS,
125 	SDATA1,
126 	SXREF,
127 	SLEAF,
128 	SFILE,
129 	SCONST,
130 	SUNDEF,
131 
132 	SIMPORT,
133 	SEXPORT,
134 
135 	C_NONE		= 0,
136 	C_REG,
137 	C_FREG,
138 	C_CREG,
139 	C_SPR,		/* special processor register */
140 	C_ZCON,
141 	C_SCON,		/* 16 bit signed */
142 	C_UCON,		/* low 16 bits 0 */
143 	C_ADDCON,	/* -0x8000 <= v < 0 */
144 	C_ANDCON,	/* 0 < v <= 0xFFFF */
145 	C_LCON,		/* other 32 */
146 	C_DCON,		/* other 64 (could subdivide further) */
147 	C_SACON,
148 	C_SECON,
149 	C_LACON,
150 	C_LECON,
151 	C_SBRA,
152 	C_LBRA,
153 	C_SAUTO,
154 	C_LAUTO,
155 	C_SEXT,
156 	C_LEXT,
157 	C_ZOREG,
158 	C_SOREG,
159 	C_LOREG,
160 	C_FPSCR,
161 	C_MSR,
162 	C_XER,
163 	C_LR,
164 	C_CTR,
165 	C_ANY,
166 	C_GOK,
167 	C_ADDR,
168 
169 	C_NCLASS,
170 
171 	Roffset	= 22,		/* no. bits for offset in relocation address */
172 	Rindex	= 10		/* no. bits for index in relocation address */
173 };
174 
175 EXTERN union
176 {
177 	struct
178 	{
179 		uchar	obuf[MAXIO];			/* output buffer */
180 		uchar	ibuf[MAXIO];			/* input buffer */
181 	} u;
182 	char	dbuf[1];
183 } buf;
184 
185 #define	cbuf	u.obuf
186 #define	xbuf	u.ibuf
187 
188 EXTERN	long	HEADR;			/* length of header */
189 EXTERN	int	HEADTYPE;		/* type of header */
190 EXTERN	vlong	INITDAT;		/* data location */
191 EXTERN	long	INITRND;		/* data round above text location */
192 EXTERN	vlong	INITTEXT;		/* text location */
193 EXTERN	long	INITTEXTP;		/* text location (physical) */
194 EXTERN	char*	INITENTRY;		/* entry point */
195 EXTERN	long	autosize;
196 EXTERN	Biobuf	bso;
197 EXTERN	long	bsssize;
198 EXTERN	int	cbc;
199 EXTERN	uchar*	cbp;
200 EXTERN	int	cout;
201 EXTERN	Auto*	curauto;
202 EXTERN	Auto*	curhist;
203 EXTERN	Prog*	curp;
204 EXTERN	Prog*	curtext;
205 EXTERN	Prog*	datap;
206 EXTERN	Prog*	prog_movsw;
207 EXTERN	Prog*	prog_movdw;
208 EXTERN	Prog*	prog_movws;
209 EXTERN	Prog*	prog_movwd;
210 EXTERN	vlong	datsize;
211 EXTERN	char	debug[128];
212 EXTERN	Prog*	firstp;
213 EXTERN	uchar	fnuxi8[8];
214 EXTERN	uchar	fnuxi4[4];
215 EXTERN	Sym*	hash[NHASH];
216 EXTERN	Sym*	histfrog[MAXHIST];
217 EXTERN	int	histfrogp;
218 EXTERN	int	histgen;
219 EXTERN	char*	library[50];
220 EXTERN	char*	libraryobj[50];
221 EXTERN	int	libraryp;
222 EXTERN	int	xrefresolv;
223 EXTERN	char*	hunk;
224 EXTERN	uchar	inuxi1[1];
225 EXTERN	uchar	inuxi2[2];
226 EXTERN	uchar	inuxi4[4];
227 EXTERN	uchar	inuxi8[8];
228 EXTERN	Prog*	lastp;
229 EXTERN	long	lcsize;
230 EXTERN	char	literal[32];
231 EXTERN	int	nerrors;
232 EXTERN	long	nhunk;
233 EXTERN	char*	noname;
234 EXTERN	vlong	instoffset;
235 EXTERN	char*	outfile;
236 EXTERN	vlong	pc;
237 EXTERN	int	r0iszero;
238 EXTERN	long	symsize;
239 EXTERN	long	staticgen;
240 EXTERN	Prog*	textp;
241 EXTERN	vlong	textsize;
242 EXTERN	long	tothunk;
243 EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
244 EXTERN	int	version;
245 EXTERN	Prog	zprg;
246 EXTERN	int	dtype;
247 
248 EXTERN	int	doexp, dlm;
249 EXTERN	int	imports, nimports;
250 EXTERN	int	exports, nexports, allexport;
251 EXTERN	char*	EXPTAB;
252 EXTERN	Prog	undefp;
253 
254 #define	UP	(&undefp)
255 
256 extern	Optab	optab[];
257 extern	char*	anames[];
258 extern	char*	cnames[];
259 
260 int	Aconv(Fmt*);
261 int	Dconv(Fmt*);
262 int	Nconv(Fmt*);
263 int	Pconv(Fmt*);
264 int	Sconv(Fmt*);
265 int	Rconv(Fmt*);
266 int	aclass(Adr*);
267 void	addhist(long, int);
268 void	histtoauto(void);
269 void	addlibpath(char*);
270 void	addnop(Prog*);
271 void	append(Prog*, Prog*);
272 void	asmb(void);
273 void	asmdyn(void);
274 void	asmlc(void);
275 int	asmout(Prog*, Optab*, int);
276 void	asmsym(void);
277 vlong	atolwhex(char*);
278 Prog*	brloop(Prog*);
279 void	buildop(void);
280 void	cflush(void);
281 void	ckoff(Sym*, vlong);
282 int	cmp(int, int);
283 void	cput(long);
284 int	compound(Prog*);
285 double	cputime(void);
286 void	datblk(long, long);
287 void	diag(char*, ...);
288 void	dodata(void);
289 void	doprof1(void);
290 void	doprof2(void);
291 void	dynreloc(Sym*, long, int, int, int);
292 vlong	entryvalue(void);
293 void	errorexit(void);
294 void	exchange(Prog*);
295 void	export(void);
296 int	fileexists(char*);
297 int	find1(long, int);
298 char*	findlib(char*);
299 void	follow(void);
300 void	gethunk(void);
301 double	ieeedtod(Ieee*);
302 long	ieeedtof(Ieee*);
303 void	import(void);
304 int	isint32(vlong);
305 int	isuint32(uvlong);
306 int	isnop(Prog*);
307 void	ldobj(int, long, char*);
308 void	loadlib(void);
309 void	listinit(void);
310 void	initmuldiv(void);
311 Sym*	lookup(char*, int);
312 void	llput(vlong);
313 void	llputl(vlong);
314 void	lput(long);
315 void	lputl(long);
316 void	mkfwd(void);
317 void*	mysbrk(ulong);
318 void	names(void);
319 void	nocache(Prog*);
320 void	noops(void);
321 void	nopout(Prog*);
322 void	nuxiinit(void);
323 void	objfile(char*);
324 int	ocmp(void*, void*);
325 long	opcode(int);
326 Optab*	oplook(Prog*);
327 void	patch(void);
328 void	prasm(Prog*);
329 void	prepend(Prog*, Prog*);
330 Prog*	prg(void);
331 int	pseudo(Prog*);
332 void	putsymb(char*, int, vlong, int);
333 void	readundefs(char*, int);
334 long	regoff(Adr*);
335 int	relinv(int);
336 vlong	rnd(vlong, long);
337 void	sched(Prog*, Prog*);
338 void	span(void);
339 void	strnput(char*, int);
340 void	undef(void);
341 void	undefsym(Sym*);
342 vlong	vregoff(Adr*);
343 void	wput(long);
344 void	wputl(long);
345 void	xdefine(char*, int, vlong);
346 void	xfol(Prog*);
347 void	zerosig(char*);
348 
349 #pragma	varargck	type	"D"	Adr*
350 #pragma	varargck	type	"N"	Adr*
351 #pragma	varargck	type	"P"	Prog*
352 #pragma	varargck	type	"R"	int
353 #pragma	varargck	type	"A"	int
354 #pragma	varargck	type	"S"	char*
355 #pragma	varargck	argpos	diag 1
356