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	"../5c/5.out.h"
5
#include	"../8l/elf.h"
6
 
7
#ifndef	EXTERN
8
#define	EXTERN	extern
9
#endif
10
 
11
#define	LIBNAMELEN	300
12
 
13
void	addlibpath(char*);
14
int	fileexists(char*);
15
char*	findlib(char*);
16
 
17
typedef	struct	Adr	Adr;
18
typedef	struct	Sym	Sym;
19
typedef	struct	Autom	Auto;
20
typedef	struct	Prog	Prog;
21
typedef	struct	Optab	Optab;
22
typedef	struct	Oprang	Oprang;
23
typedef	uchar	Opcross[32][2][32];
24
typedef	struct	Count	Count;
25
 
26
#define	P		((Prog*)0)
27
#define	S		((Sym*)0)
28
#define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
29
 
30
struct	Adr
31
{
32
	union
33
	{
34
		long	u0offset;
35
		char*	u0sval;
36
		Ieee*	u0ieee;
37
	} u0;
38
	union
39
	{
40
		Auto*	u1autom;
41
		Sym*	u1sym;
42
	} u1;
43
	char	type;
44
	char	reg;
45
	char	name;
46
	char	class;
47
};
48
 
49
#define	offset	u0.u0offset
50
#define	sval	u0.u0sval
51
#define	ieee	u0.u0ieee
52
 
53
#define	autom	u1.u1autom
54
#define	sym	u1.u1sym
55
 
56
struct	Prog
57
{
58
	Adr	from;
59
	Adr	to;
60
	union
61
	{
62
		long	u0regused;
63
		Prog*	u0forwd;
64
	} u0;
65
	Prog*	cond;
66
	Prog*	link;
67
	long	pc;
68
	long	line;
69
	uchar	mark;
70
	uchar	optab;
71
	uchar	as;
72
	uchar	scond;
73
	uchar	reg;
74
};
75
#define	regused	u0.u0regused
76
#define	forwd	u0.u0forwd
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
	long	value;
88
	long	sig;
89
	Sym*	link;
90
};
91
 
92
#define SIGNINTERN	(1729*325*1729)
93
 
94
struct	Autom
95
{
96
	Sym*	asym;
97
	Auto*	link;
98
	long	aoffset;
99
	short	type;
100
};
101
struct	Optab
102
{
103
	char	as;
104
	char	a1;
105
	char	a2;
106
	char	a3;
107
	char	type;
108
	char	size;
109
	char	param;
110
	char	flag;
111
};
112
struct	Oprang
113
{
114
	Optab*	start;
115
	Optab*	stop;
116
};
117
struct	Count
118
{
119
	long	count;
120
	long	outof;
121
};
122
 
123
enum
124
{
125
	STEXT		= 1,
126
	SDATA,
127
	SBSS,
128
	SDATA1,
129
	SXREF,
130
	SLEAF,
131
	SFILE,
132
	SCONST,
133
	SSTRING,
134
	SUNDEF,
135
 
136
	SIMPORT,
137
	SEXPORT,
138
 
139
	LFROM		= 1<<0,
140
	LTO		= 1<<1,
141
	LPOOL		= 1<<2,
142
	V4		= 1<<3,	/* arm v4 arch */
143
	VFP		= 1<<4,	/* arm vfpv3 floating point */
144
 
145
	C_NONE		= 0,
146
	C_REG,
147
	C_REGREG,
148
	C_SHIFT,
149
	C_FREG,
150
	C_PSR,
151
	C_FCR,
152
 
153
	C_RCON,		/* 0xff rotated */
154
	C_NCON,		/* ~RCON */
155
	C_SCON,		/* 0xffff */
156
	C_LCON,
157
	C_FCON,
158
 
159
	C_RACON,
160
	C_LACON,
161
 
162
	C_RECON,
163
	C_LECON,
164
 
165
	C_SBRA,
166
	C_LBRA,
167
 
168
	C_HAUTO,	/* halfword insn offset (-0xff to 0xff) */
169
	C_FAUTO,	/* float insn offset (0 to 0x3fc, word aligned) */
170
	C_HFAUTO,	/* both H and F */
171
	C_SAUTO,	/* -0xfff to 0xfff */
172
	C_LAUTO,
173
 
174
	C_HEXT,
175
	C_FEXT,
176
	C_HFEXT,
177
	C_SEXT,
178
	C_LEXT,
179
 
180
	C_HOREG,
181
	C_FOREG,
182
	C_HFOREG,
183
	C_SOREG,
184
	C_ROREG,
185
	C_SROREG,	/* both S and R */
186
	C_LOREG,
187
 
188
	C_ADDR,		/* relocatable address */
189
 
190
	C_GOK,
191
 
192
/* mark flags */
193
	FOLL		= 1<<0,
194
	LABEL		= 1<<1,
195
	LEAF		= 1<<2,
196
 
197
	BIG		= (1<<12)-4,
198
	STRINGSZ	= 200,
199
	NHASH		= 10007,
200
	NHUNK		= 100000,
201
	MINSIZ		= 64,
202
	NENT		= 100,
203
	MAXIO		= 8192,
204
	MAXHIST		= 20,	/* limit of path elements for history symbols */
205
 
206
	Roffset	= 22,		/* no. bits for offset in relocation address */
207
	Rindex	= 10,		/* no. bits for index in relocation address */
208
};
209
 
