github.com/spotify/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/cmd/cc/cc.h (about)

     1  // Inferno utils/cc/cc.h
     2  // http://code.google.com/p/inferno-os/source/browse/utils/cc/cc.h
     3  //
     4  //	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
     5  //	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
     6  //	Portions Copyright © 1997-1999 Vita Nuova Limited
     7  //	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
     8  //	Portions Copyright © 2004,2006 Bruce Ellis
     9  //	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
    10  //	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
    11  //	Portions Copyright © 2009 The Go Authors.  All rights reserved.
    12  //
    13  // Permission is hereby granted, free of charge, to any person obtaining a copy
    14  // of this software and associated documentation files (the "Software"), to deal
    15  // in the Software without restriction, including without limitation the rights
    16  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    17  // copies of the Software, and to permit persons to whom the Software is
    18  // furnished to do so, subject to the following conditions:
    19  //
    20  // The above copyright notice and this permission notice shall be included in
    21  // all copies or substantial portions of the Software.
    22  //
    23  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    24  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    25  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
    26  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    27  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    28  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    29  // THE SOFTWARE.
    30  
    31  #include <libc.h>
    32  #include <bio.h>
    33  
    34  #ifndef	EXTERN
    35  #define EXTERN	extern
    36  #endif
    37  
    38  #undef	getc
    39  #undef	ungetc
    40  #undef	BUFSIZ
    41  
    42  #define	getc	ccgetc
    43  #define	ungetc	ccungetc
    44  
    45  typedef	struct	Node	Node;
    46  typedef	struct	Sym	Sym;
    47  typedef	struct	Type	Type;
    48  typedef	struct	Funct	Funct;
    49  typedef	struct	Decl	Decl;
    50  typedef	struct	Io	Io;
    51  typedef	struct	Hist	Hist;
    52  typedef	struct	Term	Term;
    53  typedef	struct	Init	Init;
    54  typedef	struct	Bits	Bits;
    55  typedef	struct	Bvec	Bvec;
    56  typedef	struct	Dynimp	Dynimp;
    57  typedef	struct	Dynexp	Dynexp;
    58  
    59  typedef	Rune	TRune;	/* target system type */
    60  
    61  #define	BUFSIZ		8192
    62  #define	NSYMB		500
    63  #define	NHASH		1024
    64  #define	STRINGSZ	200
    65  #define	HISTSZ		20
    66  #define YYMAXDEPTH	500
    67  #define	NTERM		10
    68  #define	MAXALIGN	7
    69  
    70  #define	SIGN(n)		((uvlong)1<<(n-1))
    71  #define	MASK(n)		(SIGN(n)|(SIGN(n)-1))
    72  
    73  #define	BITS	5
    74  #define	NVAR	(BITS*sizeof(uint32)*8)
    75  struct	Bits
    76  {
    77  	uint32	b[BITS];
    78  };
    79  
    80  struct Bvec
    81  {
    82  	int32	n;	// number of bits
    83  	uint32	b[];
    84  };
    85  
    86  struct	Node
    87  {
    88  	Node*	left;
    89  	Node*	right;
    90  	void*	label;
    91  	int32	pc;
    92  	int	reg;
    93  	int32	xoffset;
    94  	double	fconst;		/* fp constant */
    95  	vlong	vconst;		/* non fp const */
    96  	char*	cstring;	/* character string */
    97  	TRune*	rstring;	/* rune string */
    98  
    99  	Sym*	sym;
   100  	Type*	type;
   101  	int32	lineno;
   102  	uchar	op;
   103  	uchar	oldop;
   104  	uchar	xcast;
   105  	uchar	class;
   106  	uchar	etype;
   107  	uchar	complex;
   108  	uchar	addable;
   109  	uchar	scale;
   110  	uchar	garb;
   111  };
   112  #define	Z	((Node*)0)
   113  
   114  struct	Sym
   115  {
   116  	Sym*	link;
   117  	Type*	type;
   118  	Type*	suetag;
   119  	Type*	tenum;
   120  	char*	macro;
   121  	int32	varlineno;
   122  	int32	offset;
   123  	vlong	vconst;
   124  	double	fconst;
   125  	Node*	label;
   126  	ushort	lexical;
   127  	char	*name;
   128  	ushort	block;
   129  	ushort	sueblock;
   130  	uchar	class;
   131  	uchar	sym;
   132  	uchar	aused;
   133  	uchar	sig;
   134  	uchar	dataflag;
   135  };
   136  #define	S	((Sym*)0)
   137  
   138  enum{
   139  	SIGNONE = 0,
   140  	SIGDONE = 1,
   141  	SIGINTERN = 2,
   142  
   143  	SIGNINTERN = 1729*325*1729,
   144  };
   145  
   146  struct	Decl
   147  {
   148  	Decl*	link;
   149  	Sym*	sym;
   150  	Type*	type;
   151  	int32	varlineno;
   152  	int32	offset;
   153  	short	val;
   154  	ushort	block;
   155  	uchar	class;
   156  	uchar	aused;
   157  };
   158  #define	D	((Decl*)0)
   159  
   160  struct	Type
   161  {
   162  	Sym*	sym;
   163  	Sym*	tag;
   164  	Funct*	funct;
   165  	Type*	link;
   166  	Type*	down;
   167  	int32	width;
   168  	int32	offset;
   169  	int32	lineno;
   170  	uchar	shift;
   171  	uchar	nbits;
   172  	uchar	etype;
   173  	uchar	garb;
   174  	uchar	align;
   175  };
   176  
   177  #define	T	((Type*)0)
   178  #define	NODECL	((void(*)(int, Type*, Sym*))0)
   179  
   180  struct	Init			/* general purpose initialization */
   181  {
   182  	int	code;
   183  	uint32	value;
   184  	char*	s;
   185  };
   186  
   187  EXTERN struct
   188  {
   189  	char*	p;
   190  	int	c;
   191  } fi;
   192  
   193  struct	Io
   194  {
   195  	Io*	link;
   196  	char*	p;
   197  	char	b[BUFSIZ];
   198  	short	c;
   199  	short	f;
   200  };
   201  #define	I	((Io*)0)
   202  
   203  struct	Hist
   204  {
   205  	Hist*	link;
   206  	char*	name;
   207  	int32	line;
   208  	int32	offset;
   209  };
   210  #define	H	((Hist*)0)
   211  EXTERN Hist*	hist;
   212  
   213  struct	Term
   214  {
   215  	vlong	mult;
   216  	Node	*node;
   217  };
   218  
   219  enum
   220  {
   221  	Axxx,
   222  	Ael1,
   223  	Ael2,
   224  	Asu2,
   225  	Aarg0,
   226  	Aarg1,
   227  	Aarg2,
   228  	Aaut3,
   229  	NALIGN,
   230  };
   231  
   232  enum
   233  {
   234  	DMARK,
   235  	DAUTO,
   236  	DSUE,
   237  	DLABEL,
   238  };
   239  enum
   240  {
   241  	OXXX,
   242  	OADD,
   243  	OADDR,
   244  	OAND,
   245  	OANDAND,
   246  	OARRAY,
   247  	OAS,
   248  	OASI,
   249  	OASADD,
   250  	OASAND,
   251  	OASASHL,
   252  	OASASHR,
   253  	OASDIV,
   254  	OASHL,
   255  	OASHR,
   256  	OASLDIV,
   257  	OASLMOD,
   258  	OASLMUL,
   259  	OASLSHR,
   260  	OASMOD,
   261  	OASMUL,
   262  	OASOR,
   263  	OASSUB,
   264  	OASXOR,
   265  	OBIT,
   266  	OBREAK,
   267  	OCASE,
   268  	OCAST,
   269  	OCOMMA,
   270  	OCOND,
   271  	OCONST,
   272  	OCONTINUE,
   273  	ODIV,
   274  	ODOT,
   275  	ODOTDOT,
   276  	ODWHILE,
   277  	OENUM,
   278  	OEQ,
   279  	OEXREG,
   280  	OFOR,
   281  	OFUNC,
   282  	OGE,
   283  	OGOTO,
   284  	OGT,
   285  	OHI,
   286  	OHS,
   287  	OIF,
   288  	OIND,
   289  	OINDREG,
   290  	OINIT,
   291  	OLABEL,
   292  	OLDIV,
   293  	OLE,
   294  	OLIST,
   295  	OLMOD,
   296  	OLMUL,
   297  	OLO,
   298  	OLS,
   299  	OLSHR,
   300  	OLT,
   301  	OMOD,
   302  	OMUL,
   303  	ONAME,
   304  	ONE,
   305  	ONOT,
   306  	OOR,
   307  	OOROR,
   308  	OPOSTDEC,
   309  	OPOSTINC,
   310  	OPREDEC,
   311  	OPREINC,
   312  	OPREFETCH,
   313  	OPROTO,
   314  	OREGISTER,
   315  	ORETURN,
   316  	OSET,
   317  	OSIGN,
   318  	OSIZE,
   319  	OSTRING,
   320  	OLSTRING,
   321  	OSTRUCT,
   322  	OSUB,
   323  	OSWITCH,
   324  	OUNION,
   325  	OUSED,
   326  	OWHILE,
   327  	OXOR,
   328  	ONEG,
   329  	OCOM,
   330  	OPOS,
   331  	OELEM,
   332  
   333  	OTST,		/* used in some compilers */
   334  	OINDEX,
   335  	OFAS,
   336  	OREGPAIR,
   337  	OROTL,
   338  
   339  	OEND
   340  };
   341  enum
   342  {
   343  	TXXX,
   344  	TCHAR,
   345  	TUCHAR,
   346  	TSHORT,
   347  	TUSHORT,
   348  	TINT,
   349  	TUINT,
   350  	TLONG,
   351  	TULONG,
   352  	TVLONG,
   353  	TUVLONG,
   354  	TFLOAT,
   355  	TDOUBLE,
   356  	TIND,
   357  	TFUNC,
   358  	TARRAY,
   359  	TVOID,
   360  	TSTRUCT,
   361  	TUNION,
   362  	TENUM,
   363  	NTYPE,
   364  
   365  	TAUTO	= NTYPE,
   366  	TEXTERN,
   367  	TSTATIC,
   368  	TTYPEDEF,
   369  	TTYPESTR,
   370  	TREGISTER,
   371  	TCONSTNT,
   372  	TVOLATILE,
   373  	TUNSIGNED,
   374  	TSIGNED,
   375  	TDOT,
   376  	TFILE,
   377  	TOLD,
   378  	NALLTYPES,
   379  
   380  	/* adapt size of Rune to target system's size */
   381  	TRUNE = sizeof(TRune)==4? TUINT: TUSHORT,
   382  };
   383  enum
   384  {
   385  	CXXX,
   386  	CAUTO,
   387  	CEXTERN,
   388  	CGLOBL,
   389  	CSTATIC,
   390  	CLOCAL,
   391  	CTYPEDEF,
   392  	CTYPESTR,
   393  	CPARAM,
   394  	CSELEM,
   395  	CLABEL,
   396  	CEXREG,
   397  	NCTYPES,
   398  };
   399  enum
   400  {
   401  	GXXX		= 0,
   402  	GCONSTNT	= 1<<0,
   403  	GVOLATILE	= 1<<1,
   404  	NGTYPES		= 1<<2,
   405  
   406  	GINCOMPLETE	= 1<<2,
   407  };
   408  enum
   409  {
   410  	BCHAR		= 1L<<TCHAR,
   411  	BUCHAR		= 1L<<TUCHAR,
   412  	BSHORT		= 1L<<TSHORT,
   413  	BUSHORT		= 1L<<TUSHORT,
   414  	BINT		= 1L<<TINT,
   415  	BUINT		= 1L<<TUINT,
   416  	BLONG		= 1L<<TLONG,
   417  	BULONG		= 1L<<TULONG,
   418  	BVLONG		= 1L<<TVLONG,
   419  	BUVLONG		= 1L<<TUVLONG,
   420  	BFLOAT		= 1L<<TFLOAT,
   421  	BDOUBLE		= 1L<<TDOUBLE,
   422  	BIND		= 1L<<TIND,
   423  	BFUNC		= 1L<<TFUNC,
   424  	BARRAY		= 1L<<TARRAY,
   425  	BVOID		= 1L<<TVOID,
   426  	BSTRUCT		= 1L<<TSTRUCT,
   427  	BUNION		= 1L<<TUNION,
   428  	BENUM		= 1L<<TENUM,
   429  	BFILE		= 1L<<TFILE,
   430  	BDOT		= 1L<<TDOT,
   431  	BCONSTNT	= 1L<<TCONSTNT,
   432  	BVOLATILE	= 1L<<TVOLATILE,
   433  	BUNSIGNED	= 1L<<TUNSIGNED,
   434  	BSIGNED		= 1L<<TSIGNED,
   435  	BAUTO		= 1L<<TAUTO,
   436  	BEXTERN		= 1L<<TEXTERN,
   437  	BSTATIC		= 1L<<TSTATIC,
   438  	BTYPEDEF	= 1L<<TTYPEDEF,
   439  	BTYPESTR	= 1L<<TTYPESTR,
   440  	BREGISTER	= 1L<<TREGISTER,
   441  
   442  	BINTEGER	= BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
   443  				BLONG|BULONG|BVLONG|BUVLONG,
   444  	BNUMBER		= BINTEGER|BFLOAT|BDOUBLE,
   445  
   446  /* these can be overloaded with complex types */
   447  
   448  	BCLASS		= BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
   449  	BGARB		= BCONSTNT|BVOLATILE,
   450  };
   451  
   452  struct	Funct
   453  {
   454  	Sym*	sym[OEND];
   455  	Sym*	castto[NTYPE];
   456  	Sym*	castfr[NTYPE];
   457  };
   458  
   459  EXTERN struct
   460  {
   461  	Type*	tenum;		/* type of entire enum */
   462  	Type*	cenum;		/* type of current enum run */
   463  	vlong	lastenum;	/* value of current enum */
   464  	double	floatenum;	/* value of current enum */
   465  } en;
   466  
   467  EXTERN	int	autobn;
   468  EXTERN	int32	autoffset;
   469  EXTERN	int	blockno;
   470  EXTERN	Decl*	dclstack;
   471  EXTERN	int	debug[256];
   472  EXTERN	Hist*	ehist;
   473  EXTERN	int32	firstbit;
   474  EXTERN	Sym*	firstarg;
   475  EXTERN	Type*	firstargtype;
   476  EXTERN	Decl*	firstdcl;
   477  EXTERN	int	fperror;
   478  EXTERN	Sym*	hash[NHASH];
   479  EXTERN	char*	hunk;
   480  EXTERN	char**	include;
   481  EXTERN	Io*	iofree;
   482  EXTERN	Io*	ionext;
   483  EXTERN	Io*	iostack;
   484  EXTERN	int32	lastbit;
   485  EXTERN	char	lastclass;
   486  EXTERN	Type*	lastdcl;
   487  EXTERN	int32	lastfield;
   488  EXTERN	Type*	lasttype;
   489  EXTERN	int32	lineno;
   490  EXTERN	int32	nearln;
   491  EXTERN	int	nerrors;
   492  EXTERN	int	newflag;
   493  EXTERN	int32	nhunk;
   494  EXTERN	int	ninclude;
   495  EXTERN	Node*	nodproto;
   496  EXTERN	Node*	nodcast;
   497  EXTERN	int32	nsymb;
   498  EXTERN	Biobuf	outbuf;
   499  EXTERN	Biobuf	diagbuf;
   500  EXTERN	char*	outfile;
   501  EXTERN	char*	pathname;
   502  EXTERN	int	peekc;
   503  EXTERN	int32	stkoff;
   504  EXTERN	Type*	strf;
   505  EXTERN	Type*	strl;
   506  EXTERN	char*	symb;
   507  EXTERN	Sym*	symstring;
   508  EXTERN	int	taggen;
   509  EXTERN	Type*	tfield;
   510  EXTERN	Type*	tufield;
   511  EXTERN	int	thechar;
   512  EXTERN	char*	thestring;
   513  EXTERN	Type*	thisfn;
   514  EXTERN	int32	thunk;
   515  EXTERN	Type*	types[NALLTYPES];
   516  EXTERN	Type*	fntypes[NALLTYPES];
   517  EXTERN	Node*	initlist;
   518  EXTERN	Term	term[NTERM];
   519  EXTERN	int	nterm;
   520  EXTERN	int	packflg;
   521  EXTERN	int	fproundflg;
   522  EXTERN	int	textflag;
   523  EXTERN	int	dataflag;
   524  EXTERN	int	flag_largemodel;
   525  EXTERN	int	ncontin;
   526  EXTERN	int	canreach;
   527  EXTERN	int	warnreach;
   528  EXTERN	Bits	zbits;
   529  EXTERN	Fmt	pragcgobuf;
   530  
   531  extern	char	*onames[], *tnames[], *gnames[];
   532  extern	char	*cnames[], *qnames[], *bnames[];
   533  extern	uchar	tab[NTYPE][NTYPE];
   534  extern	uchar	comrel[], invrel[], logrel[];
   535  extern	int32	ncast[], tadd[], tand[];
   536  extern	int32	targ[], tasadd[], tasign[], tcast[];
   537  extern	int32	tdot[], tfunct[], tindir[], tmul[];
   538  extern	int32	tnot[], trel[], tsub[];
   539  
   540  extern	uchar	typeaf[];
   541  extern	uchar	typefd[];
   542  extern	uchar	typei[];
   543  extern	uchar	typesu[];
   544  extern	uchar	typesuv[];
   545  extern	uchar	typeu[];
   546  extern	uchar	typev[];
   547  extern	uchar	typec[];
   548  extern	uchar	typeh[];
   549  extern	uchar	typeil[];
   550  extern	uchar	typeilp[];
   551  extern	uchar	typechl[];
   552  extern	uchar	typechlv[];
   553  extern	uchar	typechlvp[];
   554  extern	uchar	typechlp[];
   555  extern	uchar	typechlpfd[];
   556  
   557  EXTERN	uchar*	typeword;
   558  EXTERN	uchar*	typecmplx;
   559  
   560  extern	uint32	thash1;
   561  extern	uint32	thash2;
   562  extern	uint32	thash3;
   563  extern	uint32	thash[];
   564  
   565  /*
   566   *	compat.c/unix.c/windows.c
   567   */
   568  int	systemtype(int);
   569  int	pathchar(void);
   570  
   571  /*
   572   *	parser
   573   */
   574  int	yyparse(void);
   575  int	mpatov(char*, vlong*);
   576  
   577  /*
   578   *	lex.c
   579   */
   580  void*	allocn(void*, int32, int32);
   581  void*	alloc(int32);
   582  void    ensuresymb(int32);
   583  void	cinit(void);
   584  int	compile(char*, char**, int);
   585  void	errorexit(void);
   586  int	filbuf(void);
   587  int	getc(void);
   588  int32	getr(void);
   589  int	getnsc(void);
   590  Sym*	lookup(void);
   591  void	main(int, char*[]);
   592  void	newfile(char*, int);
   593  void	newio(void);
   594  void	pushio(void);
   595  int32	escchar(int32, int, int);
   596  Sym*	slookup(char*);
   597  void	syminit(Sym*);
   598  void	unget(int);
   599  int32	yylex(void);
   600  int	Lconv(Fmt*);
   601  int	Tconv(Fmt*);
   602  int	FNconv(Fmt*);
   603  int	Oconv(Fmt*);
   604  int	Qconv(Fmt*);
   605  int	VBconv(Fmt*);
   606  void	setinclude(char*);
   607  
   608  /*
   609   * mac.c
   610   */
   611  void	dodefine(char*);
   612  void	domacro(void);
   613  Sym*	getsym(void);
   614  int32	getnsn(void);
   615  void	linehist(char*, int);
   616  void	macdef(void);
   617  void	macprag(void);
   618  void	macend(void);
   619  void	macexpand(Sym*, char*);
   620  void	macif(int);
   621  void	macinc(void);
   622  void	maclin(void);
   623  void	macund(void);
   624  
   625  /*
   626   * dcl.c
   627   */
   628  Node*	doinit(Sym*, Type*, int32, Node*);
   629  Type*	tcopy(Type*);
   630  Node*	init1(Sym*, Type*, int32, int);
   631  Node*	newlist(Node*, Node*);
   632  void	adecl(int, Type*, Sym*);
   633  int	anyproto(Node*);
   634  void	argmark(Node*, int);
   635  void	dbgdecl(Sym*);
   636  Node*	dcllabel(Sym*, int);
   637  Node*	dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
   638  Sym*	mkstatic(Sym*);
   639  void	doenum(Sym*, Node*);
   640  void	snap(Type*);
   641  Type*	dotag(Sym*, int, int);
   642  void	edecl(int, Type*, Sym*);
   643  Type*	fnproto(Node*);
   644  Type*	fnproto1(Node*);
   645  void	markdcl(void);
   646  Type*	paramconv(Type*, int);
   647  void	pdecl(int, Type*, Sym*);
   648  Decl*	push(void);
   649  Decl*	push1(Sym*);
   650  Node*	revertdcl(void);
   651  int32	xround(int32, int);
   652  int	rsametype(Type*, Type*, int, int);
   653  int	sametype(Type*, Type*);
   654  uint32	sign(Sym*);
   655  uint32	signature(Type*);
   656  void	sualign(Type*);
   657  void	tmerge(Type*, Sym*);
   658  void	walkparam(Node*, int);
   659  void	xdecl(int, Type*, Sym*);
   660  Node*	contig(Sym*, Node*, int32);
   661  
   662  /*
   663   * com.c
   664   */
   665  void	ccom(Node*);
   666  void	complex(Node*);
   667  int	tcom(Node*);
   668  int	tcoma(Node*, Node*, Type*, int);
   669  int	tcomd(Node*);
   670  int	tcomo(Node*, int);
   671  int	tcomx(Node*);
   672  int	tlvalue(Node*);
   673  void	constas(Node*, Type*, Type*);
   674  
   675  /*
   676   * con.c
   677   */
   678  void	acom(Node*);
   679  void	acom1(vlong, Node*);
   680  void	acom2(Node*, Type*);
   681  int	acomcmp1(const void*, const void*);
   682  int	acomcmp2(const void*, const void*);
   683  int	addo(Node*);
   684  void	evconst(Node*);
   685  
   686  /*
   687   * funct.c
   688   */
   689  int	isfunct(Node*);
   690  void	dclfunct(Type*, Sym*);
   691  
   692  /*
   693   * sub.c
   694   */
   695  void	arith(Node*, int);
   696  int	deadheads(Node*);
   697  Type*	dotsearch(Sym*, Type*, Node*, int32*);
   698  int32	dotoffset(Type*, Type*, Node*);
   699  void	gethunk(void);
   700  Node*	invert(Node*);
   701  int	bitno(int32);
   702  void	makedot(Node*, Type*, int32);
   703  int	mixedasop(Type*, Type*);
   704  Node*	new(int, Node*, Node*);
   705  Node*	new1(int, Node*, Node*);
   706  int	nilcast(Type*, Type*);
   707  int	nocast(Type*, Type*);
   708  void	prtree(Node*, char*);
   709  void	prtree1(Node*, int, int);
   710  void	relcon(Node*, Node*);
   711  int	relindex(int);
   712  int	simpleg(int32);
   713  Type*	garbt(Type*, int32);
   714  int	simplec(int32);
   715  Type*	simplet(int32);
   716  int	stcompat(Node*, Type*, Type*, int32[]);
   717  int	tcompat(Node*, Type*, Type*, int32[]);
   718  void	tinit(void);
   719  Type*	typ(int, Type*);
   720  Type*	copytyp(Type*);
   721  void	typeext(Type*, Node*);
   722  void	typeext1(Type*, Node*);
   723  int	side(Node*);
   724  int	vconst(Node*);
   725  int	xlog2(uvlong);
   726  int	vlog(Node*);
   727  int	topbit(uint32);
   728  void	simplifyshift(Node*);
   729  int32	typebitor(int32, int32);
   730  void	diag(Node*, char*, ...);
   731  void	warn(Node*, char*, ...);
   732  void	yyerror(char*, ...);
   733  void	fatal(Node*, char*, ...);
   734  
   735  /*
   736   * acid.c
   737   */
   738  void	acidtype(Type*);
   739  void	acidvar(Sym*);
   740  
   741  /*
   742   * godefs.c
   743   */
   744  int	Uconv(Fmt*);
   745  void	godeftype(Type*);
   746  void	godefvar(Sym*);
   747  
   748  /*
   749   * bits.c
   750   */
   751  Bits	bor(Bits, Bits);
   752  Bits	band(Bits, Bits);
   753  Bits	bnot(Bits);
   754  int	bany(Bits*);
   755  int	bnum(Bits);
   756  Bits	blsh(uint);
   757  int	beq(Bits, Bits);
   758  int	bset(Bits, uint);
   759  
   760  /*
   761   *	bv.c
   762   */
   763  Bvec*	bvalloc(int32 n);
   764  void	bvset(Bvec *bv, int32 i);
   765  
   766  /*
   767   * dpchk.c
   768   */
   769  void	dpcheck(Node*);
   770  void	arginit(void);
   771  void	pragvararg(void);
   772  void	pragpack(void);
   773  void	pragfpround(void);
   774  void	pragdataflag(void);
   775  void	pragtextflag(void);
   776  void	pragincomplete(void);
   777  void	pragcgo(char*);
   778  
   779  /*
   780   * calls to machine depend part
   781   */
   782  void	codgen(Node*, Node*);
   783  void	gclean(void);
   784  void	gextern(Sym*, Node*, int32, int32);
   785  void	ginit(void);
   786  int32	outstring(char*, int32);
   787  int32	outlstring(TRune*, int32);
   788  void	sextern(Sym*, Node*, int32, int32);
   789  void	xcom(Node*);
   790  int32	exreg(Type*);
   791  int32	align(int32, Type*, int, int32*);
   792  int32	maxround(int32, int32);
   793  int	hasdotdotdot(void);
   794  
   795  extern	schar	ewidth[];
   796  
   797  /*
   798   * com64
   799   */
   800  int	com64(Node*);
   801  void	com64init(void);
   802  void	bool64(Node*);
   803  double	convvtof(vlong);
   804  vlong	convftov(double);
   805  double	convftox(double, int);
   806  vlong	convvtox(vlong, int);
   807  
   808  /*
   809   * machcap
   810   */
   811  int	machcap(Node*);
   812  
   813  #pragma	varargck	argpos	warn	2
   814  #pragma	varargck	argpos	diag	2
   815  #pragma	varargck	argpos	yyerror	1
   816  
   817  #pragma	varargck	type	"F"	Node*
   818  #pragma	varargck	type	"L"	int32
   819  #pragma	varargck	type	"Q"	int32
   820  #pragma	varargck	type	"O"	int
   821  #pragma	varargck	type	"O"	uint
   822  #pragma	varargck	type	"T"	Type*
   823  #pragma	varargck	type	"U"	char*
   824  #pragma	varargck	type	"|"	int
   825  
   826  enum
   827  {
   828  	Plan9	= 1<<0,
   829  	Unix	= 1<<1,
   830  	Windows	= 1<<2,
   831  };
   832  int	pathchar(void);
   833  int	systemtype(int);
   834  void*	alloc(int32 n);
   835  void*	allocn(void*, int32, int32);