xref: /plan9/sys/src/cmd/8l/l.h (revision 8153b942127462338e00e239914941524d579a3b)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<bio.h>
43e12c5d1SDavid du Colombier #include	"../8c/8.out.h"
5*8153b942SDavid du Colombier #include	"../8l/elf.h"
63e12c5d1SDavid du Colombier 
77dd7cddfSDavid du Colombier #ifndef	EXTERN
87dd7cddfSDavid du Colombier #define	EXTERN	extern
97dd7cddfSDavid du Colombier #endif
107dd7cddfSDavid du Colombier 
113e12c5d1SDavid du Colombier #define	P		((Prog*)0)
123e12c5d1SDavid du Colombier #define	S		((Sym*)0)
133e12c5d1SDavid du Colombier #define	TNAME		(curtext?curtext->from.sym->name:noname)
143e12c5d1SDavid du Colombier 
15375daca8SDavid du Colombier #define	cput(c)\
16375daca8SDavid du Colombier 	{ *cbp++ = c;\
17375daca8SDavid du Colombier 	if(--cbc <= 0)\
18375daca8SDavid du Colombier 		cflush(); }
19375daca8SDavid du Colombier 
20b87cd620SDavid du Colombier #define	LIBNAMELEN	300
21b87cd620SDavid du Colombier 
223e12c5d1SDavid du Colombier typedef	struct	Adr	Adr;
233e12c5d1SDavid du Colombier typedef	struct	Prog	Prog;
243e12c5d1SDavid du Colombier typedef	struct	Sym	Sym;
253e12c5d1SDavid du Colombier typedef	struct	Auto	Auto;
263e12c5d1SDavid du Colombier typedef	struct	Optab	Optab;
273e12c5d1SDavid du Colombier 
283e12c5d1SDavid du Colombier struct	Adr
293e12c5d1SDavid du Colombier {
303e12c5d1SDavid du Colombier 	union
313e12c5d1SDavid du Colombier 	{
327dd7cddfSDavid du Colombier 		long	u0offset;
337dd7cddfSDavid du Colombier 		char	u0scon[8];
347dd7cddfSDavid du Colombier 		Prog	*u0cond;	/* not used, but should be D_BRANCH */
357dd7cddfSDavid du Colombier 		Ieee	u0ieee;
367dd7cddfSDavid du Colombier 	} u0;
373e12c5d1SDavid du Colombier 	union
383e12c5d1SDavid du Colombier 	{
397dd7cddfSDavid du Colombier 		Auto*	u1autom;
407dd7cddfSDavid du Colombier 		Sym*	u1sym;
417dd7cddfSDavid du Colombier 	} u1;
423e12c5d1SDavid du Colombier 	short	type;
436520663fSDavid du Colombier 	uchar	index;
443e12c5d1SDavid du Colombier 	char	scale;
453e12c5d1SDavid du Colombier };
463e12c5d1SDavid du Colombier 
477dd7cddfSDavid du Colombier #define	offset	u0.u0offset
487dd7cddfSDavid du Colombier #define	scon	u0.u0scon
497dd7cddfSDavid du Colombier #define	cond	u0.u0cond
507dd7cddfSDavid du Colombier #define	ieee	u0.u0ieee
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier #define	autom	u1.u1autom
537dd7cddfSDavid du Colombier #define	sym	u1.u1sym
547dd7cddfSDavid du Colombier 
553e12c5d1SDavid du Colombier struct	Prog
563e12c5d1SDavid du Colombier {
573e12c5d1SDavid du Colombier 	Adr	from;
583e12c5d1SDavid du Colombier 	Adr	to;
593e12c5d1SDavid du Colombier 	Prog	*forwd;
603e12c5d1SDavid du Colombier 	Prog*	link;
617dd7cddfSDavid du Colombier 	Prog*	pcond;	/* work on this */
623e12c5d1SDavid du Colombier 	long	pc;
633e12c5d1SDavid du Colombier 	long	line;
643e12c5d1SDavid du Colombier 	short	as;
653e12c5d1SDavid du Colombier 	char	width;		/* fake for DATA */
666520663fSDavid du Colombier 	char	ft;		/* oclass cache */
676520663fSDavid du Colombier 	char	tt;
686520663fSDavid du Colombier 	uchar	mark;	/* work on these */
696520663fSDavid du Colombier 	uchar	back;
703e12c5d1SDavid du Colombier };
713e12c5d1SDavid du Colombier struct	Auto
723e12c5d1SDavid du Colombier {
737dd7cddfSDavid du Colombier 	Sym*	asym;
743e12c5d1SDavid du Colombier 	Auto*	link;
757dd7cddfSDavid du Colombier 	long	aoffset;
763e12c5d1SDavid du Colombier 	short	type;
773e12c5d1SDavid du Colombier };
783e12c5d1SDavid du Colombier struct	Sym
793e12c5d1SDavid du Colombier {
80219b2ee8SDavid du Colombier 	char	*name;
813e12c5d1SDavid du Colombier 	short	type;
823e12c5d1SDavid du Colombier 	short	version;
83219b2ee8SDavid du Colombier 	short	become;
84219b2ee8SDavid du Colombier 	short	frame;
85375daca8SDavid du Colombier 	uchar	subtype;
86375daca8SDavid du Colombier 	ushort	file;
873e12c5d1SDavid du Colombier 	long	value;
88375daca8SDavid du Colombier 	long	sig;
893e12c5d1SDavid du Colombier 	Sym*	link;
903e12c5d1SDavid du Colombier };
913e12c5d1SDavid du Colombier struct	Optab
923e12c5d1SDavid du Colombier {
933e12c5d1SDavid du Colombier 	short	as;
943e12c5d1SDavid du Colombier 	uchar*	ytab;
953e12c5d1SDavid du Colombier 	uchar	prefix;
963e12c5d1SDavid du Colombier 	uchar	op[10];
973e12c5d1SDavid du Colombier };
983e12c5d1SDavid du Colombier 
993e12c5d1SDavid du Colombier enum
1003e12c5d1SDavid du Colombier {
1013e12c5d1SDavid du Colombier 	STEXT		= 1,
1023e12c5d1SDavid du Colombier 	SDATA,
1033e12c5d1SDavid du Colombier 	SBSS,
1043e12c5d1SDavid du Colombier 	SDATA1,
1053e12c5d1SDavid du Colombier 	SXREF,
1063e12c5d1SDavid du Colombier 	SFILE,
107219b2ee8SDavid du Colombier 	SCONST,
1089a747e4fSDavid du Colombier 	SUNDEF,
109219b2ee8SDavid du Colombier 
110375daca8SDavid du Colombier 	SIMPORT,
111375daca8SDavid du Colombier 	SEXPORT,
112375daca8SDavid du Colombier 
1133e12c5d1SDavid du Colombier 	NHASH		= 10007,
1143e12c5d1SDavid du Colombier 	NHUNK		= 100000,
1153e12c5d1SDavid du Colombier 	MINSIZ		= 4,
1163e12c5d1SDavid du Colombier 	STRINGSZ	= 200,
1173e12c5d1SDavid du Colombier 	MINLC		= 1,
118219b2ee8SDavid du Colombier 	MAXIO		= 8192,
119219b2ee8SDavid du Colombier 	MAXHIST		= 20,				/* limit of path elements for history symbols */
1203e12c5d1SDavid du Colombier 
1213e12c5d1SDavid du Colombier 	Yxxx		= 0,
1223e12c5d1SDavid du Colombier 	Ynone,
1233e12c5d1SDavid du Colombier 	Yi0,
1243e12c5d1SDavid du Colombier 	Yi1,
1253e12c5d1SDavid du Colombier 	Yi8,
1263e12c5d1SDavid du Colombier 	Yi32,
127219b2ee8SDavid du Colombier 	Yiauto,
1283e12c5d1SDavid du Colombier 	Yal,
1293e12c5d1SDavid du Colombier 	Ycl,
1303e12c5d1SDavid du Colombier 	Yax,
1313e12c5d1SDavid du Colombier 	Ycx,
1323e12c5d1SDavid du Colombier 	Yrb,
1333e12c5d1SDavid du Colombier 	Yrl,
1343e12c5d1SDavid du Colombier 	Yrf,
1353e12c5d1SDavid du Colombier 	Yf0,
1363e12c5d1SDavid du Colombier 	Yrx,
1373e12c5d1SDavid du Colombier 	Ymb,
1383e12c5d1SDavid du Colombier 	Yml,
1393e12c5d1SDavid du Colombier 	Ym,
1403e12c5d1SDavid du Colombier 	Ybr,
1413e12c5d1SDavid du Colombier 	Ycol,
1423e12c5d1SDavid du Colombier 
1433e12c5d1SDavid du Colombier 	Ycs,	Yss,	Yds,	Yes,	Yfs,	Ygs,
1443e12c5d1SDavid du Colombier 	Ygdtr,	Yidtr,	Yldtr,	Ymsw,	Ytask,
1453e12c5d1SDavid du Colombier 	Ycr0,	Ycr1,	Ycr2,	Ycr3,	Ycr4,	Ycr5,	Ycr6,	Ycr7,
1463e12c5d1SDavid du Colombier 	Ydr0,	Ydr1,	Ydr2,	Ydr3,	Ydr4,	Ydr5,	Ydr6,	Ydr7,
1473e12c5d1SDavid du Colombier 	Ytr0,	Ytr1,	Ytr2,	Ytr3,	Ytr4,	Ytr5,	Ytr6,	Ytr7,
1483e12c5d1SDavid du Colombier 	Ymax,
1493e12c5d1SDavid du Colombier 
1503e12c5d1SDavid du Colombier 	Zxxx		= 0,
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier 	Zlit,
1533e12c5d1SDavid du Colombier 	Z_rp,
1543e12c5d1SDavid du Colombier 	Zbr,
1553e12c5d1SDavid du Colombier 	Zcall,
1563e12c5d1SDavid du Colombier 	Zib_,
1573e12c5d1SDavid du Colombier 	Zib_rp,
1583e12c5d1SDavid du Colombier 	Zibo_m,
1593e12c5d1SDavid du Colombier 	Zil_,
1603e12c5d1SDavid du Colombier 	Zil_rp,
1613e12c5d1SDavid du Colombier 	Zilo_m,
1623e12c5d1SDavid du Colombier 	Zjmp,
1633e12c5d1SDavid du Colombier 	Zloop,
1643e12c5d1SDavid du Colombier 	Zm_o,
1653e12c5d1SDavid du Colombier 	Zm_r,
166219b2ee8SDavid du Colombier 	Zaut_r,
1673e12c5d1SDavid du Colombier 	Zo_m,
1683e12c5d1SDavid du Colombier 	Zpseudo,
1693e12c5d1SDavid du Colombier 	Zr_m,
1703e12c5d1SDavid du Colombier 	Zrp_,
1713e12c5d1SDavid du Colombier 	Z_ib,
1723e12c5d1SDavid du Colombier 	Z_il,
1733e12c5d1SDavid du Colombier 	Zm_ibo,
1743e12c5d1SDavid du Colombier 	Zm_ilo,
1759a747e4fSDavid du Colombier 	Zib_rr,
1769a747e4fSDavid du Colombier 	Zil_rr,
1773e12c5d1SDavid du Colombier 	Zclr,
1783e12c5d1SDavid du Colombier 	Zbyte,
1793e12c5d1SDavid du Colombier 	Zmov,
1803e12c5d1SDavid du Colombier 	Zmax,
1813e12c5d1SDavid du Colombier 
1823e12c5d1SDavid du Colombier 	Px		= 0,
1833e12c5d1SDavid du Colombier 	Pe		= 0x66,	/* operand escape */
1843e12c5d1SDavid du Colombier 	Pm		= 0x0f,	/* 2byte opcode escape */
1853e12c5d1SDavid du Colombier 	Pq		= 0xff,	/* both escape */
1863e12c5d1SDavid du Colombier 	Pb		= 0xfe,	/* byte operands */
187375daca8SDavid du Colombier 
188375daca8SDavid du Colombier 	Roffset	= 22,		/* no. bits for offset in relocation address */
189375daca8SDavid du Colombier 	Rindex	= 10,		/* no. bits for index in relocation address */
1903e12c5d1SDavid du Colombier };
1913e12c5d1SDavid du Colombier 
1927dd7cddfSDavid du Colombier EXTERN union
193219b2ee8SDavid du Colombier {
194219b2ee8SDavid du Colombier 	struct
195219b2ee8SDavid du Colombier 	{
1967dd7cddfSDavid du Colombier 		char	obuf[MAXIO];			/* output buffer */
1977dd7cddfSDavid du Colombier 		uchar	ibuf[MAXIO];			/* input buffer */
1987dd7cddfSDavid du Colombier 	} u;
199219b2ee8SDavid du Colombier 	char	dbuf[1];
200219b2ee8SDavid du Colombier } buf;
201219b2ee8SDavid du Colombier 
2027dd7cddfSDavid du Colombier #define	cbuf	u.obuf
2037dd7cddfSDavid du Colombier #define	xbuf	u.ibuf
2047dd7cddfSDavid du Colombier 
205406758d9SDavid du Colombier #pragma	varargck	type	"A"	int
2067dd7cddfSDavid du Colombier #pragma	varargck	type	"A"	uint
2077dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Adr*
2087dd7cddfSDavid du Colombier #pragma	varargck	type	"P"	Prog*
2097dd7cddfSDavid du Colombier #pragma	varargck	type	"R"	int
2106520663fSDavid du Colombier #pragma	varargck	type	"R"	uint
2117dd7cddfSDavid du Colombier #pragma	varargck	type	"S"	char*
2127dd7cddfSDavid du Colombier 
213406758d9SDavid du Colombier #pragma	varargck	argpos	diag 1
214406758d9SDavid du Colombier 
2157dd7cddfSDavid du Colombier EXTERN	long	HEADR;
2167dd7cddfSDavid du Colombier EXTERN	long	HEADTYPE;
2177dd7cddfSDavid du Colombier EXTERN	long	INITDAT;
2187dd7cddfSDavid du Colombier EXTERN	long	INITRND;
2197dd7cddfSDavid du Colombier EXTERN	long	INITTEXT;
220*8153b942SDavid du Colombier EXTERN	long	INITTEXTP;
2217dd7cddfSDavid du Colombier EXTERN	char*	INITENTRY;		/* entry point */
2227dd7cddfSDavid du Colombier EXTERN	Biobuf	bso;
2237dd7cddfSDavid du Colombier EXTERN	long	bsssize;
2247dd7cddfSDavid du Colombier EXTERN	long	casepc;
2257dd7cddfSDavid du Colombier EXTERN	int	cbc;
2267dd7cddfSDavid du Colombier EXTERN	char*	cbp;
2277dd7cddfSDavid du Colombier EXTERN	char*	pcstr;
2287dd7cddfSDavid du Colombier EXTERN	int	cout;
2297dd7cddfSDavid du Colombier EXTERN	Auto*	curauto;
2307dd7cddfSDavid du Colombier EXTERN	Auto*	curhist;
2317dd7cddfSDavid du Colombier EXTERN	Prog*	curp;
2327dd7cddfSDavid du Colombier EXTERN	Prog*	curtext;
2337dd7cddfSDavid du Colombier EXTERN	Prog*	datap;
2347dd7cddfSDavid du Colombier EXTERN	Prog*	edatap;
2357dd7cddfSDavid du Colombier EXTERN	long	datsize;
2367dd7cddfSDavid du Colombier EXTERN	char	debug[128];
2377dd7cddfSDavid du Colombier EXTERN	char	literal[32];
2387dd7cddfSDavid du Colombier EXTERN	Prog*	etextp;
2397dd7cddfSDavid du Colombier EXTERN	Prog*	firstp;
2407dd7cddfSDavid du Colombier EXTERN	char	fnuxi8[8];
2417dd7cddfSDavid du Colombier EXTERN	char	fnuxi4[4];
2427dd7cddfSDavid du Colombier EXTERN	Sym*	hash[NHASH];
2437dd7cddfSDavid du Colombier EXTERN	Sym*	histfrog[MAXHIST];
2447dd7cddfSDavid du Colombier EXTERN	int	histfrogp;
2457dd7cddfSDavid du Colombier EXTERN	int	histgen;
2467dd7cddfSDavid du Colombier EXTERN	char*	library[50];
24780ee5cbfSDavid du Colombier EXTERN	char*	libraryobj[50];
2487dd7cddfSDavid du Colombier EXTERN	int	libraryp;
2497dd7cddfSDavid du Colombier EXTERN	int	xrefresolv;
2507dd7cddfSDavid du Colombier EXTERN	char*	hunk;
2517dd7cddfSDavid du Colombier EXTERN	char	inuxi1[1];
2527dd7cddfSDavid du Colombier EXTERN	char	inuxi2[2];
2537dd7cddfSDavid du Colombier EXTERN	char	inuxi4[4];
2547dd7cddfSDavid du Colombier EXTERN	char	ycover[Ymax*Ymax];
2557dd7cddfSDavid du Colombier EXTERN	uchar*	andptr;
2567dd7cddfSDavid du Colombier EXTERN	uchar	and[30];
2577dd7cddfSDavid du Colombier EXTERN	char	reg[D_NONE];
2587dd7cddfSDavid du Colombier EXTERN	Prog*	lastp;
2597dd7cddfSDavid du Colombier EXTERN	long	lcsize;
2607dd7cddfSDavid du Colombier EXTERN	int	nerrors;
2617dd7cddfSDavid du Colombier EXTERN	long	nhunk;
2627dd7cddfSDavid du Colombier EXTERN	long	nsymbol;
2637dd7cddfSDavid du Colombier EXTERN	char*	noname;
2647dd7cddfSDavid du Colombier EXTERN	char*	outfile;
2657dd7cddfSDavid du Colombier EXTERN	long	pc;
2667dd7cddfSDavid du Colombier EXTERN	long	spsize;
2677dd7cddfSDavid du Colombier EXTERN	Sym*	symlist;
2687dd7cddfSDavid du Colombier EXTERN	long	symsize;
2697dd7cddfSDavid du Colombier EXTERN	Prog*	textp;
2707dd7cddfSDavid du Colombier EXTERN	long	textsize;
2717dd7cddfSDavid du Colombier EXTERN	long	thunk;
2727dd7cddfSDavid du Colombier EXTERN	int	version;
2737dd7cddfSDavid du Colombier EXTERN	Prog	zprg;
2747dd7cddfSDavid du Colombier EXTERN	int	dtype;
2753e12c5d1SDavid du Colombier 
2769a747e4fSDavid du Colombier EXTERN	Adr*	reloca;
277375daca8SDavid du Colombier EXTERN	int	doexp, dlm;
278375daca8SDavid du Colombier EXTERN	int	imports, nimports;
2796520663fSDavid du Colombier EXTERN	int	exports, nexports, allexport;
280375daca8SDavid du Colombier EXTERN	char*	EXPTAB;
2819a747e4fSDavid du Colombier EXTERN	Prog	undefp;
2829a747e4fSDavid du Colombier 
2839a747e4fSDavid du Colombier #define	UP	(&undefp)
2849a747e4fSDavid du Colombier 
2853e12c5d1SDavid du Colombier extern	Optab	optab[];
2863e12c5d1SDavid du Colombier extern	char*	anames[];
2873e12c5d1SDavid du Colombier 
2889a747e4fSDavid du Colombier int	Aconv(Fmt*);
2899a747e4fSDavid du Colombier int	Dconv(Fmt*);
2909a747e4fSDavid du Colombier int	Pconv(Fmt*);
2919a747e4fSDavid du Colombier int	Rconv(Fmt*);
2929a747e4fSDavid du Colombier int	Sconv(Fmt*);
2933e12c5d1SDavid du Colombier void	addhist(long, int);
294b87cd620SDavid du Colombier void	addlibpath(char*);
2953e12c5d1SDavid du Colombier Prog*	appendp(Prog*);
2963e12c5d1SDavid du Colombier void	asmb(void);
297375daca8SDavid du Colombier void	asmdyn(void);
2983e12c5d1SDavid du Colombier void	asmins(Prog*);
2993e12c5d1SDavid du Colombier void	asmlc(void);
3003e12c5d1SDavid du Colombier void	asmsp(void);
3013e12c5d1SDavid du Colombier void	asmsym(void);
3023e12c5d1SDavid du Colombier long	atolwhex(char*);
3033e12c5d1SDavid du Colombier Prog*	brchain(Prog*);
3043e12c5d1SDavid du Colombier Prog*	brloop(Prog*);
3053e12c5d1SDavid du Colombier void	cflush(void);
306375daca8SDavid du Colombier void	ckoff(Sym*, long);
3073e12c5d1SDavid du Colombier Prog*	copyp(Prog*);
3083e12c5d1SDavid du Colombier double	cputime(void);
3093e12c5d1SDavid du Colombier void	datblk(long, long);
3103e12c5d1SDavid du Colombier void	diag(char*, ...);
3113e12c5d1SDavid du Colombier void	dodata(void);
3123e12c5d1SDavid du Colombier void	doinit(void);
3133e12c5d1SDavid du Colombier void	doprof1(void);
3143e12c5d1SDavid du Colombier void	doprof2(void);
3153e12c5d1SDavid du Colombier void	dostkoff(void);
316375daca8SDavid du Colombier void	dynreloc(Sym*, ulong, int);
3173e12c5d1SDavid du Colombier long	entryvalue(void);
3183e12c5d1SDavid du Colombier void	errorexit(void);
319375daca8SDavid du Colombier void	export(void);
320b87cd620SDavid du Colombier int	fileexists(char*);
3213e12c5d1SDavid du Colombier int	find1(long, int);
3223e12c5d1SDavid du Colombier int	find2(long, int);
323b87cd620SDavid du Colombier char*	findlib(char*);
3243e12c5d1SDavid du Colombier void	follow(void);
3253e12c5d1SDavid du Colombier void	gethunk(void);
3263e12c5d1SDavid du Colombier void	histtoauto(void);
3273e12c5d1SDavid du Colombier double	ieeedtod(Ieee*);
3283e12c5d1SDavid du Colombier long	ieeedtof(Ieee*);
329375daca8SDavid du Colombier void	import(void);
3303e12c5d1SDavid du Colombier void	ldobj(int, long, char*);
3317dd7cddfSDavid du Colombier void	loadlib(void);
3323e12c5d1SDavid du Colombier void	listinit(void);
3333e12c5d1SDavid du Colombier Sym*	lookup(char*, int);
3343e12c5d1SDavid du Colombier void	lput(long);
3353e12c5d1SDavid du Colombier void	lputl(long);
336*8153b942SDavid du Colombier void	llput(vlong v);
337*8153b942SDavid du Colombier void	llputl(vlong v);
3383e12c5d1SDavid du Colombier void	main(int, char*[]);
3393e12c5d1SDavid du Colombier void	mkfwd(void);
3407dd7cddfSDavid du Colombier void*	mysbrk(ulong);
3413e12c5d1SDavid du Colombier void	nuxiinit(void);
3423e12c5d1SDavid du Colombier void	objfile(char*);
3433e12c5d1SDavid du Colombier int	opsize(Prog*);
3443e12c5d1SDavid du Colombier void	patch(void);
3453e12c5d1SDavid du Colombier Prog*	prg(void);
346375daca8SDavid du Colombier void	readundefs(char*, int);
3473e12c5d1SDavid du Colombier int	relinv(int);
3483e12c5d1SDavid du Colombier long	reuse(Prog*, Sym*);
3493e12c5d1SDavid du Colombier long	rnd(long, long);
3503e12c5d1SDavid du Colombier void	span(void);
351*8153b942SDavid du Colombier void	strnput(char*, int);
3523e12c5d1SDavid du Colombier void	undef(void);
353375daca8SDavid du Colombier void	undefsym(Sym*);
3549a747e4fSDavid du Colombier long	vaddr(Adr*);
355*8153b942SDavid du Colombier void	wput(long);
356*8153b942SDavid du Colombier void	wputl(long);
3573e12c5d1SDavid du Colombier void	xdefine(char*, int, long);
3583e12c5d1SDavid du Colombier void	xfol(Prog*);
3593e12c5d1SDavid du Colombier int	zaddr(uchar*, Adr*, Sym*[]);
360375daca8SDavid du Colombier void	zerosig(char*);
3616520663fSDavid du Colombier 
3626520663fSDavid du Colombier #pragma	varargck	type	"D"	Adr*
3636520663fSDavid du Colombier #pragma	varargck	type	"P"	Prog*
3646520663fSDavid du Colombier #pragma	varargck	type	"R"	int
3656520663fSDavid du Colombier #pragma	varargck	type	"A"	int
366