xref: /plan9/sys/src/cmd/vl/l.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../vc/v.out.h"
5 
6 typedef	struct	Adr	Adr;
7 typedef	struct	Sym	Sym;
8 typedef	struct	Autom	Auto;
9 typedef	struct	Prog	Prog;
10 typedef	struct	Optab	Optab;
11 typedef	struct	Oprang	Oprang;
12 typedef	uchar	Opcross[32][2][32];
13 typedef	struct	Count	Count;
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	offset;
24 		char*	sval;
25 		Ieee*	ieee;
26 	};
27 	union
28 	{
29 		Auto*	autom;
30 		Sym*	sym;
31 	};
32 	char	type;
33 	char	reg;
34 	char	name;
35 	char	class;
36 };
37 struct	Prog
38 {
39 	Adr	from;
40 	Adr	to;
41 	union
42 	{
43 		long	regused;
44 		Prog*	forwd;
45 	};
46 	Prog*	cond;
47 	Prog*	link;
48 	long	pc;
49 	long	line;
50 	uchar	mark;
51 	uchar	optab;
52 	char	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 	long	value;
63 	Sym*	link;
64 };
65 struct	Autom
66 {
67 	Sym*	sym;
68 	Auto*	link;
69 	long	offset;
70 	short	type;
71 };
72 struct	Optab
73 {
74 	char	as;
75 	char	a1;
76 	char	a2;
77 	char	a3;
78 	char	type;
79 	char	size;
80 	char	param;
81 };
82 struct	Oprang
83 {
84 	Optab*	start;
85 	Optab*	stop;
86 };
87 struct	Count
88 {
89 	long	count;
90 	long	outof;
91 };
92 
93 enum
94 {
95 	STEXT		= 1,
96 	SDATA,
97 	SBSS,
98 	SDATA1,
99 	SXREF,
100 	SLEAF,
101 	SFILE,
102 	SCONST,
103 
104 	C_NONE		= 0,
105 	C_REG,
106 	C_FREG,
107 	C_FCREG,
108 	C_MREG,
109 	C_HI,
110 	C_LO,
111 	C_ZCON,
112 	C_SCON,
113 	C_ADD0CON,
114 	C_AND0CON,
115 	C_ADDCON,
116 	C_ANDCON,
117 	C_UCON,
118 	C_LCON,
119 	C_SACON,
120 	C_SECON,
121 	C_LACON,
122 	C_LECON,
123 	C_SBRA,
124 	C_LBRA,
125 	C_SAUTO,
126 	C_SEXT,
127 	C_LAUTO,
128 	C_LEXT,
129 	C_ZOREG,
130 	C_SOREG,
131 	C_LOREG,
132 	C_GOK,
133 
134 	NSCHED		= 20,
135 
136 /* mark flags */
137 	FOLL		= 1<<0,
138 	LABEL		= 1<<1,
139 	LEAF		= 1<<2,
140 	SYNC		= 1<<3,
141 	BRANCH		= 1<<4,
142 	LOAD		= 1<<5,
143 	FCMP		= 1<<6,
144 	NOSCHED		= 1<<7,
145 
146 	BIG		= 32766,
147 	STRINGSZ	= 200,
148 	NHASH		= 10007,
149 	NHUNK		= 100000,
150 	MINSIZ		= 64,
151 	NENT		= 100,
152 	MAXIO		= 8192,
153 	MAXHIST		= 20,				/* limit of path elements for history symbols */
154 };
155 
156 union
157 {
158 	struct
159 	{
160 		uchar	cbuf[MAXIO];			/* output buffer */
161 		uchar	xbuf[MAXIO];			/* input buffer */
162 	};
163 	char	dbuf[1];
164 } buf;
165 
166 long	HEADR;			/* length of header */
167 int	HEADTYPE;		/* type of header */
168 long	INITDAT;		/* data location */
169 long	INITRND;		/* data round above text location */
170 long	INITTEXT;		/* text location */
171 char*	INITENTRY;		/* entry point */
172 long	autosize;
173 Biobuf	bso;
174 long	bsssize;
175 int	cbc;
176 uchar*	cbp;
177 int	cout;
178 Auto*	curauto;
179 Auto*	curhist;
180 Prog*	curp;
181 Prog*	curtext;
182 Prog*	datap;
183 long	datsize;
184 char	debug[128];
185 Prog*	etextp;
186 Prog*	firstp;
187 char	fnuxi8[8];
188 char*	noname;
189 Sym*	hash[NHASH];
190 Sym*	histfrog[MAXHIST];
191 int	histfrogp;
192 int	histgen;
193 char*	library[50];
194 int	libraryp;
195 char*	hunk;
196 char	inuxi1[1];
197 char	inuxi2[2];
198 char	inuxi4[4];
199 Prog*	lastp;
200 long	lcsize;
201 char	literal[32];
202 int	nerrors;
203 long	nhunk;
204 long	offset;
205 Opcross	opcross[8];
206 Oprang	oprange[ALAST];
207 char*	outfile;
208 long	pc;
209 uchar	repop[ALAST];
210 long	symsize;
211 Prog*	textp;
212 long	textsize;
213 long	thunk;
214 int	version;
215 char	xcmp[32][32];
216 Prog	zprg;
217 int	dtype;
218 
219 struct
220 {
221 	Count	branch;
222 	Count	fcmp;
223 	Count	load;
224 	Count	mfrom;
225 	Count	page;
226 	Count	jump;
227 } nop;
228 
229 extern	char*	anames[];
230 extern	Optab	optab[];
231 
232 int	Aconv(void*, Fconv*);
233 int	Dconv(void*, Fconv*);
234 int	Nconv(void*, Fconv*);
235 int	Pconv(void*, Fconv*);
236 int	Sconv(void*, Fconv*);
237 int	aclass(Adr*);
238 void	addhist(long, int);
239 void	addnop(Prog*);
240 void	append(Prog*, Prog*);
241 void	asmb(void);
242 void	asmlc(void);
243 int	asmout(Prog*, Optab*, int);
244 void	asmsym(void);
245 long	atolwhex(char*);
246 Prog*	brloop(Prog*);
247 Biobuf	bso;
248 void	buildop(void);
249 void	buildrep(int, int);
250 void	cflush(void);
251 int	cmp(int, int);
252 int	compound(Prog*);
253 double	cputime(void);
254 void	datblk(long, long);
255 void	diag(char*, ...);
256 void	dodata(void);
257 void	doprof1(void);
258 void	doprof2(void);
259 long	entryvalue(void);
260 void	errorexit(void);
261 void	exchange(Prog*);
262 int	find1(long, int);
263 void	follow(void);
264 void	gethunk(void);
265 void	histtoauto(void);
266 double	ieeedtod(Ieee*);
267 long	ieeedtof(Ieee*);
268 int	isnop(Prog*);
269 void	ldobj(int, long, char*);
270 void	loadlib(int, int);
271 void	listinit(void);
272 Sym*	lookup(char*, int);
273 void	lput(long);
274 void	mkfwd(void);
275 void	names(void);
276 void	nocache(Prog*);
277 void	noops(void);
278 void	nuxiinit(void);
279 void	objfile(char*);
280 int	ocmp(void*, void*);
281 long	opirr(int);
282 Optab*	oplook(Prog*);
283 long	oprrr(int);
284 void	patch(void);
285 void	prasm(Prog*);
286 void	prepend(Prog*, Prog*);
287 Prog*	prg(void);
288 int	pseudo(Prog*);
289 void	putsymb(char*, int, long, int);
290 long	regoff(Adr*);
291 int	relinv(int);
292 long	rnd(long, long);
293 void	sched(Prog*, Prog*);
294 void	span(void);
295 void	strnput(char*, int);
296 void	undef(void);
297 void	xdefine(char*, int, long);
298 void	xfol(Prog*);
299 void	xfol(Prog*);
300 void	nopstat(char*, Count*);
301