210
EXTERN union
211
{
212
	struct
213
	{
214
		uchar	obuf[MAXIO];			/* output buffer */
215
		uchar	ibuf[MAXIO];			/* input buffer */
216
	} u;
217
	char	dbuf[1];
218
} buf;
219
 
220
#define	cbuf	u.obuf
221
#define	xbuf	u.ibuf
222
 
223
EXTERN	long	HEADR;			/* length of header */
224
EXTERN	int	HEADTYPE;		/* type of header */
225
EXTERN	long	INITDAT;		/* data location */
226
EXTERN	long	INITRND;		/* data round above text location */
227
EXTERN	long	INITTEXT;		/* text location */
228
EXTERN	long	INITTEXTP;		/* text location (physical) */
229
EXTERN	char*	INITENTRY;		/* entry point */
230
EXTERN	long	autosize;
231
EXTERN	Biobuf	bso;
232
EXTERN	long	bsssize;
233
EXTERN	int	cbc;
234
EXTERN	uchar*	cbp;
235
EXTERN	int	cout;
236
EXTERN	Auto*	curauto;
237
EXTERN	Auto*	curhist;
238
EXTERN	Prog*	curp;
239
EXTERN	Prog*	curtext;
240
EXTERN	Prog*	datap;
241
EXTERN	long	datsize;
242
EXTERN	char	debug[128];
243
EXTERN	Prog*	etextp;
244
EXTERN	Prog*	firstp;
245
EXTERN	char	fnuxi4[4];
246
EXTERN	char	fnuxi8[8];
247
EXTERN	char*	noname;
248
EXTERN	Sym*	hash[NHASH];
249
EXTERN	Sym*	histfrog[MAXHIST];
250
EXTERN	int	histfrogp;
251
EXTERN	int	histgen;
252
EXTERN	char*	library[50];
253
EXTERN	char*	libraryobj[50];
254
EXTERN	int	libraryp;
255
EXTERN	int	xrefresolv;
256
EXTERN	char*	hunk;
257
EXTERN	char	inuxi1[1];
258
EXTERN	char	inuxi2[2];
259
EXTERN	char	inuxi4[4];
260
EXTERN	Prog*	lastp;
261
EXTERN	long	lcsize;
262
EXTERN	char	literal[32];
263
EXTERN	int	nerrors;
264
EXTERN	long	nhunk;
265
EXTERN	long	instoffset;
266
EXTERN	Opcross	opcross[8];
267
EXTERN	Oprang	oprange[ALAST];
268
EXTERN	char*	outfile;
269
EXTERN	long	pc;
270
EXTERN	uchar	repop[ALAST];
271
EXTERN	long	symsize;
272
EXTERN	Prog*	textp;
273
EXTERN	long	textsize;
274
EXTERN	long	thunk;
275
EXTERN	int	version;
276
EXTERN	char	xcmp[C_GOK+1][C_GOK+1];
277
EXTERN	Prog	zprg;
278
EXTERN	int	dtype;
279
EXTERN	int	armv4;
280
EXTERN	int vfp;
281
 
282
EXTERN	int	doexp, dlm;
283
EXTERN	int	imports, nimports;
284
EXTERN	int	exports, nexports;
285
EXTERN	char*	EXPTAB;
286
EXTERN	Prog	undefp;
287
 
288
#define	UP	(&undefp)
289
 
