xref: /plan9-contrib/sys/src/cmd/6l/l.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include	<u.h>
2 #include	<libc.h>
3 #include	<bio.h>
4 #include	"../6c/6.out.h"
5 
6 #define	P		((Prog*)0)
7 #define	S		((Sym*)0)
8 #define	TNAME		(curtext?curtext->from.sym->name:noname)
9 #define	CPUT(c)\
10 	{ *cbp++ = c;\
11 	if(--cbc <= 0)\
12 		cflush(); }
13 
14 typedef	struct	Adr	Adr;
15 typedef	struct	Prog	Prog;
16 typedef	struct	Sym	Sym;
17 typedef	struct	Auto	Auto;
18 typedef	struct	Optab	Optab;
19 
20 struct	Adr
21 {
22 	union
23 	{
24 		long	offset;
25 		char	scon[8];
26 		Prog	*cond;	/* not used, but should be D_BRANCH */
27 		Ieee	ieee;
28 	};
29 	union
30 	{
31 		Auto*	autom;
32 		Sym*	sym;
33 	};
34 	short	type;
35 	char	index;
36 	char	scale;
37 };
38 
39 struct	Prog
40 {
41 	Adr	from;
42 	Adr	to;
43 	Prog	*forwd;
44 	Prog*	link;
45 	Prog*	cond;	/* work on this */
46 	long	pc;
47 	long	line;
48 	uchar	mark;	/* work on these */
49 	uchar	back;
50 	uchar	as;
51 
52 	char	width;		/* fake for DATA */
53 	uchar	type;
54 	uchar	offset;
55 };
56 struct	Auto
57 {
58 	Sym*	sym;
59 	Auto*	link;
60 	long	offset;
61 	short	type;
62 };
63 struct	Sym
64 {
65 	char	*name;
66 	short	type;
67 	short	version;
68 	short	become;
69 	short	frame;
70 	long	value;
71 	Sym*	link;
72 };
73 struct	Optab
74 {
75 	uchar	as;
76 	uchar*	ytab;
77 	ushort	op[3];
78 };
79 
80 enum
81 {
82 	STEXT		= 1,
83 	SDATA,
84 	SBSS,
85 	SDATA1,
86 	SXREF,
87 	SLEAF,
88 	SFILE,
89 
90 	NHASH		= 10007,
91 	NHUNK		= 100000,
92 	MINSIZ		= 4,
93 	STRINGSZ	= 200,
94 	MAXIO		= 8192,
95 	MAXHIST		= 20,				/* limit of path elements for history symbols */
96 	MINLC		= 4,
97 
98 /* mark flags */
99 	LABEL		= 1<<0,
100 	LEAF		= 1<<1,
101 	ACTIVE1		= 1<<2,
102 	ACTIVE2		= 1<<3,
103 	BRANCH		= 1<<4,
104 	LOAD		= 1<<5,
105 	COMPARE		= 1<<6,
106 	MFROM		= 1<<7,
107 	LIST		= 1<<8,
108 	FOLL		= 1<<9,
109 
110 	Yxxx		= 0,
111 	Ynone,
112 	Yr,
113 	Ym,
114 	Yi5,
115 	Yi32,
116 	Ybr,
117 	Ycol,
118 	Yri5,
119 	Ynri5,
120 	Ymax,
121 
122 	Zxxx		= 0,
123 	Zpseudo,
124 	Zbr,
125 	Zrxr,
126 	Zrrx,
127 	Zirx,
128 	Zrrr,
129 	Zirr,
130 	Zir,
131 	Zmbr,
132 	Zrm,
133 	Zmr,
134 	Zim,
135 	Zlong,
136 	Znone,
137 	Zmax,
138 
139 	Anooffset	= 1<<0,
140 	Abigoffset	= 1<<1,
141 	Aindex		= 1<<2,
142 	Abase		= 1<<3,
143 };
144 union
145 {
146 	struct
147 	{
148 		char	cbuf[MAXIO];			/* output buffer */
149 		uchar	xbuf[MAXIO];			/* input buffer */
150 	};
151 	char	dbuf[1];
152 } buf;
153 
154 long	HEADR;
155 long	HEADTYPE;
156 long	INITDAT;
157 long	INITRND;
158 long	INITTEXT;
159 char*	INITENTRY;		/* entry point */
160 long	autosize;
161 Biobuf	bso;
162 long	bsssize;
163 long	casepc;
164 int	cbc;
165 char*	cbp;
166 char*	pcstr;
167 int	cout;
168 Auto*	curauto;
169 Auto*	curhist;
170 Prog*	curp;
171 Prog*	curtext;
172 Prog*	datap;
173 Prog*	edatap;
174 long	datsize;
175 char	debug[128];
176 char	literal[32];
177 Prog*	etextp;
178 Prog*	firstp;
179 char	fnuxi8[8];
180 char	fnuxi4[4];
181 Sym*	hash[NHASH];
182 Sym*	histfrog[MAXHIST];
183 int	histfrogp;
184 int	histgen;
185 char*	library[50];
186 int	libraryp;
187 char*	hunk;
188 char	inuxi1[1];
189 char	inuxi2[2];
190 char	inuxi4[4];
191 char	ycover[Ymax*Ymax];
192 ulong*	andptr;
193 ulong	and[4];
194 Prog*	lastp;
195 long	lcsize;
196 int	maxop;
197 int	nerrors;
198 long	nhunk;
199 long	nsymbol;
200 char*	noname;
201 char*	outfile;
202 long	pc;
203 int	printcol;
204 Sym*	symlist;
205 Sym*	symSB;
206 long	symsize;
207 Prog*	textp;
208 long	textsize;
209 long	thunk;
210 int	version;
211 Prog	zprg;
212 
213 extern	Optab	optab[];
214 extern	char*	anames[];
215 
216 int	Aconv(void*, Fconv*);
217 int	Dconv(void*, Fconv*);
218 int	Pconv(void*, Fconv*);
219 int	Rconv(void*, Fconv*);
220 int	Sconv(void*, Fconv*);
221 int	Xconv(void*, Fconv*);
222 void	addhist(long, int);
223 Prog*	appendp(Prog*);
224 void	asmb(void);
225 void	asmins(Prog*);
226 void	asmlc(void);
227 void	asmsym(void);
228 int	atoi(char*);
229 long	atolwhex(char*);
230 Prog*	brchain(Prog*);
231 Prog*	brloop(Prog*);
232 void	cflush(void);
233 Prog*	copyp(Prog*);
234 double	cputime(void);
235 void	datblk(long, long);
236 void	diag(char*, ...);
237 void	dodata(void);
238 void	doinit(void);
239 void	doprof1(void);
240 void	doprof2(void);
241 void	noops(void);
242 long	entryvalue(void);
243 void	errorexit(void);
244 int	find1(long, int);
245 int	find2(long, int);
246 void	follow(void);
247 void	gethunk(void);
248 void	histtoauto(void);
249 double	ieeedtod(Ieee*);
250 long	ieeedtof(Ieee*);
251 void	ldobj(int, long, char*);
252 void	loadlib(int, int);
253 void	listinit(void);
254 Sym*	lookup(char*, int);
255 void	lput(long);
256 void	lputl(long);
257 void	main(int, char*[]);
258 void	mkfwd(void);
259 void	nuxiinit(void);
260 void	objfile(char*);
261 int	opsize(Prog*);
262 void	patch(void);
263 Prog*	prg(void);
264 int	relinv(int);
265 long	reuse(Prog*, Sym*);
266 long	rnd(long, long);
267 void	s8put(char*);
268 void	span(void);
269 void	undef(void);
270 void	xdefine(char*, int, long);
271 void	xfol(Prog*);
272 int	zaddr(uchar*, Adr*, Sym*[]);
273