xref: /plan9/sys/src/cmd/kl/l.h (revision b87cd620ecfdc8c76fc402275c5ab6ae2edfd4ee)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../kc/k.out.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 	union
31 	{
32 		Auto*	u1autom;
33 		Sym*	u1sym;
34 	} u1;
35 	char	type;
36 	char	reg;
37 	char	name;
38 	char	class;
39 };
40 
41 #define	offset	u0.u0offset
42 #define	sval	u0.u0sval
43 #define	ieee	u0.u0ieee
44 
45 #define	autom	u1.u1autom
46 #define	sym	u1.u1sym
47 
48 struct	Prog
49 {
50 	Adr	from;
51 	Adr	to;
52 	Prog	*forwd;
53 	Prog	*cond;
54 	Prog	*link;
55 	long	pc;
56 	long	regused;
57 	short	line;
58 	short	mark;
59 	uchar	optab;
60 	uchar	as;
61 	char	reg;
62 };
63 struct	Sym
64 {
65 	char	*name;
66 	short	type;
67 	short	version;
68 	short	become;
69 	short	frame;
70 	long	value;
71 	Sym	*link;
72 };
73 struct	Autom
74 {
75 	Sym	*asym;
76 	Auto	*link;
77 	long	aoffset;
78 	short	type;
79 };
80 struct	Optab
81 {
82 	uchar	as;
83 	char	a1;
84 	char	a2;
85 	char	a3;
86 	char	type;
87 	char	size;
88 	char	param;
89 };
90 EXTERN	struct
91 {
92 	Optab*	start;
93 	Optab*	stop;
94 } oprange[AEND];
95 
96 enum
97 {
98 	AXLD		= AEND+1,
99 	AXST,
100 	FPCHIP		= 1,
101 	BIG		= 4096-8,
102 	STRINGSZ	= 200,
103 	MAXIO		= 8192,
104 	MAXHIST		= 20,				/* limit of path elements for history symbols */
105 	DATBLK		= 1024,
106 	NHASH		= 10007,
107 	NHUNK		= 100000,
108 	MINSIZ		= 64,
109 	NENT		= 100,
110 	NSCHED		= 20,
111 
112 /* mark flags */
113 	LABEL		= 1<<0,
114 	LEAF		= 1<<1,
115 	FLOAT		= 1<<2,
116 	BRANCH		= 1<<3,
117 	LOAD		= 1<<4,
118 	FCMP		= 1<<5,
119 	SYNC		= 1<<6,
120 	LIST		= 1<<7,
121 	FOLL		= 1<<8,
122 	NOSCHED		= 1<<9,
123 
124 	STEXT		= 1,
125 	SDATA,
126 	SBSS,
127 	SDATA1,
128 	SXREF,
129 	SLEAF,
130 	SFILE,
131 	SCONST,
132 
133 	C_NONE		= 0,
134 
135 	C_REG,
136 	C_FREG,
137 	C_CREG,
138 	C_PREG,
139 	C_FSR,
140 	C_FQ,
141 
142 	C_ZCON,		/* 0 */
143 	C_SCON,		/* 13 bit signed */
144 	C_UCON,		/* low 10 bits 0 */
145 	C_LCON,		/* other */
146 
147 	C_SACON,
148 	C_SECON,
149 	C_LACON,
150 	C_LECON,
151 
152 	C_SBRA,
153 	C_LBRA,
154 
155 	C_ESAUTO,
156 	C_OSAUTO,
157 	C_SAUTO,
158 	C_OLAUTO,
159 	C_ELAUTO,
160 	C_LAUTO,
161 
162 	C_ESEXT,
163 	C_OSEXT,
164 	C_SEXT,
165 	C_ELEXT,
166 	C_OLEXT,
167 	C_LEXT,
168 
169 	C_ZOREG,
170 	C_SOREG,
171 	C_LOREG,
172 	C_ASI,
173 
174 	C_ANY,
175 
176 	C_GOK,
177 
178 	C_NCLASS
179 };
180 
181 EXTERN union
182 {
183 	struct
184 	{
185 		uchar	obuf[MAXIO];			/* output buffer */
186 		uchar	ibuf[MAXIO];			/* input buffer */
187 	} u;
188 	char	dbuf[1];
189 } buf;
190 
191 #define	cbuf	u.obuf
192 #define	xbuf	u.ibuf
193 
194 EXTERN	long	HEADR;			/* length of header */
195 EXTERN	int	HEADTYPE;		/* type of header */
196 EXTERN	long	INITDAT;		/* data location */
197 EXTERN	long	INITRND;		/* data round above text location */
198 EXTERN	long	INITTEXT;		/* text location */
199 EXTERN	char*	INITENTRY;		/* entry point */
200 EXTERN	long	autosize;
201 EXTERN	Biobuf	bso;
202 EXTERN	long	bsssize;
203 EXTERN	int	cbc;
204 EXTERN	uchar*	cbp;
205 EXTERN	int	cout;
206 EXTERN	Auto*	curauto;
207 EXTERN	Auto*	curhist;
208 EXTERN	Prog*	curp;
209 EXTERN	Prog*	curtext;
210 EXTERN	Prog*	datap;
211 EXTERN	Prog*	prog_mul;
212 EXTERN	Prog*	prog_div;
213 EXTERN	Prog*	prog_divl;
214 EXTERN	Prog*	prog_mod;
215 EXTERN	Prog*	prog_modl;
216 EXTERN	long	datsize;
217 EXTERN	char	debug[128];
218 EXTERN	Prog*	firstp;
219 EXTERN	char	fnuxi8[8];
220 EXTERN	Sym*	hash[NHASH];
221 EXTERN	Sym*	histfrog[MAXHIST];
222 EXTERN	int	histfrogp;
223 EXTERN	int	histgen;
224 EXTERN	char*	library[50];
225 EXTERN	char*	libraryobj[50];
226 EXTERN	int	libraryp;
227 EXTERN	int	xrefresolv;
228 EXTERN	char*	hunk;
229 EXTERN	char	inuxi1[1];
230 EXTERN	char	inuxi2[2];
231 EXTERN	char	inuxi4[4];
232 EXTERN	Prog*	lastp;
233 EXTERN	long	lcsize;
234 EXTERN	char	literal[32];
235 EXTERN	int	nerrors;
236 EXTERN	long	nhunk;
237 EXTERN	char*	noname;
238 EXTERN	long	instoffset;
239 EXTERN	char*	outfile;
240 EXTERN	long	pc;
241 EXTERN	long	symsize;
242 EXTERN	long	staticgen;
243 EXTERN	Prog*	textp;
244 EXTERN	long	textsize;
245 EXTERN	long	tothunk;
246 EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
247 EXTERN	int	version;
248 EXTERN	Prog	zprg;
249 EXTERN	int	dtype;
250 
251 extern	Optab	optab[];
252 extern	char*	anames[];
253 
254 #pragma	varargck	type	"A"	int
255 #pragma	varargck	type	"A"	uint
256 #pragma	varargck	type	"D"	Adr*
257 #pragma	varargck	type	"N"	Adr*
258 #pragma	varargck	type	"P"	Prog*
259 #pragma	varargck	type	"S"	char*
260 
261 #pragma	varargck	argpos	diag 1
262 
263 int	Aconv(Fmt*);
264 int	Dconv(Fmt*);
265 int	Nconv(Fmt*);
266 int	Pconv(Fmt*);
267 int	Sconv(Fmt*);
268 int	aclass(Adr*);
269 void	addhist(long, int);
270 void	histtoauto(void);
271 void	addlibpath(char*);
272 void	addnop(Prog*);
273 void	append(Prog*, Prog*);
274 void	asmb(void);
275 void	asmlc(void);
276 int	asmout(Prog*, Optab*, int);
277 void	asmsym(void);
278 long	atolwhex(char*);
279 Prog*	brloop(Prog*);
280 void	buildop(void);
281 void	cflush(void);
282 int	cmp(int, int);
283 int	compound(Prog*);
284 double	cputime(void);
285 void	datblk(long, long);
286 void	diag(char*, ...);
287 void	dodata(void);
288 void	doprof1(void);
289 void	doprof2(void);
290 long	entryvalue(void);
291 void	errorexit(void);
292 void	exchange(Prog*);
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 int	isnop(Prog*);
301 void	ldobj(int, long, char*);
302 void	loadlib(void);
303 void	listinit(void);
304 void	initmuldiv(void);
305 Sym*	lookup(char*, int);
306 void	lput(long);
307 void	mkfwd(void);
308 void*	mysbrk(ulong);
309 void	names(void);
310 void	nocache(Prog*);
311 void	noops(void);
312 void	nuxiinit(void);
313 void	objfile(char*);
314 int	ocmp(const void*, const void*);
315 long	opcode(int);
316 Optab*	oplook(Prog*);
317 void	patch(void);
318 void	prasm(Prog*);
319 void	prepend(Prog*, Prog*);
320 Prog*	prg(void);
321 int	pseudo(Prog*);
322 void	putsymb(char*, int, long, int);
323 long	regoff(Adr*);
324 int	relinv(int);
325 long	rnd(long, long);
326 void	sched(Prog*, Prog*);
327 void	span(void);
328 void	undef(void);
329 void	xdefine(char*, int, long);
330 void	xfol(Prog*);
331