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