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