xref: /inferno-os/utils/vl/l.h (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
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