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