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