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	"../qc/q.out.h"
5
#include	"../8l/elf.h"
6
 
7
#ifndef	EXTERN
8
#define	EXTERN	extern
9
#endif
10
 
11
#define	LIBNAMELEN	300
12
 
13
typedef	struct	Adr	Adr;
14
typedef	struct	Sym	Sym;
15
typedef	struct	Autom	Auto;
16
typedef	struct	Prog	Prog;
17
typedef	struct	Optab	Optab;
18
 
19
#define	P		((Prog*)0)
20
#define	S		((Sym*)0)
21
#define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
22
 
23
struct	Adr
24
{
25
	union
26
	{
27
		long	u0offset;
28
		char	u0sval[NSNAME];
29
		Ieee	u0ieee;
30
	}u0;
31
	Sym	*sym;
32
	Auto	*autom;
33
	char	type;
34
	uchar	reg;
35
	char	name;
36
	char	class;
37
};
38
 
39
#define	offset	u0.u0offset
40
#define	sval	u0.u0sval
41
#define	ieee	u0.u0ieee
42
 
43
struct	Prog
44
{
45
	Adr	from;
46
	Adr	from3;	/* fma and rlwm */
47
	Adr	to;
48
	Prog	*forwd;
49
	Prog	*cond;
50
	Prog	*link;
51
	long	pc;
52
	long	regused;
53
	short	line;
54
	short	mark;
55
	short	optab;		/* could be uchar */
56
	ushort	as;
57
	char	reg;
58
};
59
struct	Sym
60
{
61
	char	*name;
62
	short	type;
63
	short	version;
64
	short	become;
65
	short	frame;
66
	uchar	subtype;
67
	ushort	file;
68
	long	value;
69
	long	sig;
70
	Sym	*link;
71
};
72
struct	Autom
73
{
74
	Sym	*sym;
75
	Auto	*link;
76
	long	aoffset;
77
	short	type;
78
};
79
struct	Optab
80
{
81
	ushort	as;
82
	char	a1;
83
	char	a2;
84
	char	a3;
85
	char	a4;
86
	char	type;
87
	char	size;
88
	char	param;
89
};
90
struct
91
{
92
	Optab*	start;
93
	Optab*	stop;
94
} oprange[ALAST];
95
 
96
enum
97
{
98
	FPCHIP		= 1,
99
	BIG		= 32768-8,
100
	STRINGSZ	= 200,
101
	MAXIO		= 8192,
102
	MAXHIST		= 20,				/* limit of path elements for history symbols */
103
	DATBLK		= 1024,
104
	NHASH		= 10007,
105
	NHUNK		= 100000,
106
	MINSIZ		= 64,
107
	NENT		= 100,
108
	NSCHED		= 20,
109
 
110
/* mark flags */
111
	LABEL		= 1<<0,
112
	LEAF		= 1<<1,
113
	FLOAT		= 1<<2,
114
	BRANCH		= 1<<3,
115
	LOAD		= 1<<4,
116
	FCMP		= 1<<5,
117
	SYNC		= 1<<6,
118
	LIST		= 1<<7,
119
	FOLL		= 1<<8,
120
	NOSCHED		= 1<<9,
121
 
122
	STEXT		= 1,
123
	SDATA,
124
	SBSS,
125
	SDATA1,
126
	SXREF,
127
	SLEAF,
128
	SFILE,
129
	SCONST,
130
	SUNDEF,
131
 
132
	SIMPORT,
133
	SEXPORT,
134
 
135
	C_NONE		= 0,
136
	C_REG,
137
	C_FREG,
138
	C_CREG,
139
	C_SPR,		/* special processor register */
140
	C_SREG,		/* segment register (32 bit implementations only) */
141
	C_ZCON,
142
	C_SCON,		/* 16 bit signed */
143
	C_UCON,		/* low 16 bits 0 */
144
	C_ADDCON,	/* -0x8000 <= v < 0 */
145
	C_ANDCON,	/* 0 < v <= 0xFFFF */
146
	C_LCON,		/* other */
147
	C_SACON,
148
	C_SECON,
149
	C_LACON,
150
	C_LECON,
151
	C_SBRA,
152
	C_LBRA,
153
	C_SAUTO,
154
	C_LAUTO,
155
	C_SEXT,
156
	C_LEXT,
157
	C_ZOREG,
158
	C_SOREG,
159
	C_LOREG,
160
	C_FPSCR,
161
	C_MSR,
162
	C_XER,
163
	C_LR,
164
	C_CTR,
165
	C_ANY,
166
	C_GOK,
167
	C_ADDR,
168
 
169
	C_NCLASS,
170
 
171
	Roffset	= 22,		/* no. bits for offset in relocation address */
172
	Rindex	= 10		/* no. bits for index in relocation address */
173
};
174
 
175
EXTERN union
176
{
177
	struct
178
	{
179
		uchar	obuf[MAXIO];			/* output buffer */
180
		uchar	ibuf[MAXIO];			/* input buffer */
181
	} u;
182
	char	dbuf[1];
183
} buf;
184
 
185
#define	cbuf	u.obuf
186
#define	xbuf	u.ibuf
187
 
