xref: /inferno-os/utils/kl/l.h (revision 2b69dba5038ffd0b59cf30a4c44bce549e5097f8)
1 #include	<lib9.h>
2 #include	<bio.h>
3 #include	"../kc/k.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 	union
28 	{
29 		Auto*	u1autom;
30 		Sym*	u1sym;
31 	} u1;
32 	char	type;
33 	char	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 #define	autom	u1.u1autom
43 #define	sym	u1.u1sym
44 
45 struct	Prog
46 {
47 	Adr	from;
48 	Adr	to;
49 	Prog	*forwd;
50 	Prog	*cond;
51 	Prog	*link;
52 	long	pc;
53 	long	regused;
54 	short	line;
55 	short	mark;
56 	uchar	optab;
57 	uchar	as;
58 	char	reg;
59 };
60 struct	Sym
61 {
62 	char	*name;
63 	short	type;
64 	short	version;
65 	short	become;
66 	short	frame;
67 	long	value;
68 	Sym	*link;
69 };
70 struct	Autom
71 {
72 	Sym	*asym;
73 	Auto	*link;
74 	long	aoffset;
75 	short	type;
76 };
77 struct	Optab
78 {
79 	uchar	as;
80 	char	a1;
81 	char	a2;
82 	char	a3;
83 	char	type;
84 	char	size;
85 	char	param;
86 };
87 EXTERN	struct
88 {
89 	Optab*	start;
90 	Optab*	stop;
91 } oprange[AEND];
92 
93 enum
94 {
95 	AXLD		= AEND+1,
96 	AXST,
97 	FPCHIP		= 1,
98 	BIG		= 4096-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 
130 	C_NONE		= 0,
131 
132 	C_REG,
133 	C_FREG,
134 	C_CREG,
135 	C_PREG,
136 	C_FSR,
137 	C_FQ,
138 
139 	C_ZCON,		/* 0 */
140 	C_SCON,		/* 13 bit signed */
141 	C_UCON,		/* low 10 bits 0 */
142 	C_LCON,		/* other */
143 
144 	C_SACON,
145 	C_SECON,
146 	C_LACON,
147 	C_LECON,
148 
149 	C_SBRA,
150 	C_LBRA,
151 
152 	C_ESAUTO,
153 	C_OSAUTO,
154 	C_SAUTO,
155 	C_OLAUTO,
156 	C_ELAUTO,
157 	C_LAUTO,
158 
159 	C_ESEXT,
160 	C_OSEXT,
161 	C_SEXT,
162 	C_ELEXT,
163 	C_OLEXT,
164 	C_LEXT,
165 
166 	C_ZOREG,
167 	C_SOREG,
168 	C_LOREG,
169 	C_ASI,
170 
171 	C_ANY,
172 
173 	C_GOK,
174 
175 	C_NCLASS
176 };
177 
178 EXTERN union
179 {
180 	struct
181 	{
182 		uchar	obuf[MAXIO];			/* output buffer */
183 		uchar	ibuf[MAXIO];			/* input buffer */
184 	} u;
185 	char	dbuf[1];
186 } buf;
187 
188 #define	cbuf	u.obuf
189 #define	xbuf	u.ibuf
190 
191 EXTERN	long	HEADR;			/* length of header */
192 EXTERN	int	HEADTYPE;		/* type of header */
193 EXTERN	long	INITDAT;		/* data location */
194 EXTERN	long	INITRND;		/* data round above text location */
195 EXTERN	long	INITTEXT;		/* text location */
196 EXTERN	char*	INITENTRY;		/* entry point */
197 EXTERN	long	autosize;
198 EXTERN	Biobuf	bso;
199 EXTERN	long	bsssize;
200 EXTERN	int	cbc;
201 EXTERN	uchar*	cbp;
202 EXTERN	int	cout;
203 EXTERN	Auto*	curauto;
204 EXTERN	Auto*	curhist;
205 EXTERN	Prog*	curp;
206 EXTERN	Prog*	curtext;
207 EXTERN	Prog*	datap;
208 EXTERN	Prog*	prog_mul;
209 EXTERN	Prog*	prog_div;
210 EXTERN	Prog*	prog_divl;
211 EXTERN	Prog*	prog_mod;
212 EXTERN	Prog*	prog_modl;
213 EXTERN	long	datsize;
214 EXTERN	char	debug[128];
215 EXTERN	Prog*	firstp;
216 EXTERN	char	fnuxi8[8];
217 EXTERN	Sym*	hash[NHASH];
218 EXTERN	Sym*	histfrog[MAXHIST];
219 EXTERN	int	histfrogp;
220 EXTERN	int	histgen;
221 EXTERN	char*	library[50];
222 EXTERN	char*	libraryobj[50];
223 EXTERN	int	libraryp;
224 EXTERN	int	xrefresolv;
225 EXTERN	char*	hunk;
226 EXTERN	char	inuxi1[1];
227 EXTERN	char	inuxi2[2];
228 EXTERN	char	inuxi4[4];
229 EXTERN	Prog*	lastp;
230 EXTERN	long	lcsize;
231 EXTERN	char	literal[32];
232 EXTERN	int	nerrors;
233 EXTERN	long	nhunk;
234 EXTERN	char*	noname;
235 EXTERN	long	instoffset;
236 EXTERN	char*	outfile;
237 EXTERN	long	pc;
238 EXTERN	long	symsize;
239 EXTERN	long	staticgen;
240 EXTERN	Prog*	textp;
241 EXTERN	long	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	Optab	optab[];
249 extern	char*	anames[];
250 
251 #pragma	varargck	type	"A"	int
252 #pragma	varargck	type	"A"	uint
253 #pragma	varargck	type	"D"	Adr*
254 #pragma	varargck	type	"N"	Adr*
255 #pragma	varargck	type	"P"	Prog*
256 #pragma	varargck	type	"S"	char*
257 
258 #pragma	varargck	argpos	diag 1
259 
260 int	Aconv(Fmt*);
261 int	Dconv(Fmt*);
262 int	Nconv(Fmt*);
263 int	Pconv(Fmt*);
264 int	Sconv(Fmt*);
265 int	aclass(Adr*);
266 void	addhist(long, int);
267 void	histtoauto(void);
268 void	addnop(Prog*);
269 void	append(Prog*, Prog*);
270 void	asmb(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 int	cmp(int, int);
279 int	compound(Prog*);
280 double	cputime(void);
281 void	datblk(long, long);
282 void	diag(char*, ...);
283 void	dodata(void);
284 void	doprof1(void);
285 void	doprof2(void);
286 long	entryvalue(void);
287 void	errorexit(void);
288 void	exchange(Prog*);
289 int	find1(long, int);
290 void	follow(void);
291 void	gethunk(void);
292 double	ieeedtod(Ieee*);
293 long	ieeedtof(Ieee*);
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	nuxiinit(void);
307 void	objfile(char*);
308 int	ocmp(const void*, const void*);
309 long	opcode(int);
310 Optab*	oplook(Prog*);
311 void	patch(void);
312 void	prasm(Prog*);
313 void	prepend(Prog*, Prog*);
314 Prog*	prg(void);
315 int	pseudo(Prog*);
316 void	putsymb(char*, int, long, int);
317 long	regoff(Adr*);
318 int	relinv(int);
319 long	rnd(long, long);
320 void	sched(Prog*, Prog*);
321 void	span(void);
322 void	undef(void);
323 void	xdefine(char*, int, long);
324 void	xfol(Prog*);
325