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