Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include	<u.h>
2
#include	<libc.h>
3
#include	<bio.h>
4
#include	"../6c/6.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
#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
typedef	struct	Movtab	Movtab;
27
 
28
struct	Adr
29
{
30
	union
31
	{
32
		vlong	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
	char	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
	vlong	pc;
63
	long	line;
64
	uchar	mark;	/* work on these */
65
	uchar	back;
66
 
67
	short	as;
68
	char	width;		/* fake for DATA */
69
	char	mode;	/* 16, 32, or 64 */
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
	vlong	value;
88
	long	sig;
89
	Sym*	link;
90
};
91
struct	Optab
92
{
93
	short	as;
94
	uchar*	ytab;
95
	uchar	prefix;
96
	uchar	op[20];
97
};
98
struct	Movtab
99
{
100
	short	as;
101
	uchar	ft;
102
	uchar	tt;
103
	uchar	code;
104
	uchar	op[4];
105
};
106
 
107
enum
108
{
109
	STEXT		= 1,
110
	SDATA,
111
	SBSS,
112
	SDATA1,
113
	SXREF,
114
	SFILE,
115
	SCONST,
116
	SUNDEF,
117
 
118
	SIMPORT,
119
	SEXPORT,
120
 
121
	NHASH		= 10007,
122
	NHUNK		= 100000,
123
	MINSIZ		= 8,
124
	STRINGSZ	= 200,
125
	MINLC		= 1,
126
	MAXIO		= 8192,
127
	MAXHIST		= 20,				/* limit of path elements for history symbols */
128
 
129
	Yxxx		= 0,
130
	Ynone,
131
	Yi0,
132
	Yi1,
133
	Yi8,
134
	Ys32,
135
	Yi32,
136
	Yi64,
137
	Yiauto,
138
	Yal,
139
	Ycl,
140
	Yax,
141
	Ycx,
142
	Yrb,
143
	Yrl,
144
	Yrf,
145
	Yf0,
146
	Yrx,
147
	Ymb,
148
	Yml,
149
	Ym,
150
	Ybr,
151
	Ycol,
152
 
153
	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
154
	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
155
	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,	Ycr8,
156
	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
157
	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,	Yrl32,	Yrl64,
158
	Ymr, Ymm,
159
	Yxr, Yxm,
160
	Ymax,
161
 
162
	Zxxx		= 0,
163
 
164
	Zlit,
165
	Z_rp,
166
	Zbr,
167
	Zcall,
168
	Zib_,
169
	Zib_rp,
170
	Zibo_m,
171
	Zibo_m_xm,
172
	Zil_,
173
	Zil_rp,
174
	Ziq_rp,
175
	Zilo_m,
176
	Ziqo_m,
177
	Zjmp,
178
	Zloop,
179
	Zo_iw,
180
	Zm_o,
181
	Zm_r,
182
	Zm_r_xm,
183
	Zm_r_i_xm,
184
	Zm_r_3d,
185
	Zm_r_xm_nr,
186
	Zr_m_xm_nr,
187
	Zibm_r,	/* mmx1,mmx2/mem64,imm8 */
188
	Zmb_r,
189
	Zaut_r,
190
	Zo_m,
191
	Zo_m64,
192
	Zpseudo,
193
	Zr_m,
194
	Zr_m_xm,
195
	Zr_m_i_xm,
196
	Zrp_,
197
	Z_ib,
198
	Z_il,
199
	Zm_ibo,
200
	Zm_ilo,
201
	Zib_rr,
202
	Zil_rr,
203
	Zclr,
204
	Zbyte,
205
	Zmax,
206
 
207
	Px		= 0,
208
	P32		= 0x32,	/* 32-bit only */
209
	Pe		= 0x66,	/* operand escape */
210
	Pm		= 0x0f,	/* 2byte opcode escape */
211
	Pq		= 0xff,	/* both escape */
212
	Pb		= 0xfe,	/* byte operands */
213
	Pf2		= 0xf2,	/* xmm escape 1 */
214
	Pf3		= 0xf3,	/* xmm escape 2 */
215
	Pw		= 0x48,	/* Rex.w */
216
	Py		= 0x80,	/* defaults to 64-bit mode */
217
 
218
	Rxf		= 1<<9,	/* internal flag for Rxr on from */
219
	Rxt		= 1<<8,	/* internal flag for Rxr on to */
220
	Rxw		= 1<<3,	/* =1, 64-bit operand size */
221
	Rxr		= 1<<2,	/* extend modrm reg */
222
	Rxx		= 1<<1,	/* extend sib index */
223
	Rxb		= 1<<0,	/* extend modrm r/m, sib base, or opcode reg */
224
 
225
	Roffset	= 22,		/* no. bits for offset in relocation address */
226
	Rindex	= 10,		/* no. bits for index in relocation address */
227
};
228
 
229
EXTERN union
230
{
231
	struct
232
	{
233
		char	obuf[MAXIO];			/* output buffer */
234
		uchar	ibuf[MAXIO];			/* input buffer */
235
	} u;
236
	char	dbuf[1];
237
} buf;
238
 
239
#define	cbuf	u.obuf
240
#define	xbuf	u.ibuf
241
 
242
#pragma	varargck	type	"A"	int
243
#pragma	varargck	type	"A"	uint
244
#pragma	varargck	type	"D"	Adr*
245
#pragma	varargck	type	"P"	Prog*
246
#pragma	varargck	type	"R"	int
247
#pragma	varargck	type	"S"	char*
248
 
249
#pragma	varargck	argpos	diag 1
250
 
251
EXTERN	long	HEADR;
252
EXTERN	long	HEADTYPE;
253
EXTERN	vlong	INITDAT;
254
EXTERN	long	INITRND;
255
EXTERN	vlong	INITTEXT;
256
EXTERN	vlong	INITTEXTP;
257
EXTERN	char*	INITENTRY;		/* entry point */
258
EXTERN	Biobuf	bso;
259
EXTERN	long	bsssize;
260
EXTERN	int	cbc;
261
EXTERN	char*	cbp;
262
EXTERN	char*	pcstr;
263
EXTERN	int	cout;
264
EXTERN	Auto*	curauto;
265
EXTERN	Auto*	curhist;
266
EXTERN	Prog*	curp;
267
EXTERN	Prog*	curtext;
268
EXTERN	Prog*	datap;
269
EXTERN	Prog*	edatap;
270
EXTERN	vlong	datsize;
271
EXTERN	char	debug[128];
272
EXTERN	char	literal[32];
273
EXTERN	Prog*	etextp;
274
EXTERN	Prog*	firstp;
275
EXTERN	uchar	fnuxi8[8];
276
EXTERN	uchar	fnuxi4[4];
277
EXTERN	Sym*	hash[NHASH];
278
EXTERN	Sym*	histfrog[MAXHIST];
279
EXTERN	int	histfrogp;
280
EXTERN	int	histgen;
281
EXTERN	char*	library[50];
282
EXTERN	char*	libraryobj[50];
283
EXTERN	int	libraryp;
284
EXTERN	int	xrefresolv;
285
EXTERN	char*	hunk;
286
EXTERN	uchar	inuxi1[1];
287
EXTERN	uchar	inuxi2[2];
288
EXTERN	uchar	inuxi4[4];
289
EXTERN	uchar	inuxi8[8];
290
EXTERN	char	ycover[Ymax*Ymax];
291
EXTERN	uchar*	andptr;
292
EXTERN	uchar*	rexptr;
293
EXTERN	uchar	and[30];
294
EXTERN	int	reg[D_NONE];
295
EXTERN	int	regrex[D_NONE+1];
296
EXTERN	Prog*	lastp;
297
EXTERN	long	lcsize;
298
EXTERN	int	nerrors;
299
EXTERN	long	nhunk;
300
EXTERN	long	nsymbol;
301
EXTERN	char*	noname;
302
EXTERN	char*	outfile;
303
EXTERN	vlong	pc;
304
EXTERN	long	spsize;
305
EXTERN	Sym*	symlist;
306
EXTERN	long	symsize;
307
EXTERN	Prog*	textp;
308
EXTERN	vlong	textsize;
309
EXTERN	long	thunk;
310
EXTERN	int	version;
311
EXTERN	Prog	zprg;
312
EXTERN	int	dtype;
313
EXTERN	char*	paramspace;
314
 
315
EXTERN	Adr*	reloca;
316
EXTERN	int	doexp, dlm;
317
EXTERN	int	imports, nimports;
318
EXTERN	int	exports, nexports;
319
EXTERN	char*	EXPTAB;
320
EXTERN	Prog	undefp;
321
 
322
#define	UP	(&undefp)
323
 
324
extern	Optab	optab[];
325
extern	Optab*	opindex[];
326
extern	char*	anames[];
327
 
328
int	Aconv(Fmt*);
329
int	Dconv(Fmt*);
330
int	Pconv(Fmt*);
331
int	Rconv(Fmt*);
332
int	Sconv(Fmt*);
333
void	addhist(long, int);
334
void	addlibpath(char*);
335
Prog*	appendp(Prog*);
336
void	asmb(void);
337
void	asmdyn(void);
338
void	asmins(Prog*);
339
void	asmlc(void);
340
void	asmsp(void);
341
void	asmsym(void);
342
vlong	atolwhex(char*);
343
Prog*	brchain(Prog*);
344
Prog*	brloop(Prog*);
345
void	buildop(void);
346
void	cflush(void);
347
void	ckoff(Sym*, long);
348
Prog*	copyp(Prog*);
349
double	cputime(void);
350
void	datblk(long, long);
351
void	diag(char*, ...);
352
void	dodata(void);
353
void	doinit(void);
354
void	doprof1(void);
355
void	doprof2(void);
356
void	dostkoff(void);
357
void	dynreloc(Sym*, ulong, int);
358
vlong	entryvalue(void);
359
void	errorexit(void);
360
void	export(void);
361
int	fileexists(char*);
362
int	find1(long, int);
363
int	find2(long, int);
364
char*	findlib(char*);
365
void	follow(void);
366
void	gethunk(void);
367
void	histtoauto(void);
368
double	ieeedtod(Ieee*);
369
long	ieeedtof(Ieee*);
370
void	import(void);
371
void	ldobj(int, long, char*);
372
void	loadlib(void);
373
void	listinit(void);
374
Sym*	lookup(char*, int);
375
void	llput(vlong v);
376
void	llputl(vlong v);
377
void	lput(long);
378
void	lputl(long);
379
void	main(int, char*[]);
380
void	mkfwd(void);
381
void*	mysbrk(ulong);
382
void	nuxiinit(void);
383
void	objfile(char*);
384
int	opsize(Prog*);
385
void	patch(void);
386
Prog*	prg(void);
387
void	readundefs(char*, int);
388
int	relinv(int);
389
long	reuse(Prog*, Sym*);
390
vlong	rnd(vlong, vlong);
391
void	span(void);
392
void	strnput(char*, int);
393
void	undef(void);
394
void	undefsym(Sym*);
395
vlong	vaddr(Adr*);
396
void	wput(long);
397
void	wputl(long);
398
void	xdefine(char*, int, vlong);
399
void	xfol(Prog*);
400
int	zaddr(uchar*, Adr*, Sym*[]);
401
void	zerosig(char*);