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