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