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