// 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.

#ifndef	EXTERN
#define EXTERN	extern
#endif

typedef	struct	Prog	Prog;
typedef	struct	Addr	Addr;

struct	Addr
{
	int	type;
	Node*	node;
	Prog*	branch;
};

enum
{
	AXXX		= 0,
	ANONE,
	ANODE,
	ABRANCH,
};

struct	Prog
{
	int	op;			// opcode
	int	pt;
	int	pt1;
	int	param;
	long	lineno;			// source line
	long	loc;			// program counter for print
	int	mark;
	Addr	addr;			// operand
	Prog*	link;
};
#define	P	((Prog*)0)

typedef	struct	Plist	Plist;
struct	Plist
{
	Node*	name;
	Dcl*	locals;
	Prog*	firstpc;
	int	recur;
	Plist*	link;
};

typedef	struct	Sig	Sig;
struct Sig
{
	char*	fun;
	ulong	hash;
	int	offset;
	Sig*	link;
};

enum
{
	PTxxx,

	PTINT8		= TINT8,
	PTUINT8		= TUINT8,
	PTINT16		= TINT16,
	PTUINT16	= TUINT16,
	PTINT32		= TINT32,
	PTUINT32	= TUINT32,
	PTINT64		= TINT64,
	PTUINT64	= TUINT64,
	PTFLOAT32	= TFLOAT32,
	PTFLOAT64	= TFLOAT64,
	PTFLOAT80	= TFLOAT80,
	PTBOOL		= TBOOL,
	PTPTR		= TPTR,
	PTSTRUCT	= TSTRUCT,
	PTINTER		= TINTER,
	PTARRAY		= TARRAY,
	PTSTRING	= TSTRING,
	PTCHAN		= TCHAN,
	PTMAP		= TMAP,

	PTNIL		= NTYPE,
	PTADDR,
	PTERROR,

	NPTYPE,
};

enum
{
	PXXX		= 0,

	PERROR, PPANIC, PPRINT, PGOTO, PGOTOX,

	PCMP, PTEST, PNEW, PLEN,
	PCALL1, PCALL2, PCALLI2, PCALLM2, PCALLF2, PCALL3, PRETURN,

	PBEQ, PBNE,
	PBLT, PBLE, PBGE, PBGT,
	PBTRUE, PBFALSE,

	PLOAD, PLOADI,
	PSTORE, PSTOREI,
	PSTOREZ, PSTOREZIP,
	PCONV, PADDR, PADDO, PINDEX, PINDEXZ,
	PSLICE,

	PADD, PSUB, PMUL, PDIV, PLSH, PRSH, PMOD,
	PAND, POR, PXOR, PCAT,

	PMINUS, PCOM,

	PEND,
};

typedef	struct	Case Case;
struct	Case
{
	Prog*	sprog;
	Node*	scase;
	Case*	slink;
};
#define	C	((Case*)0)

EXTERN	Prog*	continpc;
EXTERN	Prog*	breakpc;
EXTERN	Prog*	pc;
EXTERN	Prog*	firstpc;
EXTERN	Plist*	plist;
EXTERN	Plist*	plast;
EXTERN	Biobuf*	bout;
EXTERN	long	dynloc;

/*
 * gen.c
 */
void	compile(Node*);
void	proglist(void);
void	gen(Node*);
void	cgen(Node*);
void	agen(Node*);
void	bgen(Node*, int, Prog*);
void	swgen(Node*);
Node*	lookdot(Node*, Node*, int);
int	usesptr(Node*);
void	inarggen(void);
void	cgen_as(Node*, Node*, int, int);
void	cgen_asop(Node*, Node*, int);
void	cgen_ret(Node*);
void	cgen_call(Node*, int);
void	cgen_callret(Node*, Node*);
void	genprint(Node*);
int	needconvert(Node*, Node*);
void	genconv(Node*, Node*);
void	genindex(Node*);

/*
 * gsubr.c
 */
int	Aconv(Fmt*);
int	Pconv(Fmt*);
void	proglist(void);
Prog*	gbranch(int, Node*);
void	patch(Prog*, Prog*);
Prog*	prog(int);
Node*	tempname(Node*);
Prog*	gopcode(int, int, Node*);
Prog*	gopcodet(int, Node*, Node*);
void	gaddoffset(Node*);
void	gconv(int, int);
int	conv2pt(Node*);
void	belexinit(int);
vlong	convvtox(vlong, int);
int	brcom(int);
int	brrev(int);
void	fnparam(Node*, int, int);
Sig*	lsort(Sig*, int(*)(Sig*, Sig*));

/*
 * obj.c
 */
void	dumpobj(void);
void	litrl(Prog*);
void	obj(Prog*);
void	follow(Prog*);
Prog*	gotochain(Prog*);
int	Xconv(Fmt*);
int	Rconv(Fmt*);
int	Qconv(Fmt*);
int	Dconv(Fmt*);
int	Cconv(Fmt*);
void	dumpexterns(void);
void	dumpfunct(Plist*);
void	dumpsignatures(void);
void	doframe(Dcl*, char*);
void	docall1(Prog*);
void	docall2(Prog*);
void	docalli2(Prog*);
void	docallm2(Prog*);
void	docallf2(Prog*);
void	docall3(Prog*);
void	doconv(Prog*);
char*	getfmt(int);
void	dumpmethods(void);
