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	"../kc/k.out.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
 
18
#define	P		((Prog*)0)
19
#define	S		((Sym*)0)
20
#define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
21
 
22
struct	Adr
23
{
24
	union
25
	{
26
		long	u0offset;
27
		char	u0sval[NSNAME];
28
		Ieee	u0ieee;
29
	} u0;
30
	union
31
	{
32
		Auto*	u1autom;
33
		Sym*	u1sym;
34
	} u1;
35
	char	type;
36
	char	reg;
37
	char	name;
38
	char	class;
39
};
40
 
41
#define	offset	u0.u0offset
42
#define	sval	u0.u0sval
43
#define	ieee	u0.u0ieee
44
 
45
#define	autom	u1.u1autom
46
#define	sym	u1.u1sym
47
 
48
struct	Prog
49
{
50
	Adr	from;
51
	Adr	to;
52
	Prog	*forwd;
53
	Prog	*cond;
54
	Prog	*link;
55
	long	pc;
56
	long	regused;
57
	short	line;
58
	short	mark;
59
	uchar	optab;
60
	uchar	as;
61
	char	reg;
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	Autom
74
{
75
	Sym	*asym;
76
	Auto	*link;
77
	long	aoffset;
78
	short	type;
79
};
80
struct	Optab
81
{
82
	uchar	as;
83
	char	a1;
84
	char	a2;
85
	char	a3;
86
	char	type;
87
	char	size;
88
	char	param;
89
};
90
EXTERN	struct
91
{
92
	Optab*	start;
93
	Optab*	stop;
94
} oprange[AEND];
95
 
96
enum
97
{
98
	AXLD		= AEND+1,
99
	AXST,
100
	FPCHIP		= 1,
101
	BIG		= 4096-8,
102
	STRINGSZ	= 200,
103
	MAXIO		= 8192,
104
	MAXHIST		= 20,				/* limit of path elements for history symbols */
105
	DATBLK		= 1024,
106
	NHASH		= 10007,
107
	NHUNK		= 100000,
108
	MINSIZ		= 64,
109
	NENT		= 100,
110
	NSCHED		= 20,
111
 
112
/* mark flags */
113
	LABEL		= 1<<0,
114
	LEAF		= 1<<1,
115
	FLOAT		= 1<<2,
116
	BRANCH		= 1<<3,
117
	LOAD		= 1<<4,
118
	FCMP		= 1<<5,
119
	SYNC		= 1<<6,
120
	LIST		= 1<<7,
121
	FOLL		= 1<<8,
122
	NOSCHED		= 1<<9,
123
 
124
	STEXT		= 1,
125
	SDATA,
126
	SBSS,
127
	SDATA1,
128
	SXREF,
129
	SLEAF,
130
	SFILE,
131
	SCONST,
132
 
133
	C_NONE		= 0,
134
 
135
	C_REG,
136
	C_FREG,
137
	C_CREG,
138
	C_PREG,
139
	C_FSR,
140
	C_FQ,
141
 
142
	C_ZCON,		/* 0 */
143
	C_SCON,		/* 13 bit signed */
144
	C_UCON,		/* low 10 bits 0 */
145
	C_LCON,		/* other */
146
 
147
	C_SACON,
148
	C_SECON,
149
	C_LACON,
150
	C_LECON,
151
 
152
	C_SBRA,
153
	C_LBRA,
154
 
155
	C_ESAUTO,
156
	C_OSAUTO,
157
	C_SAUTO,
158
	C_OLAUTO,
159
	C_ELAUTO,
160
	C_LAUTO,
161
 
162
	C_ESEXT,
163
	C_OSEXT,
164
	C_SEXT,
165
	C_ELEXT,
166
	C_OLEXT,
167
	C_LEXT,
168
 
169
	C_ZOREG,
170
	C_SOREG,
171
	C_LOREG,
172
	C_ASI,
173
 
174
	C_ANY,
175
 
176
	C_GOK,
177
 
178
	C_NCLASS
179
};
180
 
181
EXTERN union
182
{
183
	struct
184
	{
185
		uchar	obuf[MAXIO];			/* output buffer */
186
		uchar	ibuf[MAXIO];			/* input buffer */
187
	} u;
188
	char	dbuf[1];
189
} buf;
190
 
191
#define	cbuf	u.obuf
192
#define	xbuf	u.ibuf
193
 
194
EXTERN	long	HEADR;			/* length of header */
195
EXTERN	int	HEADTYPE;		/* type of header */
196
EXTERN	long	INITDAT;		/* data location */
197
EXTERN	long	INITRND;		/* data round above text location */
198
EXTERN	long	INITTEXT;		/* text location */
199
EXTERN	char*	INITENTRY;		/* entry point */
200
EXTERN	long	autosize;
201
EXTERN	Biobuf	bso;
202
EXTERN	long	bsssize;
203
EXTERN	int	cbc;
204
EXTERN	uchar*	cbp;
205
EXTERN	int	cout;
206
EXTERN	Auto*	curauto;
207
EXTERN	Auto*	curhist;
208
EXTERN	Prog*	curp;
209
EXTERN	Prog*	curtext;
210
EXTERN	Prog*	datap;
211
EXTERN	Prog*	prog_mul;
212
EXTERN	Prog*	prog_div;
213
EXTERN	Prog*	prog_divl;
214
EXTERN	Prog*	prog_mod;
215
EXTERN	Prog*	prog_modl;
216
EXTERN	long	datsize;
217
EXTERN	char	debug[128];
218
EXTERN	Prog*	firstp;
219
EXTERN	char	fnuxi8[8];
220
EXTERN	Sym*	hash[NHASH];
221
EXTERN	Sym*	histfrog[MAXHIST];
222
EXTERN	int	histfrogp;
223
EXTERN	int	histgen;
224
EXTERN	char*	library[50];
225
EXTERN	char*	libraryobj[50];
226
EXTERN	int	libraryp;
227
EXTERN	int	xrefresolv;
228
EXTERN	char*	hunk;
229
EXTERN	char	inuxi1[1];
230
EXTERN	char	inuxi2[2];
231
EXTERN	char	inuxi4[4];
232
EXTERN	Prog*	lastp;
233
EXTERN	long	lcsize;
234
EXTERN	char	literal[32];
235
EXTERN	int	nerrors;
236
EXTERN	long	nhunk;
237
EXTERN	char*	noname;
238
EXTERN	long	instoffset;
239
EXTERN	char*	outfile;
240
EXTERN	long	pc;
241
EXTERN	long	symsize;
242
EXTERN	long	staticgen;
243
EXTERN	Prog*	textp;
244
EXTERN	long	textsize;
245
EXTERN	long	tothunk;
246
EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
247
EXTERN	int	version;
248
EXTERN	Prog	zprg;
249
EXTERN	int	dtype;
250
 
251
extern	Optab	optab[];
252
extern	char*	anames[];
253
 
254
#pragma	varargck	type	"A"	int
255
#pragma	varargck	type	"A"	uint
256
#pragma	varargck	type	"D"	Adr*
257
#pragma	varargck	type	"N"	Adr*
258
#pragma	varargck	type	"P"	Prog*
259
#pragma	varargck	type	"S"	char*
260
 
261
#pragma	varargck	argpos	diag 1
262
 
263
int	Aconv(Fmt*);
264
int	Dconv(Fmt*);
265
int	Nconv(Fmt*);
266
int	Pconv(Fmt*);
267
int	Sconv(Fmt*);
268
int	aclass(Adr*);
269
void	addhist(long, int);
270
void	histtoauto(void);
271
void	addlibpath(char*);
272
void	addnop(Prog*);
273
void	append(Prog*, Prog*);
274
void	asmb(void);
275
void	asmlc(void);
276
int	asmout(Prog*, Optab*, int);
277
void	asmsym(void);
278
long	atolwhex(char*);
279
Prog*	brloop(Prog*);
280
void	buildop(void);
281
void	cflush(void);
282
int	cmp(int, int);
283
int	compound(Prog*);
284
double	cputime(void);
285
void	datblk(long, long);
286
void	diag(char*, ...);
287
void	dodata(void);
288
void	doprof1(void);
289
void	doprof2(void);
290
long	entryvalue(void);
291
void	errorexit(void);
292
void	exchange(Prog*);
293
int	fileexists(char*);
294
int	find1(long, int);
295
char*	findlib(char*);
296
void	follow(void);
297
void	gethunk(void);
298
double	ieeedtod(Ieee*);
299
long	ieeedtof(Ieee*);
300
int	isnop(Prog*);
301
void	ldobj(int, long, char*);
302
void	loadlib(void);
303
void	listinit(void);
304
void	initmuldiv(void);
305
Sym*	lookup(char*, int);
306
void	lput(long);
307
void	mkfwd(void);
308
void*	mysbrk(ulong);
309
void	names(void);
310
void	nocache(Prog*);
311
void	noops(void);
312
void	nuxiinit(void);
313
void	objfile(char*);
314
int	ocmp(const void*, const void*);
315
long	opcode(int);
316
Optab*	oplook(Prog*);
317
void	patch(void);
318
void	prasm(Prog*);
319
void	prepend(Prog*, Prog*);
320
Prog*	prg(void);
321
int	pseudo(Prog*);
322
void	putsymb(char*, int, long, int);
323
long	regoff(Adr*);
324
int	relinv(int);
325
long	rnd(long, long);
326
void	sched(Prog*, Prog*);
327
void	span(void);
328
void	undef(void);
329
void	xdefine(char*, int, long);
330
void	xfol(Prog*);