xref: /inferno-os/utils/ql/l.h (revision 0c407e1dbf0a89cf3ec26814327abea54b532d03)
174a4d8c2SCharles.Forsyth #include	<lib9.h>
274a4d8c2SCharles.Forsyth #include	<bio.h>
374a4d8c2SCharles.Forsyth #include	"../qc/q.out.h"
4*0c407e1dSforsyth #include	"../ld/elf.h"
574a4d8c2SCharles.Forsyth 
674a4d8c2SCharles.Forsyth #ifndef	EXTERN
774a4d8c2SCharles.Forsyth #define	EXTERN	extern
874a4d8c2SCharles.Forsyth #endif
974a4d8c2SCharles.Forsyth 
1045a20ab7Sforsyth #define	LIBNAMELEN	300
1145a20ab7Sforsyth 
1274a4d8c2SCharles.Forsyth typedef	struct	Adr	Adr;
1374a4d8c2SCharles.Forsyth typedef	struct	Sym	Sym;
1474a4d8c2SCharles.Forsyth typedef	struct	Autom	Auto;
1574a4d8c2SCharles.Forsyth typedef	struct	Prog	Prog;
1674a4d8c2SCharles.Forsyth typedef	struct	Optab	Optab;
1774a4d8c2SCharles.Forsyth 
1874a4d8c2SCharles.Forsyth #define	P		((Prog*)0)
1974a4d8c2SCharles.Forsyth #define	S		((Sym*)0)
2074a4d8c2SCharles.Forsyth #define	TNAME		(curtext&&curtext->from.sym?curtext->from.sym->name:noname)
2174a4d8c2SCharles.Forsyth 
2274a4d8c2SCharles.Forsyth struct	Adr
2374a4d8c2SCharles.Forsyth {
2474a4d8c2SCharles.Forsyth 	union
2574a4d8c2SCharles.Forsyth 	{
2674a4d8c2SCharles.Forsyth 		long	u0offset;
2774a4d8c2SCharles.Forsyth 		char	u0sval[NSNAME];
2874a4d8c2SCharles.Forsyth 		Ieee	u0ieee;
2974a4d8c2SCharles.Forsyth 	}u0;
3074a4d8c2SCharles.Forsyth 	Sym	*sym;
3174a4d8c2SCharles.Forsyth 	Auto	*autom;
3274a4d8c2SCharles.Forsyth 	char	type;
3374a4d8c2SCharles.Forsyth 	uchar	reg;
3474a4d8c2SCharles.Forsyth 	char	name;
3574a4d8c2SCharles.Forsyth 	char	class;
3674a4d8c2SCharles.Forsyth };
3774a4d8c2SCharles.Forsyth 
3874a4d8c2SCharles.Forsyth #define	offset	u0.u0offset
3974a4d8c2SCharles.Forsyth #define	sval	u0.u0sval
4074a4d8c2SCharles.Forsyth #define	ieee	u0.u0ieee
4174a4d8c2SCharles.Forsyth 
4274a4d8c2SCharles.Forsyth struct	Prog
4374a4d8c2SCharles.Forsyth {
4474a4d8c2SCharles.Forsyth 	Adr	from;
4574a4d8c2SCharles.Forsyth 	Adr	from3;	/* fma and rlwm */
4674a4d8c2SCharles.Forsyth 	Adr	to;
4774a4d8c2SCharles.Forsyth 	Prog	*forwd;
4874a4d8c2SCharles.Forsyth 	Prog	*cond;
4974a4d8c2SCharles.Forsyth 	Prog	*link;
5074a4d8c2SCharles.Forsyth 	long	pc;
5174a4d8c2SCharles.Forsyth 	long	regused;
5274a4d8c2SCharles.Forsyth 	short	line;
5374a4d8c2SCharles.Forsyth 	short	mark;
5474a4d8c2SCharles.Forsyth 	short	optab;		/* could be uchar */
556e425a9dSCharles.Forsyth 	ushort	as;
5674a4d8c2SCharles.Forsyth 	char	reg;
5774a4d8c2SCharles.Forsyth };
5874a4d8c2SCharles.Forsyth struct	Sym
5974a4d8c2SCharles.Forsyth {
6074a4d8c2SCharles.Forsyth 	char	*name;
6174a4d8c2SCharles.Forsyth 	short	type;
6274a4d8c2SCharles.Forsyth 	short	version;
6374a4d8c2SCharles.Forsyth 	short	become;
6474a4d8c2SCharles.Forsyth 	short	frame;
6574a4d8c2SCharles.Forsyth 	uchar	subtype;
6674a4d8c2SCharles.Forsyth 	ushort	file;
6774a4d8c2SCharles.Forsyth 	long	value;
6874a4d8c2SCharles.Forsyth 	long	sig;
6974a4d8c2SCharles.Forsyth 	Sym	*link;
7074a4d8c2SCharles.Forsyth };
7174a4d8c2SCharles.Forsyth struct	Autom
7274a4d8c2SCharles.Forsyth {
7374a4d8c2SCharles.Forsyth 	Sym	*sym;
7474a4d8c2SCharles.Forsyth 	Auto	*link;
7574a4d8c2SCharles.Forsyth 	long	aoffset;
7674a4d8c2SCharles.Forsyth 	short	type;
7774a4d8c2SCharles.Forsyth };
7874a4d8c2SCharles.Forsyth struct	Optab
7974a4d8c2SCharles.Forsyth {
806e425a9dSCharles.Forsyth 	ushort	as;
8174a4d8c2SCharles.Forsyth 	char	a1;
8274a4d8c2SCharles.Forsyth 	char	a2;
8374a4d8c2SCharles.Forsyth 	char	a3;
8474a4d8c2SCharles.Forsyth 	char	a4;
8574a4d8c2SCharles.Forsyth 	char	type;
8674a4d8c2SCharles.Forsyth 	char	size;
8774a4d8c2SCharles.Forsyth 	char	param;
8874a4d8c2SCharles.Forsyth };
8974a4d8c2SCharles.Forsyth struct
9074a4d8c2SCharles.Forsyth {
9174a4d8c2SCharles.Forsyth 	Optab*	start;
9274a4d8c2SCharles.Forsyth 	Optab*	stop;
9374a4d8c2SCharles.Forsyth } oprange[ALAST];
9474a4d8c2SCharles.Forsyth 
9574a4d8c2SCharles.Forsyth enum
9674a4d8c2SCharles.Forsyth {
9774a4d8c2SCharles.Forsyth 	FPCHIP		= 1,
9874a4d8c2SCharles.Forsyth 	BIG		= 32768-8,
9974a4d8c2SCharles.Forsyth 	STRINGSZ	= 200,
10074a4d8c2SCharles.Forsyth 	MAXIO		= 8192,
10174a4d8c2SCharles.Forsyth 	MAXHIST		= 20,				/* limit of path elements for history symbols */
10274a4d8c2SCharles.Forsyth 	DATBLK		= 1024,
10374a4d8c2SCharles.Forsyth 	NHASH		= 10007,
10474a4d8c2SCharles.Forsyth 	NHUNK		= 100000,
10574a4d8c2SCharles.Forsyth 	MINSIZ		= 64,
10674a4d8c2SCharles.Forsyth 	NENT		= 100,
10774a4d8c2SCharles.Forsyth 	NSCHED		= 20,
10874a4d8c2SCharles.Forsyth 
10974a4d8c2SCharles.Forsyth /* mark flags */
11074a4d8c2SCharles.Forsyth 	LABEL		= 1<<0,
11174a4d8c2SCharles.Forsyth 	LEAF		= 1<<1,
11274a4d8c2SCharles.Forsyth 	FLOAT		= 1<<2,
11374a4d8c2SCharles.Forsyth 	BRANCH		= 1<<3,
11474a4d8c2SCharles.Forsyth 	LOAD		= 1<<4,
11574a4d8c2SCharles.Forsyth 	FCMP		= 1<<5,
11674a4d8c2SCharles.Forsyth 	SYNC		= 1<<6,
11774a4d8c2SCharles.Forsyth 	LIST		= 1<<7,
11874a4d8c2SCharles.Forsyth 	FOLL		= 1<<8,
11974a4d8c2SCharles.Forsyth 	NOSCHED		= 1<<9,
12074a4d8c2SCharles.Forsyth 
12174a4d8c2SCharles.Forsyth 	STEXT		= 1,
12274a4d8c2SCharles.Forsyth 	SDATA,
12374a4d8c2SCharles.Forsyth 	SBSS,
12474a4d8c2SCharles.Forsyth 	SDATA1,
12574a4d8c2SCharles.Forsyth 	SXREF,
12674a4d8c2SCharles.Forsyth 	SLEAF,
12774a4d8c2SCharles.Forsyth 	SFILE,
12874a4d8c2SCharles.Forsyth 	SCONST,
12974a4d8c2SCharles.Forsyth 	SUNDEF,
13074a4d8c2SCharles.Forsyth 
13174a4d8c2SCharles.Forsyth 	SIMPORT,
13274a4d8c2SCharles.Forsyth 	SEXPORT,
13374a4d8c2SCharles.Forsyth 
13474a4d8c2SCharles.Forsyth 	C_NONE		= 0,
13574a4d8c2SCharles.Forsyth 	C_REG,
13674a4d8c2SCharles.Forsyth 	C_FREG,
13774a4d8c2SCharles.Forsyth 	C_CREG,
13874a4d8c2SCharles.Forsyth 	C_SPR,		/* special processor register */
13974a4d8c2SCharles.Forsyth 	C_SREG,		/* segment register (32 bit implementations only) */
14074a4d8c2SCharles.Forsyth 	C_ZCON,
14174a4d8c2SCharles.Forsyth 	C_SCON,		/* 16 bit signed */
14274a4d8c2SCharles.Forsyth 	C_UCON,		/* low 16 bits 0 */
14374a4d8c2SCharles.Forsyth 	C_ADDCON,	/* -0x8000 <= v < 0 */
14474a4d8c2SCharles.Forsyth 	C_ANDCON,	/* 0 < v <= 0xFFFF */
14574a4d8c2SCharles.Forsyth 	C_LCON,		/* other */
14674a4d8c2SCharles.Forsyth 	C_SACON,
14774a4d8c2SCharles.Forsyth 	C_SECON,
14874a4d8c2SCharles.Forsyth 	C_LACON,
14974a4d8c2SCharles.Forsyth 	C_LECON,
15074a4d8c2SCharles.Forsyth 	C_SBRA,
15174a4d8c2SCharles.Forsyth 	C_LBRA,
15274a4d8c2SCharles.Forsyth 	C_SAUTO,
15374a4d8c2SCharles.Forsyth 	C_LAUTO,
15474a4d8c2SCharles.Forsyth 	C_SEXT,
15574a4d8c2SCharles.Forsyth 	C_LEXT,
15674a4d8c2SCharles.Forsyth 	C_ZOREG,
15774a4d8c2SCharles.Forsyth 	C_SOREG,
15874a4d8c2SCharles.Forsyth 	C_LOREG,
15974a4d8c2SCharles.Forsyth 	C_FPSCR,
16074a4d8c2SCharles.Forsyth 	C_MSR,
16174a4d8c2SCharles.Forsyth 	C_XER,
16274a4d8c2SCharles.Forsyth 	C_LR,
16374a4d8c2SCharles.Forsyth 	C_CTR,
16474a4d8c2SCharles.Forsyth 	C_ANY,
16574a4d8c2SCharles.Forsyth 	C_GOK,
16674a4d8c2SCharles.Forsyth 	C_ADDR,
16774a4d8c2SCharles.Forsyth 
16874a4d8c2SCharles.Forsyth 	C_NCLASS,
16974a4d8c2SCharles.Forsyth 
17074a4d8c2SCharles.Forsyth 	Roffset	= 22,		/* no. bits for offset in relocation address */
17174a4d8c2SCharles.Forsyth 	Rindex	= 10		/* no. bits for index in relocation address */
17274a4d8c2SCharles.Forsyth };
17374a4d8c2SCharles.Forsyth 
17474a4d8c2SCharles.Forsyth EXTERN union
17574a4d8c2SCharles.Forsyth {
17674a4d8c2SCharles.Forsyth 	struct
17774a4d8c2SCharles.Forsyth 	{
17874a4d8c2SCharles.Forsyth 		uchar	obuf[MAXIO];			/* output buffer */
17974a4d8c2SCharles.Forsyth 		uchar	ibuf[MAXIO];			/* input buffer */
18074a4d8c2SCharles.Forsyth 	} u;
18174a4d8c2SCharles.Forsyth 	char	dbuf[1];
18274a4d8c2SCharles.Forsyth } buf;
18374a4d8c2SCharles.Forsyth 
18474a4d8c2SCharles.Forsyth #define	cbuf	u.obuf
18574a4d8c2SCharles.Forsyth #define	xbuf	u.ibuf
18674a4d8c2SCharles.Forsyth 
18774a4d8c2SCharles.Forsyth EXTERN	long	HEADR;			/* length of header */
18874a4d8c2SCharles.Forsyth EXTERN	int	HEADTYPE;		/* type of header */
18974a4d8c2SCharles.Forsyth EXTERN	long	INITDAT;		/* data location */
19074a4d8c2SCharles.Forsyth EXTERN	long	INITRND;		/* data round above text location */
19174a4d8c2SCharles.Forsyth EXTERN	long	INITTEXT;		/* text location */
19245a20ab7Sforsyth EXTERN	long	INITTEXTP;		/* text location (physical) */
19374a4d8c2SCharles.Forsyth EXTERN	char*	INITENTRY;		/* entry point */
19474a4d8c2SCharles.Forsyth EXTERN	long	autosize;
19574a4d8c2SCharles.Forsyth EXTERN	Biobuf	bso;
19674a4d8c2SCharles.Forsyth EXTERN	long	bsssize;
19774a4d8c2SCharles.Forsyth EXTERN	int	cbc;
19874a4d8c2SCharles.Forsyth EXTERN	uchar*	cbp;
19974a4d8c2SCharles.Forsyth EXTERN	int	cout;
20074a4d8c2SCharles.Forsyth EXTERN	Auto*	curauto;
20174a4d8c2SCharles.Forsyth EXTERN	Auto*	curhist;
20274a4d8c2SCharles.Forsyth EXTERN	Prog*	curp;
20374a4d8c2SCharles.Forsyth EXTERN	Prog*	curtext;
20474a4d8c2SCharles.Forsyth EXTERN	Prog*	datap;
20574a4d8c2SCharles.Forsyth EXTERN	Prog*	prog_movsw;
20674a4d8c2SCharles.Forsyth EXTERN	Prog*	prog_movdw;
20774a4d8c2SCharles.Forsyth EXTERN	Prog*	prog_movws;
20874a4d8c2SCharles.Forsyth EXTERN	Prog*	prog_movwd;
20974a4d8c2SCharles.Forsyth EXTERN	long	datsize;
21074a4d8c2SCharles.Forsyth EXTERN	char	debug[128];
21174a4d8c2SCharles.Forsyth EXTERN	Prog*	firstp;
21274a4d8c2SCharles.Forsyth EXTERN	char	fnuxi8[8];
21374a4d8c2SCharles.Forsyth EXTERN	Sym*	hash[NHASH];
21474a4d8c2SCharles.Forsyth EXTERN	Sym*	histfrog[MAXHIST];
21574a4d8c2SCharles.Forsyth EXTERN	int	histfrogp;
21674a4d8c2SCharles.Forsyth EXTERN	int	histgen;
21774a4d8c2SCharles.Forsyth EXTERN	char*	library[50];
21874a4d8c2SCharles.Forsyth EXTERN	char*	libraryobj[50];
21974a4d8c2SCharles.Forsyth EXTERN	int	libraryp;
22074a4d8c2SCharles.Forsyth EXTERN	int	xrefresolv;
22174a4d8c2SCharles.Forsyth EXTERN	char*	hunk;
22274a4d8c2SCharles.Forsyth EXTERN	char	inuxi1[1];
22374a4d8c2SCharles.Forsyth EXTERN	char	inuxi2[2];
22474a4d8c2SCharles.Forsyth EXTERN	char	inuxi4[4];
22574a4d8c2SCharles.Forsyth EXTERN	Prog*	lastp;
22674a4d8c2SCharles.Forsyth EXTERN	long	lcsize;
22774a4d8c2SCharles.Forsyth EXTERN	char	literal[32];
22874a4d8c2SCharles.Forsyth EXTERN	int	nerrors;
22974a4d8c2SCharles.Forsyth EXTERN	long	nhunk;
23074a4d8c2SCharles.Forsyth EXTERN	char*	noname;
23174a4d8c2SCharles.Forsyth EXTERN	long	instoffset;
23274a4d8c2SCharles.Forsyth EXTERN	char*	outfile;
23374a4d8c2SCharles.Forsyth EXTERN	long	pc;
23474a4d8c2SCharles.Forsyth EXTERN	int	r0iszero;
23574a4d8c2SCharles.Forsyth EXTERN	long	symsize;
23674a4d8c2SCharles.Forsyth EXTERN	long	staticgen;
23774a4d8c2SCharles.Forsyth EXTERN	Prog*	textp;
23874a4d8c2SCharles.Forsyth EXTERN	long	textsize;
23974a4d8c2SCharles.Forsyth EXTERN	long	tothunk;
24074a4d8c2SCharles.Forsyth EXTERN	char	xcmp[C_NCLASS][C_NCLASS];
24174a4d8c2SCharles.Forsyth EXTERN	int	version;
24274a4d8c2SCharles.Forsyth EXTERN	Prog	zprg;
24374a4d8c2SCharles.Forsyth EXTERN	int	dtype;
24474a4d8c2SCharles.Forsyth 
24574a4d8c2SCharles.Forsyth EXTERN	int	doexp, dlm;
24674a4d8c2SCharles.Forsyth EXTERN	int	imports, nimports;
24774a4d8c2SCharles.Forsyth EXTERN	int	exports, nexports;
24874a4d8c2SCharles.Forsyth EXTERN	char*	EXPTAB;
24974a4d8c2SCharles.Forsyth EXTERN	Prog	undefp;
25074a4d8c2SCharles.Forsyth 
25174a4d8c2SCharles.Forsyth #define	UP	(&undefp)
25274a4d8c2SCharles.Forsyth 
25374a4d8c2SCharles.Forsyth extern	Optab	optab[];
25474a4d8c2SCharles.Forsyth extern	char*	anames[];
25574a4d8c2SCharles.Forsyth extern	char*	cnames[];
25674a4d8c2SCharles.Forsyth 
25774a4d8c2SCharles.Forsyth int	Aconv(Fmt*);
25874a4d8c2SCharles.Forsyth int	Dconv(Fmt*);
25974a4d8c2SCharles.Forsyth int	Nconv(Fmt*);
26074a4d8c2SCharles.Forsyth int	Pconv(Fmt*);
26174a4d8c2SCharles.Forsyth int	Sconv(Fmt*);
26274a4d8c2SCharles.Forsyth int	Rconv(Fmt*);
26374a4d8c2SCharles.Forsyth int	aclass(Adr*);
26474a4d8c2SCharles.Forsyth void	addhist(long, int);
26574a4d8c2SCharles.Forsyth void	histtoauto(void);
26645a20ab7Sforsyth void	addlibpath(char*);
26774a4d8c2SCharles.Forsyth void	addnop(Prog*);
26874a4d8c2SCharles.Forsyth void	append(Prog*, Prog*);
26974a4d8c2SCharles.Forsyth void	asmb(void);
27074a4d8c2SCharles.Forsyth void	asmdyn(void);
27174a4d8c2SCharles.Forsyth void	asmlc(void);
27274a4d8c2SCharles.Forsyth int	asmout(Prog*, Optab*, int);
27374a4d8c2SCharles.Forsyth void	asmsym(void);
27474a4d8c2SCharles.Forsyth long	atolwhex(char*);
27574a4d8c2SCharles.Forsyth Prog*	brloop(Prog*);
27674a4d8c2SCharles.Forsyth void	buildop(void);
27774a4d8c2SCharles.Forsyth void	cflush(void);
27874a4d8c2SCharles.Forsyth void	ckoff(Sym*, long);
27974a4d8c2SCharles.Forsyth int	cmp(int, int);
28074a4d8c2SCharles.Forsyth void	cput(long);
28174a4d8c2SCharles.Forsyth int	compound(Prog*);
28274a4d8c2SCharles.Forsyth double	cputime(void);
28374a4d8c2SCharles.Forsyth void	datblk(long, long);
28474a4d8c2SCharles.Forsyth void	diag(char*, ...);
28574a4d8c2SCharles.Forsyth void	dodata(void);
28674a4d8c2SCharles.Forsyth void	doprof1(void);
28774a4d8c2SCharles.Forsyth void	doprof2(void);
28874a4d8c2SCharles.Forsyth void	dynreloc(Sym*, long, int, int, int);
28974a4d8c2SCharles.Forsyth long	entryvalue(void);
29074a4d8c2SCharles.Forsyth void	errorexit(void);
29174a4d8c2SCharles.Forsyth void	exchange(Prog*);
29274a4d8c2SCharles.Forsyth void	export(void);
29345a20ab7Sforsyth int	fileexists(char*);
29474a4d8c2SCharles.Forsyth int	find1(long, int);
29545a20ab7Sforsyth char*	findlib(char*);
29674a4d8c2SCharles.Forsyth void	follow(void);
29774a4d8c2SCharles.Forsyth void	gethunk(void);
29874a4d8c2SCharles.Forsyth double	ieeedtod(Ieee*);
29974a4d8c2SCharles.Forsyth long	ieeedtof(Ieee*);
30074a4d8c2SCharles.Forsyth void	import(void);
30174a4d8c2SCharles.Forsyth int	isnop(Prog*);
30274a4d8c2SCharles.Forsyth void	ldobj(int, long, char*);
30374a4d8c2SCharles.Forsyth void	loadlib(void);
30474a4d8c2SCharles.Forsyth void	listinit(void);
30574a4d8c2SCharles.Forsyth void	initmuldiv(void);
30674a4d8c2SCharles.Forsyth Sym*	lookup(char*, int);
30745a20ab7Sforsyth void	llput(vlong);
30845a20ab7Sforsyth void	llputl(vlong);
30974a4d8c2SCharles.Forsyth void	lput(long);
31045a20ab7Sforsyth void	lputl(long);
31174a4d8c2SCharles.Forsyth void	mkfwd(void);
31274a4d8c2SCharles.Forsyth void*	mysbrk(ulong);
31374a4d8c2SCharles.Forsyth void	names(void);
31474a4d8c2SCharles.Forsyth void	nocache(Prog*);
31574a4d8c2SCharles.Forsyth void	noops(void);
316647adfbcSforsyth void	nopout(Prog*);
31774a4d8c2SCharles.Forsyth void	nuxiinit(void);
31874a4d8c2SCharles.Forsyth void	objfile(char*);
31974a4d8c2SCharles.Forsyth int	ocmp(void*, void*);
32074a4d8c2SCharles.Forsyth long	opcode(int);
32174a4d8c2SCharles.Forsyth Optab*	oplook(Prog*);
32274a4d8c2SCharles.Forsyth void	patch(void);
32374a4d8c2SCharles.Forsyth void	prasm(Prog*);
32474a4d8c2SCharles.Forsyth void	prepend(Prog*, Prog*);
32574a4d8c2SCharles.Forsyth Prog*	prg(void);
32674a4d8c2SCharles.Forsyth int	pseudo(Prog*);
32774a4d8c2SCharles.Forsyth void	putsymb(char*, int, long, int);
32874a4d8c2SCharles.Forsyth void	readundefs(char*, int);
32974a4d8c2SCharles.Forsyth long	regoff(Adr*);
33074a4d8c2SCharles.Forsyth int	relinv(int);
33174a4d8c2SCharles.Forsyth long	rnd(long, long);
33274a4d8c2SCharles.Forsyth void	sched(Prog*, Prog*);
33374a4d8c2SCharles.Forsyth void	span(void);
33445a20ab7Sforsyth void	strnput(char*, int);
33574a4d8c2SCharles.Forsyth void	undef(void);
33674a4d8c2SCharles.Forsyth void	undefsym(Sym*);
33774a4d8c2SCharles.Forsyth void	wput(long);
33845a20ab7Sforsyth void	wputl(long);
33974a4d8c2SCharles.Forsyth void	xdefine(char*, int, long);
34074a4d8c2SCharles.Forsyth void	xfol(Prog*);
34174a4d8c2SCharles.Forsyth void	zerosig(char*);
34274a4d8c2SCharles.Forsyth 
343647adfbcSforsyth #pragma	varargck	type	"A"	int
344647adfbcSforsyth #pragma	varargck	type	"A"	uint
34574a4d8c2SCharles.Forsyth #pragma	varargck	type	"D"	Adr*
34674a4d8c2SCharles.Forsyth #pragma	varargck	type	"N"	Adr*
34774a4d8c2SCharles.Forsyth #pragma	varargck	type	"P"	Prog*
34874a4d8c2SCharles.Forsyth #pragma	varargck	type	"R"	int
34974a4d8c2SCharles.Forsyth #pragma	varargck	type	"S"	char*
350647adfbcSforsyth 
351647adfbcSforsyth #pragma	varargck	argpos	diag 1
352