xref: /plan9/sys/src/cmd/8l/l.h (revision 8153b942127462338e00e239914941524d579a3b)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../8c/8.out.h"
5 #include	"../8l/elf.h"
6 
7 #ifndef	EXTERN
8 #define	EXTERN	extern
9 #endif
10 
11 #define	P		((Prog*)0)
12 #define	S		((Sym*)0)
13 #define	TNAME		(curtext?curtext->from.sym->name:noname)
14 
15 #define	cput(c)\
16 	{ *cbp++ = c;\
17 	if(--cbc <= 0)\
18 		cflush(); }
19 
20 #define	LIBNAMELEN	300
21 
22 typedef	struct	Adr	Adr;
23 typedef	struct	Prog	Prog;
24 typedef	struct	Sym	Sym;
25 typedef	struct	Auto	Auto;
26 typedef	struct	Optab	Optab;
27 
28 struct	Adr
29 {
30 	union
31 	{
32 		long	u0offset;
33 		char	u0scon[8];
34 		Prog	*u0cond;	/* not used, but should be D_BRANCH */
35 		Ieee	u0ieee;
36 	} u0;
37 	union
38 	{
39 		Auto*	u1autom;
40 		Sym*	u1sym;
41 	} u1;
42 	short	type;
43 	uchar	index;
44 	char	scale;
45 };
46 
47 #define	offset	u0.u0offset
48 #define	scon	u0.u0scon
49 #define	cond	u0.u0cond
50 #define	ieee	u0.u0ieee
51 
52 #define	autom	u1.u1autom
53 #define	sym	u1.u1sym
54 
55 struct	Prog
56 {
57 	Adr	from;
58 	Adr	to;
59 	Prog	*forwd;
60 	Prog*	link;
61 	Prog*	pcond;	/* work on this */
62 	long	pc;
63 	long	line;
64 	short	as;
65 	char	width;		/* fake for DATA */
66 	char	ft;		/* oclass cache */
67 	char	tt;
68 	uchar	mark;	/* work on these */
69 	uchar	back;
70 };
71 struct	Auto
72 {
73 	Sym*	asym;
74 	Auto*	link;
75 	long	aoffset;
76 	short	type;
77 };
78 struct	Sym
79 {
80 	char	*name;
81 	short	type;
82 	short	version;
83 	short	become;
84 	short	frame;
85 	uchar	subtype;
86 	ushort	file;
87 	long	value;
88 	long	sig;
89 	Sym*	link;
90 };
91 struct	Optab
92 {
93 	short	as;
94 	uchar*	ytab;
95 	uchar	prefix;
96 	uchar	op[10];
97 };
98 
99 enum
100 {
101 	STEXT		= 1,
102 	SDATA,
103 	SBSS,
104 	SDATA1,
105 	SXREF,
106 	SFILE,
107 	SCONST,
108 	SUNDEF,
109 
110 	SIMPORT,
111 	SEXPORT,
112 
113 	NHASH		= 10007,
114 	NHUNK		= 100000,
115 	MINSIZ		= 4,
116 	STRINGSZ	= 200,
117 	MINLC		= 1,
118 	MAXIO		= 8192,
119 	MAXHIST		= 20,				/* limit of path elements for history symbols */
120 
121 	Yxxx		= 0,
122 	Ynone,
123 	Yi0,
124 	Yi1,
125 	Yi8,
126 	Yi32,
127 	Yiauto,
128 	Yal,
129 	Ycl,
130 	Yax,
131 	Ycx,
132 	Yrb,
133 	Yrl,
134 	Yrf,
135 	Yf0,
136 	Yrx,
137 	Ymb,
138 	Yml,
139 	Ym,
140 	Ybr,
141 	Ycol,
142 
143 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
144 	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
145 	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,
146 	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
147 	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,
148 	Ymax,
149 
150 	Zxxx		= 0,
151 
152 	Zlit,
153 	Z_rp,
154 	Zbr,
155 	Zcall,
156 	Zib_,
157 	Zib_rp,
158 	Zibo_m,
159 	Zil_,
160 	Zil_rp,
161 	Zilo_m,
162 	Zjmp,
163 	Zloop,
164 	Zm_o,
165 	Zm_r,
166 	Zaut_r,
167 	Zo_m,
168 	Zpseudo,
169 	Zr_m,
170 	Zrp_,
171 	Z_ib,
172 	Z_il,
173 	Zm_ibo,
174 	Zm_ilo,
175 	Zib_rr,
176 	Zil_rr,
177 	Zclr,
178 	Zbyte,
179 	Zmov,
180 	Zmax,
181 
182 	Px		= 0,
183 	Pe		= 0x66,	/* operand escape */
184 	Pm		= 0x0f,	/* 2byte opcode escape */
185 	Pq		= 0xff,	/* both escape */
186 	Pb		= 0xfe,	/* byte operands */
187 
188 	Roffset	= 22,		/* no. bits for offset in relocation address */
189 	Rindex	= 10,		/* no. bits for index in relocation address */
190 };
191 
192 EXTERN union
193 {
194 	struct
195 	{
196 		char	obuf[MAXIO];			/* output buffer */
197 		uchar	ibuf[MAXIO];			/* input buffer */
198 	} u;
199 	char	dbuf[1];
200 } buf;
201 
202 #define	cbuf	u.obuf
203 #define	xbuf	u.ibuf
204 
205 #pragma	varargck	type	"A"	int
206 #pragma	varargck	type	"A"	uint
207 #pragma	varargck	type	"D"	Adr*
208 #pragma	varargck	type	"P"	Prog*
209 #pragma	varargck	type	"R"	int
210 #pragma	varargck	type	"R"	uint
211 #pragma	varargck	type	"S"	char*
212 
213 #pragma	varargck	argpos	diag 1
214 
215 EXTERN	long	HEADR;
216 EXTERN	long	HEADTYPE;
217 EXTERN	long	INITDAT;
218 EXTERN	long	INITRND;
219 EXTERN	long	INITTEXT;
220 EXTERN	long	INITTEXTP;
221 EXTERN	char*	INITENTRY;		/* entry point */
222 EXTERN	Biobuf	bso;
223 EXTERN	long	bsssize;
224 EXTERN	long	casepc;
225 EXTERN	int	cbc;
226 EXTERN	char*	cbp;
227 EXTERN	char*	pcstr;
228 EXTERN	int	cout;
229 EXTERN	Auto*	curauto;
230 EXTERN	Auto*	curhist;
231 EXTERN	Prog*	curp;
232 EXTERN	Prog*	curtext;
233 EXTERN	Prog*	datap;
234 EXTERN	Prog*	edatap;
235 EXTERN	long	datsize;
236 EXTERN	char	debug[128];
237 EXTERN	char	literal[32];
238 EXTERN	Prog*	etextp;
239 EXTERN	Prog*	firstp;
240 EXTERN	char	fnuxi8[8];
241 EXTERN	char	fnuxi4[4];
242 EXTERN	Sym*	hash[NHASH];
243 EXTERN	Sym*	histfrog[MAXHIST];
244 EXTERN	int	histfrogp;
245 EXTERN	int	histgen;
246 EXTERN	char*	library[50];
247 EXTERN	char*	libraryobj[50];
248 EXTERN	int	libraryp;
249 EXTERN	int	xrefresolv;
250 EXTERN	char*	hunk;
251 EXTERN	char	inuxi1[1];
252 EXTERN	char	inuxi2[2];
253 EXTERN	char	inuxi4[4];
254 EXTERN	char	ycover[Ymax*Ymax];
255 EXTERN	uchar*	andptr;
256 EXTERN	uchar	and[30];
257 EXTERN	char	reg[D_NONE];
258 EXTERN	Prog*	lastp;
259 EXTERN	long	lcsize;
260 EXTERN	int	nerrors;
261 EXTERN	long	nhunk;
262 EXTERN	long	nsymbol;
263 EXTERN	char*	noname;
264 EXTERN	char*	outfile;
265 EXTERN	long	pc;
266 EXTERN	long	spsize;
267 EXTERN	Sym*	symlist;
268 EXTERN	long	symsize;
269 EXTERN	Prog*	textp;
270 EXTERN	long	textsize;
271 EXTERN	long	thunk;
272 EXTERN	int	version;
273 EXTERN	Prog	zprg;
274 EXTERN	int	dtype;
275 
276 EXTERN	Adr*	reloca;
277 EXTERN	int	doexp, dlm;
278 EXTERN	int	imports, nimports;
279 EXTERN	int	exports, nexports, allexport;
280 EXTERN	char*	EXPTAB;
281 EXTERN	Prog	undefp;
282 
283 #define	UP	(&undefp)
284 
285 extern	Optab	optab[];
286 extern	char*	anames[];
287 
288 int	Aconv(Fmt*);
289 int	Dconv(Fmt*);
290 int	Pconv(Fmt*);
291 int	Rconv(Fmt*);
292 int	Sconv(Fmt*);
293 void	addhist(long, int);
294 void	addlibpath(char*);
295 Prog*	appendp(Prog*);
296 void	asmb(void);
297 void	asmdyn(void);
298 void	asmins(Prog*);
299 void	asmlc(void);
300 void	asmsp(void);
301 void	asmsym(void);
302 long	atolwhex(char*);
303 Prog*	brchain(Prog*);
304 Prog*	brloop(Prog*);
305 void	cflush(void);
306 void	ckoff(Sym*, long);
307 Prog*	copyp(Prog*);
308 double	cputime(void);
309 void	datblk(long, long);
310 void	diag(char*, ...);
311 void	dodata(void);
312 void	doinit(void);
313 void	doprof1(void);
314 void	doprof2(void);
315 void	dostkoff(void);
316 void	dynreloc(Sym*, ulong, int);
317 long	entryvalue(void);
318 void	errorexit(void);
319 void	export(void);
320 int	fileexists(char*);
321 int	find1(long, int);
322 int	find2(long, int);
323 char*	findlib(char*);
324 void	follow(void);
325 void	gethunk(void);
326 void	histtoauto(void);
327 double	ieeedtod(Ieee*);
328 long	ieeedtof(Ieee*);
329 void	import(void);
330 void	ldobj(int, long, char*);
331 void	loadlib(void);
332 void	listinit(void);
333 Sym*	lookup(char*, int);
334 void	lput(long);
335 void	lputl(long);
336 void	llput(vlong v);
337 void	llputl(vlong v);
338 void	main(int, char*[]);
339 void	mkfwd(void);
340 void*	mysbrk(ulong);
341 void	nuxiinit(void);
342 void	objfile(char*);
343 int	opsize(Prog*);
344 void	patch(void);
345 Prog*	prg(void);
346 void	readundefs(char*, int);
347 int	relinv(int);
348 long	reuse(Prog*, Sym*);
349 long	rnd(long, long);
350 void	span(void);
351 void	strnput(char*, int);
352 void	undef(void);
353 void	undefsym(Sym*);
354 long	vaddr(Adr*);
355 void	wput(long);
356 void	wputl(long);
357 void	xdefine(char*, int, long);
358 void	xfol(Prog*);
359 int	zaddr(uchar*, Adr*, Sym*[]);
360 void	zerosig(char*);
361 
362 #pragma	varargck	type	"D"	Adr*
363 #pragma	varargck	type	"P"	Prog*
364 #pragma	varargck	type	"R"	int
365 #pragma	varargck	type	"A"	int
366