188
EXTERN	long	HEADR;			/* length of header */
189
EXTERN	int	HEADTYPE;		/* type of header */
190
EXTERN	long	INITDAT;		/* data location */
191
EXTERN	long	INITRND;		/* data round above text location */
192
EXTERN	long	INITTEXT;		/* text location */
193
EXTERN	long	INITTEXTP;		/* text location (physical) */
194
EXTERN	char*	INITENTRY;		/* entry point */
195
EXTERN	long	autosize;
196
EXTERN	Biobuf	bso;
197
EXTERN	long	bsssize;
198
EXTERN	int	cbc;
199
EXTERN	uchar*	cbp;
200
EXTERN	int	cout;
201
EXTERN	Auto*	curauto;
202
EXTERN	Auto*	curhist;
203
EXTERN	Prog*	curp;
204
EXTERN	Prog*	curtext;
205
EXTERN	Prog*	datap;
206
EXTERN	Prog*	prog_movsw;
207
EXTERN	Prog*	prog_movdw;
208
EXTERN	Prog*	prog_movws;
209
EXTERN	Prog*	prog_movwd;
210
EXTERN	long	datsize;
211
EXTERN	char	debug[128];
212
EXTERN	Prog*	firstp;
213
EXTERN	char	fnuxi8[8];
214
EXTERN	Sym*	hash[NHASH];
215
EXTERN	Sym*	histfrog[MAXHIST];
216
EXTERN	int	histfrogp;
217
EXTERN	int	histgen;
218
EXTERN	char*	library[50];
219
EXTERN	char*	libraryobj[50];
220
EXTERN	int	libraryp;
221
EXTERN	int	xrefresolv;
222
EXTERN	char*	hunk;
223
EXTERN	char	inuxi1[1];
224
EXTERN	char	inuxi2[2];
225
EXTERN	char	inuxi4[4];
226
EXTERN	Prog*	lastp;
227
EXTERN	long	lcsize;
228
EXTERN	char	literal[32];
229
EXTERN	int	nerrors;
230
EXTERN	long	nhunk;
231
EXTERN	char*	noname;
232
EXTERN	long	instoffset;
233
EXTERN	char*	outfile;
234
EXTERN	long	pc;
235
EXTERN	int	r0iszero;
236
EXTERN	long	symsize;
237
EXTERN	long	staticgen;
238
EXTERN	Prog*	textp;
239
EXTERN	long	textsize;
240
EXTERN	long	tothunk;
241
EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
242
EXTERN	int	version;
243
EXTERN	Prog	zprg;
244
EXTERN	int	dtype;
245
 
246
EXTERN	int	doexp, dlm;
247
EXTERN	int	imports, nimports;
248
EXTERN	int	exports, nexports;
249
EXTERN	char*	EXPTAB;
250
EXTERN	Prog	undefp;
251
 
252
#define	UP	(&undefp)
253
 
254
extern	Optab	optab[];
255
extern	char*	anames[];
256
extern	char*	cnames[];
257
 
258
int	Aconv(Fmt*);
259
int	Dconv(Fmt*);
260
int	Nconv(Fmt*);
261
int	Pconv(Fmt*);
262
int	Sconv(Fmt*);
263
int	Rconv(Fmt*);
264
int	aclass(Adr*);
265
void	addhist(long, int);
266
void	histtoauto(void);
267
void	addlibpath(char*);
268
void	addnop(Prog*);
269
void	append(Prog*, Prog*);
270
void	asmb(void);
271
void	asmdyn(void);
272
void	asmlc(void);
273
int	asmout(Prog*, Optab*, int);
274
void	asmsym(void);
275
long	atolwhex(char*);
276
Prog*	brloop(Prog*);
277
void	buildop(void);
278
void	cflush(void);
279
void	ckoff(Sym*, long);
280
int	cmp(int, int);
281
void	cput(long);
282
int	compound(Prog*);
283
double	cputime(void);
284
void	datblk(long, long);
285
void	diag(char*, ...);
286
void	dodata(void);
287
void	doprof1(void);
288
void	doprof2(void);
289
void	dynreloc(Sym*, long, int, int, int);
290
long	entryvalue(void);
291
void	errorexit(void);
292
void	exchange(Prog*);
293
void	export(void);
294
int	fileexists(char*);
295
int	find1(long, int);
296
char*	findlib(char*);
297
void	follow(void);
298
void	gethunk(void);
299
double	ieeedtod(Ieee*);
300
long	ieeedtof(Ieee*);
301
void	import(void);
302
int	isnop(Prog*);
303
void	ldobj(int, long, char*);
304
void	loadlib(void);
305
void	listinit(void);
306
void	initmuldiv(void);
307
Sym*	lookup(char*, int);
308
void	llput(vlong);
309
void	llputl(vlong);
310
void	lput(long);
311
void	lputl(long);
312
void	mkfwd(void);
313
void*	mysbrk(ulong);
314
void	names(void);
315
void	nocache(Prog*);
316
void	noops(void);
317
void	nopout(Prog*);
318
void	nuxiinit(void);
319
void	objfile(char*);
320
int	ocmp(void*, void*);
321
long	opcode(int);
322
Optab*	oplook(Prog*);
323
void	patch(void);
324
void	prasm(Prog*);
325
void	prepend(Prog*, Prog*);
326
Prog*	prg(void);
327
int	pseudo(Prog*);
328
void	putsymb(char*, int, long, int);
329
void	readundefs(char*, int);
330
long	regoff(Adr*);
331
int	relinv(int);
332
long	rnd(long, long);
333
void	sched(Prog*, Prog*);
334
void	span(void);
335
void	strnput(char*, int);
336
void	undef(void);
337
void	undefsym(Sym*);
338
void	wput(long);
339
void	wputl(long);
340
void	xdefine(char*, int, long);
341
void	xfol(Prog*);
342
void	zerosig(char*);
343
 
344
#pragma	varargck	type	"A"	int
345
#pragma	varargck	type	"A"	uint
346
#pragma	varargck	type	"D"	Adr*
347
#pragma	varargck	type	"N"	Adr*
348
#pragma	varargck	type	"P"	Prog*
349
#pragma	varargck	type	"R"	int
350
#pragma	varargck	type	"S"	char*
351
 
352
#pragma	varargck	argpos	diag 1