Add compiler source to new directory structure

SVN=121164
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
new file mode 100644
index 0000000..ecd33a8
--- /dev/null
+++ b/src/cmd/gc/go.h
@@ -0,0 +1,553 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+todo:
+	1. dyn arrays
+	2. multi
+	3. block 0
+tothinkabout:
+	2. argument in import
+*/
+
+#include	<u.h>
+#include	<libc.h>
+#include	<bio.h>
+
+#ifndef	EXTERN
+#define EXTERN	extern
+#endif
+enum
+{
+	NHUNK		= 50000,
+	BUFSIZ		= 8192,
+	NSYMB		= 500,
+	NHASH		= 1024,
+	STRINGSZ	= 200,
+	YYMAXDEPTH	= 500,
+	MAXALIGN	= 7,
+	UINF		= 100,
+
+	PRIME1		= 3,
+	PRIME2		= 10007,
+	PRIME3		= 10009,
+	PRIME4		= 10037,
+	PRIME5		= 10039,
+	PRIME6		= 10061,
+	PRIME7		= 10067,
+	PRIME8		= 10079,
+	PRIME9		= 10091,
+};
+
+/*
+ * note this is the representation
+ * of the compilers string literals,
+ * it happens to also be the runtime
+ * representation, ignoring sizes and
+ * alignment, but that may change.
+ */
+typedef	struct	String	String;
+struct	String
+{
+	long	len;
+	char	s[3];	// variable
+};
+
+typedef	struct	Val	Val;
+struct	Val
+{
+	int	ctype;
+	double	dval;
+	vlong	vval;
+	String*	sval;
+};
+
+typedef	struct	Sym	Sym;
+typedef	struct	Node	Node;
+typedef	struct	Type	Type;
+
+struct	Type
+{
+	int	etype;
+	int	chan;
+	uchar	recur;		// to detect loops
+	uchar	trecur;		// to detect loops
+	Sym*	sym;
+	long	vargen;		// unique name for OTYPE/ONAME
+
+	// most nodes
+	Type*	type;
+	vlong	width;		// offset in TFIELD, width in all others
+
+	// TFIELD
+	Type*	down;		// also used in TMAP
+
+	// TPTR
+	Type*	nforw;
+
+	// TFUNCT
+	Type*	this;
+	Type*	argout;
+	Type*	argin;
+	Node*	nname;
+
+	uchar	thistuple;
+	uchar	outtuple;
+	uchar	intuple;
+
+	// TARRAY
+	long	bound;
+};
+#define	T	((Type*)0)
+
+struct	Node
+{
+	int	op;
+
+	// most nodes
+	Node*	left;
+	Node*	right;
+	Type*	type;
+
+	// for-body
+	Node*	ninit;
+	Node*	ntest;
+	Node*	nincr;
+	Node*	nbody;
+
+	// if-body
+	Node*	nelse;
+
+	// cases
+	Node*	ncase;
+
+	// func
+	Node*	nname;
+
+	// OLITERAL
+	Val	val;
+
+	Sym*	osym;		// import
+	Sym*	fsym;		// import
+	Sym*	psym;		// import
+	Sym*	sym;		// various
+	uchar	ullman;		// sethi/ullman number
+	uchar	addable;	// type of addressability - 0 is not addressable
+	uchar	trecur;		// to detect loops
+	uchar	etype;		// op for OASOP, etype for OTYPE, exclam for export
+	uchar	class;		// PPARAM, PAUTO, PEXTERN, PSTATIC
+	long	vargen;		// unique name for OTYPE/ONAME
+	ulong	lineno;
+	vlong	xoffset;
+};
+#define	N	((Node*)0)
+
+struct	Sym
+{
+	char*	opackage;	// original package name
+	char*	package;	// package name
+	char*	name;		// variable name
+	Node*	oname;		// ONAME node if a var
+	Type*	otype;		// TYPE node if a type
+	Node*	oconst;		// OLITERAL node if a const
+	Type*	forwtype;	// TPTR iff foreward declared
+	void*	label;		// pointer to Prog* of label
+	vlong	offset;		// stack location if automatic
+	long	lexical;
+	long	vargen;		// unique variable number
+	uchar	undef;		// a diagnostic has been generated
+	uchar	export;		// marked as export
+	uchar	exported;	// has been exported
+	uchar	sym;		// huffman encoding in object file
+	Sym*	link;
+};
+#define	S	((Sym*)0)
+
+typedef	struct	Dcl	Dcl;
+struct	Dcl
+{
+	int	op;
+	Sym*	dsym;		// for printing only
+	Node*	dnode;		// oname
+	Type*	dtype;		// otype
+	long	lineno;
+
+	Dcl*	forw;
+	Dcl*	back;		// sentinel has pointer to last
+};
+#define	D	((Dcl*)0)
+
+typedef	struct	Iter	Iter;
+struct	Iter
+{
+	int	done;
+	Type*	tfunc;
+	Type*	t;
+	Node**	an;
+	Node*	n;
+};
+
+enum
+{
+	OXXX,
+
+	OTYPE, OCONST, OVAR, OEXPORT, OIMPORT,
+
+	ONAME,
+	ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
+	ODCLFUNC, ODCLFIELD, ODCLARG,
+	OLIST, OCMP,
+	OPTR, OARRAY,
+	ORETURN, OFOR, OIF, OSWITCH, OI2S, OS2I, OI2I,
+	OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
+	OGOTO, OPROC, ONEW, OPANIC, OPRINT, OEMPTY,
+
+	OOROR,
+	OANDAND,
+	OEQ, ONE, OLT, OLE, OGE, OGT,
+	OADD, OSUB, OOR, OXOR,
+	OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
+	ODEC, OINC,
+	OLEN,
+	OFUNC,
+	OLABEL,
+	OBREAK,
+	OCONTINUE,
+	OADDR,
+	OIND,
+	OCALL, OCALLMETH, OCALLINTER,
+	OINDEX, OINDEXPTR, OSLICE,
+	ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
+	OLITERAL, OREGISTER, OINDREG,
+	OCONV,
+	OBAD,
+
+	OEND,
+};
+enum
+{
+	Txxx,			// 0
+
+	TINT8,	TUINT8,		// 1
+	TINT16,	TUINT16,
+	TINT32,	TUINT32,
+	TINT64,	TUINT64,
+
+	TFLOAT32,		// 9
+	TFLOAT64,
+	TFLOAT80,
+
+	TBOOL,			// 12
+
+	TPTR32, TPTR64,		// 13
+
+	TFUNC,
+	TARRAY,
+	TDARRAY,
+	TSTRUCT,
+	TCHAN,
+	TMAP,
+	TINTER,
+	TFORW,
+	TFIELD,
+	TANY,
+	TSTRING,
+
+	NTYPE,			// 26
+};
+enum
+{
+	CTxxx,
+
+	CTINT,
+	CTSINT,
+	CTUINT,
+	CTFLT,
+
+	CTSTR,
+	CTBOOL,
+	CTNIL,
+};
+
+enum
+{
+	/* indications for whatis() */
+	Wnil	= 0,
+	Wtnil,
+
+	Wtfloat,
+	Wtint,
+	Wtbool,
+	Wtstr,
+
+	Wlitfloat,
+	Wlitint,
+	Wlitbool,
+	Wlitstr,
+
+	Wtunkn,
+};
+
+enum
+{
+	/* types of channel */
+	Cxxx,
+	Cboth,
+	Crecv,
+	Csend,
+};
+
+enum
+{
+	Pxxx,
+
+	PEXTERN,	// declaration context
+	PAUTO,
+	PPARAM,
+	PSTATIC,
+};
+
+typedef	struct	Io	Io;
+struct	Io
+{
+	char*	infile;
+	Biobuf*	bin;
+	long	lineno;
+	int	peekc;
+	char*	cp;	// used for content when bin==nil
+};
+
+EXTERN	Io	curio;
+EXTERN	Io	pushedio;
+
+EXTERN	char*	outfile;
+EXTERN	char*	package;
+EXTERN	Biobuf*	bout;
+EXTERN	int	nerrors;
+EXTERN	char	namebuf[NSYMB];
+EXTERN	char	debug[256];
+EXTERN	long	dynlineno;
+EXTERN	Sym*	hash[NHASH];
+EXTERN	Sym*	dclstack;
+EXTERN	Sym*	b0stack;
+EXTERN	Sym*	pkgmyname;	// my name for package
+EXTERN	int	tptr;		// either TPTR32 or TPTR64
+extern	char*	sysimport;
+
+EXTERN	Type*	types[NTYPE];
+EXTERN	uchar	isptr[NTYPE];
+EXTERN	uchar	isint[NTYPE];
+EXTERN	uchar	isfloat[NTYPE];
+EXTERN	uchar	issigned[NTYPE];
+EXTERN	uchar	okforeq[NTYPE];
+EXTERN	uchar	okforadd[NTYPE];
+EXTERN	uchar	okforand[NTYPE];
+EXTERN	double	minfloatval[NTYPE];
+EXTERN	double	maxfloatval[NTYPE];
+EXTERN	vlong	minintval[NTYPE];
+EXTERN	vlong	maxintval[NTYPE];
+
+EXTERN	Dcl*	autodcl;
+EXTERN	Dcl*	externdcl;
+EXTERN	Dcl*	exportlist;
+EXTERN	int	dclcontext;	// PEXTERN/PAUTO
+EXTERN	int	importflag;
+
+EXTERN	Node*	booltrue;
+EXTERN	Node*	boolfalse;
+EXTERN	ulong	iota;
+EXTERN	long	vargen;
+EXTERN	long	exportgen;
+
+EXTERN	Node*	retnil;
+EXTERN	Node*	fskel;
+
+EXTERN	char*	context;
+EXTERN	int	thechar;
+EXTERN	char*	thestring;
+EXTERN	char*	hunk;
+EXTERN	long	nhunk;
+EXTERN	long	thunk;
+
+/*
+ *	y.tab.c
+ */
+int	yyparse(void);
+
+/*
+ *	lex.c
+ */
+int	main(int, char*[]);
+void	importfile(Val*);
+void	cannedimports(void);
+void	unimportfile();
+long	yylex(void);
+void	lexinit(void);
+char*	lexname(int);
+long	getr(void);
+int	getnsc(void);
+long	escchar(long, int*);
+int	getc(void);
+void	ungetc(int);
+void	mkpackage(char*);
+
+/*
+ *	mpatof.c
+ */
+int	mpatof(char*, double*);
+int	mpatov(char*, vlong*);
+
+/*
+ *	subr.c
+ */
+void	myexit(int);
+void*	mal(long);
+void*	remal(void*, long, long);
+void	errorexit(void);
+ulong	stringhash(char*);
+Sym*	lookup(char*);
+Sym*	pkglookup(char*, char*);
+void	yyerror(char*, ...);
+void	warn(char*, ...);
+void	fatal(char*, ...);
+Node*	nod(int, Node*, Node*);
+Type*	typ(int);
+Dcl*	dcl(void);
+Node*	rev(Node*);
+Node*	unrev(Node*);
+void	dodump(Node*, int);
+void	dump(char*, Node*);
+Type*	aindex(Node*, Type*);
+int	isnil(Node*);
+int	isptrto(Type*, int);
+int	isinter(Type*);
+int	isbytearray(Type*);
+int	eqtype(Type*, Type*, int);
+int	eqargs(Type*, Type*);
+ulong	typehash(Type*, int);
+void	frame(int);
+Node*	literal(long);
+Node*	dobad(void);
+Node*	nodintconst(long);
+void	ullmancalc(Node*);
+void	badtype(int, Type*, Type*);
+Type*	ptrto(Type*);
+Node*	cleanidlist(Node*);
+
+Type**	getthis(Type*);
+Type**	getoutarg(Type*);
+Type**	getinarg(Type*);
+
+Type*	getthisx(Type*);
+Type*	getoutargx(Type*);
+Type*	getinargx(Type*);
+
+Node*	listfirst(Iter*, Node**);
+Node*	listnext(Iter*);
+Type*	structfirst(Iter*, Type**);
+Type*	structnext(Iter*);
+Type*	funcfirst(Iter*, Type*);
+Type*	funcnext(Iter*);
+
+int	Econv(Fmt*);
+int	Jconv(Fmt*);
+int	Oconv(Fmt*);
+int	Sconv(Fmt*);
+int	Tconv(Fmt*);
+int	Nconv(Fmt*);
+int	Zconv(Fmt*);
+
+/*
+ *	dcl.c
+ */
+void	dodclvar(Node*, Type*);
+void	dodcltype(Type*, Type*);
+void	dodclconst(Node*, Node*);
+void	defaultlit(Node*);
+int	listcount(Node*);
+Node*	methodname(Node*, Type*);
+Type*	functype(Node*, Node*, Node*);
+char*	thistypenam(Node*);
+void	funcnam(Type*, char*);
+void	funchdr(Node*);
+void	funcargs(Type*);
+void	funcbody(Node*);
+Type*	dostruct(Node*, int);
+Type**	stotype(Node*, Type**);
+Type*	sortinter(Type*);
+void	markdcl(char*);
+void	popdcl(char*);
+void	poptodcl(void);
+void	markdclstack(void);
+void	testdclstack(void);
+Sym*	pushdcl(Sym*);
+void	addvar(Node*, Type*, int);
+void	addtyp(Type*, Type*, int);
+Node*	fakethis(void);
+Node*	newname(Sym*);
+Node*	oldname(Sym*);
+Type*	newtype(Sym*);
+Type*	oldtype(Sym*);
+Type*	forwdcl(Sym*);
+
+/*
+ *	export.c
+ */
+void	markexport(Node*);
+void	dumpe(Sym*);
+void	dumpexport(void);
+void	dumpexporttype(Sym*);
+void	dumpexportvar(Sym*);
+void	dumpexportconst(Sym*);
+void	doimportv1(Node*, Node*);
+void	doimportc1(Node*, Val*);
+void	doimportc2(Node*, Node*, Val*);
+void	doimport1(Node*, Node*, Node*);
+void	doimport2(Node*, Val*, Node*);
+void	doimport3(Node*, Node*);
+void	doimport4(Node*, Node*);
+void	doimport5(Node*, Val*);
+void	doimport6(Node*, Node*);
+void	doimport7(Node*, Node*);
+
+/*
+ *	walk.c
+ */
+void	walk(Node*);
+void	walktype(Node*, int);
+Type*	walkswitch(Node*, Node*, Type*(*)(Node*, Type*));
+int	casebody(Node*);
+int	whatis(Node*);
+void	walkdot(Node*);
+Node*	ascompatee(int, Node**, Node**);
+Node*	ascompatet(int, Node**, Type**, int);
+Node*	ascompatte(int, Type**, Node**, int);
+int	ascompat(Type*, Type*);
+Node*	prcompat(Node*);
+Node*	nodpanic(long);
+Node*	newcompat(Node*);
+Node*	stringop(Node*);
+Node*	convas(Node*);
+Node*	reorder(Node*);
+
+/*
+ *	const.c
+ */
+void	convlit(Node*, Type*);
+void	evconst(Node*);
+int	cmpslit(Node *l, Node *r);
+
+/*
+ *	gen.c/gsubr.c/obj.c
+ */
+void	belexinit(int);
+void	besetptr(void);
+vlong	convvtox(vlong, int);
+void	compile(Node*);
+void	proglist(void);
+int	optopop(int);
+void	dumpobj(void);
+void	dowidth(Type*);
+void	argspace(long);
+Node*	nodarg(Type*, int);