forsyth20121205-174063a80cc13 years agoHistory
392 lines · 6.6 KB · C
RawDownload
#include	<lib9.h>#include	<bio.h>#include	"../6c/6.out.h" #ifndef	EXTERN#define	EXTERN	extern#endif #define	P		((Prog*)0)#define	S		((Sym*)0)#define	TNAME		(curtext?curtext->from.sym->name:noname)#define	cput(c)\	{ *cbp++ = c;\	if(--cbc <= 0)\		cflush(); } typedef	struct	Adr	Adr;typedef	struct	Prog	Prog;typedef	struct	Sym	Sym;typedef	struct	Auto	Auto;typedef	struct	Optab	Optab;typedef	struct	Movtab	Movtab; struct	Adr{	union	{		vlong	u0offset;		char	u0scon[8];		Prog	*u0cond;	/* not used, but should be D_BRANCH */		Ieee	u0ieee;	} u0;	union	{		Auto*	u1autom;		Sym*	u1sym;	} u1;	short	type;	char	index;	char	scale;}; #define	offset	u0.u0offset#define	scon	u0.u0scon#define	cond	u0.u0cond#define	ieee	u0.u0ieee #define	autom	u1.u1autom#define	sym	u1.u1sym struct	Prog{	Adr	from;	Adr	to;	Prog	*forwd;	Prog*	link;	Prog*	pcond;	/* work on this */	vlong	pc;	long	line;	uchar	mark;	/* work on these */	uchar	back; 	short	as;	char	width;		/* fake for DATA */	char	mode;	/* 16, 32, or 64 */};struct	Auto{	Sym*	asym;	Auto*	link;	long	aoffset;	short	type;};struct	Sym{	char	*name;	short	type;	short	version;	short	become;	short	frame;	uchar	subtype;	ushort	file;	vlong	value;	long	sig;	Sym*	link;};struct	Optab{	short	as;	uchar*	ytab;	uchar	prefix;	uchar	op[20];};struct	Movtab{	short	as;	uchar	ft;	uchar	tt;	uchar	code;	uchar	op[4];}; enum{	STEXT		= 1,	SDATA,	SBSS,	SDATA1,	SXREF,	SFILE,	SCONST,	SUNDEF, 	SIMPORT,	SEXPORT, 	NHASH		= 10007,	NHUNK		= 100000,	MINSIZ		= 8,	STRINGSZ	= 200,	MINLC		= 1,	MAXIO		= 8192,	MAXHIST		= 20,				/* limit of path elements for history symbols */ 	Yxxx		= 0,	Ynone,	Yi0,	Yi1,	Yi8,	Ys32,	Yi32,	Yi64,	Yiauto,	Yal,	Ycl,	Yax,	Ycx,	Yrb,	Yrl,	Yrf,	Yf0,	Yrx,	Ymb,	Yml,	Ym,	Ybr,	Ycol, 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,	Ycr8,	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,	Yrl32,	Yrl64,	Ymr, Ymm,	Yxr, Yxm,	Ymax, 	Zxxx		= 0, 	Zlit,	Z_rp,	Zbr,	Zcall,	Zib_,	Zib_rp,	Zibo_m,	Zibo_m_xm,	Zil_,	Zil_rp,	Ziq_rp,	Zilo_m,	Ziqo_m,	Zjmp,	Zloop,	Zo_iw,	Zm_o,	Zm_r,	Zm_r_xm,	Zm_r_i_xm,	Zm_r_3d,	Zm_r_xm_nr,	Zr_m_xm_nr,	Zibm_r,	/* mmx1,mmx2/mem64,imm8 */	Zmb_r,	Zaut_r,	Zo_m,	Zo_m64,	Zpseudo,	Zr_m,	Zr_m_xm,	Zr_m_i_xm,	Zrp_,	Z_ib,	Z_il,	Zm_ibo,	Zm_ilo,	Zib_rr,	Zil_rr,	Zclr,	Zbyte,	Zmax, 	Px		= 0,	P32		= 0x32,	/* 32-bit only */	Pe		= 0x66,	/* operand escape */	Pm		= 0x0f,	/* 2byte opcode escape */	Pq		= 0xff,	/* both escape */	Pb		= 0xfe,	/* byte operands */	Pf2		= 0xf2,	/* xmm escape 1 */	Pf3		= 0xf3,	/* xmm escape 2 */	Pw		= 0x48,	/* Rex.w */	Py		= 0x80,	/* defaults to 64-bit mode */ 	Rxf		= 1<<9,	/* internal flag for Rxr on from */	Rxt		= 1<<8,	/* internal flag for Rxr on to */	Rxw		= 1<<3,	/* =1, 64-bit operand size */	Rxr		= 1<<2,	/* extend modrm reg */	Rxx		= 1<<1,	/* extend sib index */	Rxb		= 1<<0,	/* extend modrm r/m, sib base, or opcode reg */ 	Roffset	= 22,		/* no. bits for offset in relocation address */	Rindex	= 10,		/* no. bits for index in relocation address */}; EXTERN union{	struct	{		char	obuf[MAXIO];			/* output buffer */		uchar	ibuf[MAXIO];			/* input buffer */	} u;	char	dbuf[1];} buf; #define	cbuf	u.obuf#define	xbuf	u.ibuf #pragma	varargck	type	"A"	uint#pragma	varargck	type	"D"	Adr*#pragma	varargck	type	"P"	Prog*#pragma	varargck	type	"R"	int#pragma	varargck	type	"S"	char* EXTERN	long	HEADR;EXTERN	long	HEADTYPE;EXTERN	vlong	INITDAT;EXTERN	long	INITRND;EXTERN	vlong	INITTEXT;EXTERN	char*	INITENTRY;		/* entry point */EXTERN	Biobuf	bso;EXTERN	long	bsssize;EXTERN	int	cbc;EXTERN	char*	cbp;EXTERN	char*	pcstr;EXTERN	int	cout;EXTERN	Auto*	curauto;EXTERN	Auto*	curhist;EXTERN	Prog*	curp;EXTERN	Prog*	curtext;EXTERN	Prog*	datap;EXTERN	Prog*	edatap;EXTERN	vlong	datsize;EXTERN	char	debug[128];EXTERN	char	literal[32];EXTERN	Prog*	etextp;EXTERN	Prog*	firstp;EXTERN	uchar	fnuxi8[8];EXTERN	uchar	fnuxi4[4];EXTERN	Sym*	hash[NHASH];EXTERN	Sym*	histfrog[MAXHIST];EXTERN	int	histfrogp;EXTERN	int	histgen;EXTERN	char*	library[50];EXTERN	char*	libraryobj[50];EXTERN	int	libraryp;EXTERN	int	xrefresolv;EXTERN	char*	hunk;EXTERN	uchar	inuxi1[1];EXTERN	uchar	inuxi2[2];EXTERN	uchar	inuxi4[4];EXTERN	uchar	inuxi8[8];EXTERN	char	ycover[Ymax*Ymax];EXTERN	uchar*	andptr;EXTERN	uchar*	rexptr;EXTERN	uchar	and[30];EXTERN	int	reg[D_NONE];EXTERN	int	regrex[D_NONE+1];EXTERN	Prog*	lastp;EXTERN	long	lcsize;EXTERN	int	nerrors;EXTERN	long	nhunk;EXTERN	long	nsymbol;EXTERN	char*	noname;EXTERN	char*	outfile;EXTERN	vlong	pc;EXTERN	long	spsize;EXTERN	Sym*	symlist;EXTERN	long	symsize;EXTERN	Prog*	textp;EXTERN	vlong	textsize;EXTERN	long	thunk;EXTERN	int	version;EXTERN	Prog	zprg;EXTERN	int	dtype;EXTERN	char*	paramspace; EXTERN	Adr*	reloca;EXTERN	int	doexp, dlm;EXTERN	int	imports, nimports;EXTERN	int	exports, nexports;EXTERN	char*	EXPTAB;EXTERN	Prog	undefp; #define	UP	(&undefp) extern	Optab	optab[];extern	Optab*	opindex[];extern	char*	anames[]; int	Aconv(Fmt*);int	Dconv(Fmt*);int	Pconv(Fmt*);int	Rconv(Fmt*);int	Sconv(Fmt*);void	addhist(long, int);Prog*	appendp(Prog*);void	asmb(void);void	asmdyn(void);void	asmins(Prog*);void	asmlc(void);void	asmsp(void);void	asmsym(void);vlong	atolwhex(char*);Prog*	brchain(Prog*);Prog*	brloop(Prog*);void	buildop(void);void	cflush(void);void	ckoff(Sym*, long);Prog*	copyp(Prog*);double	cputime(void);void	datblk(long, long);void	diag(char*, ...);void	dodata(void);void	doinit(void);void	doprof1(void);void	doprof2(void);void	dostkoff(void);void	dynreloc(Sym*, ulong, int);vlong	entryvalue(void);void	errorexit(void);void	export(void);int	find1(long, int);int	find2(long, int);void	follow(void);void	gethunk(void);void	histtoauto(void);double	ieeedtod(Ieee*);long	ieeedtof(Ieee*);void	import(void);void	ldobj(int, long, char*);void	loadlib(void);void	listinit(void);Sym*	lookup(char*, int);void	lput(long);void	lputl(long);void	main(int, char*[]);void	mkfwd(void);void*	mysbrk(ulong);void	nuxiinit(void);void	objfile(char*);int	opsize(Prog*);void	patch(void);Prog*	prg(void);void	readundefs(char*, int);int	relinv(int);long	reuse(Prog*, Sym*);vlong	rnd(vlong, vlong);void	span(void);void	undef(void);void	undefsym(Sym*);vlong	vaddr(Adr*);void	wput(ushort);void	xdefine(char*, int, vlong);void	xfol(Prog*);int	zaddr(uchar*, Adr*, Sym*[]);void	zerosig(char*); #pragma	varargck	type	"D"	Adr*#pragma	varargck	type	"P"	Prog*#pragma	varargck	type	"R"	int#pragma	varargck	type	"A"	int#pragma	varargck	argpos	diag 1