summaryrefslogtreecommitdiff
path: root/src/old/c/gen.h
blob: 9ccef592659cdab4b5d8f3c50a82133717d553f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// 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, PSTOREZI,
	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);