xref: /inferno-os/utils/vl/l.h (revision e57c7e16a3789cd4de1a3c2560d49b1ee39cd10a)
1 #include	<lib9.h>
2 #include	<bio.h>
3 #include	"../vc/v.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 typedef	struct	Oprang	Oprang;
15 typedef	uchar	Opcross[32][2][32];
16 typedef	struct	Count	Count;
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;
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 	union
53 	{
54 		long	u0regused;
55 		Prog*	u0forwd;
56 	} u0;
57 	Prog*	cond;
58 	Prog*	link;
59 	long	pc;
60 	long	line;
61 	uchar	mark;
62 	uchar	optab;
63 	char	as;
64 	char	reg;
65 };
66 #define	regused	u0.u0regused
67 #define	forwd	u0.u0forwd
68 
69 struct	Sym
70 {
71 	char	*name;
72 	short	type;
73 	short	version;
74 	short	become;
75 	short	frame;
76 	long	value;
77 	Sym*	link;
78 };
79 struct	Autom
80 {
81 	Sym*	asym;
82 	Auto*	link;
83 	long	aoffset;
84 	short	type;
85 };
86 struct	Optab
87 {
88 	char	as;
89 	char	a1;
90 	char	a2;
91 	char	a3;
92 	char	type;
93 	char	size;
94 	char	param;
95 };
96 struct	Oprang
97 {
98 	Optab*	start;
99 	Optab*	stop;
100 };
101 struct	Count
102 {
103 	long	count;
104 	long	outof;
105 };
106 
107 enum
108 {
109 	STEXT		= 1,
110 	SDATA,
111 	SBSS,
112 	SDATA1,
113 	SXREF,
114 	SLEAF,
115 	SFILE,
116 	SCONST,
117 	SSTRING,
118 
119 	C_NONE		= 0,
120 	C_REG,
121 	C_FREG,
122 	C_FCREG,
123 	C_MREG,
124 	C_HI,
125 	C_LO,
126 	C_ZCON,
127 	C_SCON,
128 	C_ADD0CON,
129 	C_AND0CON,
130 	C_ADDCON,
131 	C_ANDCON,
132 	C_UCON,
133 	C_LCON,
134 	C_SACON,
135 	C_SECON,
136 	C_LACON,
137 	C_LECON,
138 	C_SBRA,
139 	C_LBRA,
140 	C_SAUTO,
141 	C_SEXT,
142 	C_LAUTO,
143 	C_LEXT,
144 	C_ZOREG,
145 	C_SOREG,
146 	C_LOREG,
147 	C_GOK,
148 
149 	NSCHED		= 20,
150 
151 /* mark flags */
152 	FOLL		= 1<<0,
153 	LABEL		= 1<<1,
154 	LEAF		= 1<<2,
155 	SYNC		= 1<<3,
156 	BRANCH		= 1<<4,
157 	LOAD		= 1<<5,
158 	FCMP		= 1<<6,
159 	NOSCHED		= 1<<7,
160 
161 	BIG		= 32766,
162 	STRINGSZ	= 200,
163 	NHASH		= 10007,
164 	NHUNK		= 100000,
165 	MINSIZ		= 64,
166 	NENT		= 100,
167 	MAXIO		= 8192,
168 	MAXHIST		= 20,				/* limit of path elements for history symbols */
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	long	datsize;
202 EXTERN	char	debug[128];
203 EXTERN	Prog*	etextp;
204 EXTERN	Prog*	firstp;
205 EXTERN	char	fnuxi4[4];	/* for 3l [sic] */
206 EXTERN	char	fnuxi8[8];
207 EXTERN	char*	noname;
208 EXTERN	Sym*	hash[NHASH];
209 EXTERN	Sym*	histfrog[MAXHIST];
210 EXTERN	int	histfrogp;
211 EXTERN	int	histgen;
212 EXTERN	char*	library[50];
213 EXTERN	char*	libraryobj[50];
214 EXTERN	int	libraryp;
215 EXTERN	int	xrefresolv;
216 EXTERN	char*	hunk;
217 EXTERN	char	inuxi1[1];
218 EXTERN	char	inuxi2[2];
219 EXTERN	char	inuxi4[4];
220 EXTERN	Prog*	lastp;
221 EXTERN	long	lcsize;
222 EXTERN	char	literal[32];
223 EXTERN	int	nerrors;
224 EXTERN	long	nhunk;
225 EXTERN	long	instoffset;
226 EXTERN	Opcross	opcross[10];
227 EXTERN	Oprang	oprange[ALAST];
228 EXTERN	char*	outfile;
229 EXTERN	long	pc;
230 EXTERN	uchar	repop[ALAST];
231 EXTERN	long	symsize;
232 EXTERN	Prog*	textp;
233 EXTERN	long	textsize;
234 EXTERN	long	thunk;
235 EXTERN	int	version;
236 EXTERN	char	xcmp[32][32];
237 EXTERN	Prog	zprg;
238 EXTERN	int	dtype;
239 EXTERN	int	little;
240 
241 EXTERN	struct
242 {
243 	Count	branch;
244 	Count	fcmp;
245 	Count	load;
246 	Count	mfrom;
247 	Count	page;
248 	Count	jump;
249 } nop;
250 
251 extern	char*	anames[];
252 extern	Optab	optab[];
253 
254 #pragma	varargck	type	"A"	int
255 #pragma	varargck	type	"D"	Adr*
256 #pragma	varargck	type	"N"	Adr*
257 #pragma	varargck	type	"P"	Prog*
258 #pragma	varargck	type	"S"	char*
259 
260 #pragma	varargck	argpos	diag 1
261 
262 int	Aconv(Fmt*);
263 int	Dconv(Fmt*);
264 int	Nconv(Fmt*);
265 int	Pconv(Fmt*);
266 int	Sconv(Fmt*);
267 int	aclass(Adr*);
268 void	addhist(long, int);
269 void	addnop(Prog*);
270 void	append(Prog*, Prog*);
271 void	asmb(void);
272 void	asmlc(void);
273 int	asmout(Prog*, Optab*, int);
274 void	asmsym(void);
275 long	atolwhex(char*);
276 Prog*	brloop(Prog*);
277 void	buildop(void);
278 void	buildrep(int, int);
279 void	cflush(void);
280 int	cmp(int, int);
281 int	compound(Prog*);
282 double	cputime(void);
283 void	datblk(long, long, int);
284 void	diag(char*, ...);
285 void	dodata(void);
286 void	doprof1(void);
287 void	doprof2(void);
288 long	entryvalue(void);
289 void	errorexit(void);
290 void	exchange(Prog*);
291 int	find1(long, int);
292 void	follow(void);
293 void	gethunk(void);
294 void	histtoauto(void);
295 double	ieeedtod(Ieee*);
296 long	ieeedtof(Ieee*);
297 int	isnop(Prog*);
298 void	ldobj(int, long, char*);
299 void	loadlib(void);
300 void	listinit(void);
301 Sym*	lookup(char*, int);
302 void	lput(long);
303 void	bput(long);
304 void	mkfwd(void);
305 void*	mysbrk(ulong);
306 void	names(void);
307 void	nocache(Prog*);
308 void	noops(void);
309 void	nuxiinit(void);
310 void	objfile(char*);
311 int	ocmp(const void*, const void*);
312 long	opirr(int);
313 Optab*	oplook(Prog*);
314 long	oprrr(int);
315 void	patch(void);
316 void	prasm(Prog*);
317 void	prepend(Prog*, Prog*);
318 Prog*	prg(void);
319 int	pseudo(Prog*);
320 void	putsymb(char*, int, long, int);
321 long	regoff(Adr*);
322 int	relinv(int);
323 long	rnd(long, long);
324 void	sched(Prog*, Prog*);
325 void	span(void);
326 void	strnput(char*, int);
327 void	undef(void);
328 void	xdefine(char*, int, long);
329 void	xfol(Prog*);
330 void	xfol(Prog*);
331 void	nopstat(char*, Count*);
332