290
extern	char*	anames[];
291
extern	Optab	optab[];
292
 
293
void	addpool(Prog*, Adr*);
294
EXTERN	Prog*	blitrl;
295
EXTERN	Prog*	elitrl;
296
 
297
void	initdiv(void);
298
EXTERN	Prog*	prog_div;
299
EXTERN	Prog*	prog_divu;
300
EXTERN	Prog*	prog_mod;
301
EXTERN	Prog*	prog_modu;
302
 
303
#pragma	varargck	type	"A"	int
304
#pragma	varargck	type	"A"	uint
305
#pragma	varargck	type	"C"	int
306
#pragma	varargck	type	"D"	Adr*
307
#pragma	varargck	type	"N"	Adr*
308
#pragma	varargck	type	"P"	Prog*
309
#pragma	varargck	type	"S"	char*
310
 
311
#pragma	varargck	argpos	diag 1
312
 
313
int	Aconv(Fmt*);
314
int	Cconv(Fmt*);
315
int	Dconv(Fmt*);
316
int	Nconv(Fmt*);
317
int	Pconv(Fmt*);
318
int	Sconv(Fmt*);
319
int	aclass(Adr*);
320
void	addhist(long, int);
321
void	addlibpath(char*);
322
void	append(Prog*, Prog*);
323
void	asmb(void);
324
void	asmdyn(void);
325
void	asmlc(void);
326
void	asmout(Prog*, Optab*);
327
void	asmsym(void);
328
long	atolwhex(char*);
329
Prog*	brloop(Prog*);
330
void	buildop(void);
331
void	buildrep(int, int);
332
void	cflush(void);
333
void	ckoff(Sym*, long);
334
int	chipfloat(Ieee*);
335
int	cmp(int, int);
336
int	compound(Prog*);
337
double	cputime(void);
338
void	datblk(long, long, int);
339
void	diag(char*, ...);
340
void	divsig(void);
341
void	dodata(void);
342
void	doprof1(void);
343
void	doprof2(void);
344
void	dynreloc(Sym*, long, int);
345
long	entryvalue(void);
346
void	errorexit(void);
347
void	exchange(Prog*);
348
void	export(void);
349
int	fileexists(char*);
350
int	find1(long, int);
351
char*	findlib(char*);
352
void	follow(void);
353
void	gethunk(void);
354
void	histtoauto(void);
355
double	ieeedtod(Ieee*);
356
long	ieeedtof(Ieee*);
357
void	import(void);
358
int	isnop(Prog*);
359
void	ldobj(int, long, char*);
360
void	loadlib(void);
361
void	listinit(void);
362
Sym*	lookup(char*, int);
363
void	cput(int);
364
void	llput(vlong);
365
void	llputl(vlong);
366
void	lput(long);
367
void	lputl(long);
368
void	mkfwd(void);
369
void*	mysbrk(ulong);
370
void	names(void);
371
void	nocache(Prog*);
372
void	nuxiinit(void);
373
void	objfile(char*);
374
int	ocmp(const void*, const void*);
375
long	opirr(int);
376
Optab*	oplook(Prog*);
377
long	oprrr(int, int);
378
long	opvfprrr(int, int);
379
long	olr(long, int, int, int);
380
long	olhr(long, int, int, int);
381
long	olrr(int, int, int, int);
382
long	olhrr(int, int, int, int);
383
long	osr(int, int, long, int, int);
384
long	oshr(int, long, int, int);
385
long	ofsr(int, int, long, int, int, Prog*);
386
long	osrr(int, int, int, int);
387
long	oshrr(int, int, int, int);
388
long	omvl(Prog*, Adr*, int);
389
void	patch(void);
390
void	prasm(Prog*);
391
void	prepend(Prog*, Prog*);
392
Prog*	prg(void);
393
int	pseudo(Prog*);
394
void	putsymb(char*, int, long, int);
395
void	readundefs(char*, int);
396
long	regoff(Adr*);
397
int	relinv(int);
398
long	rnd(long, long);
399
void	span(void);
400
void	strnput(char*, int);
401
void	undef(void);
402
void	undefsym(Sym*);
403
void	wput(long);
404
void	wputl(long);
405
void	xdefine(char*, int, long);
406
void	xfol(Prog*);
407
void	zerosig(char*);
408
void	noops(void);
409
long	immrot(ulong);
410
long	immaddr(long);
411
long	opbra(int, int);