blob: c6ee3ab4b35b8ef4267b5b912f5792a0cd8204c5 [file] [log] [blame]
Rob Pike0cafb9e2008-06-04 14:37:38 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5
6#include <u.h>
7#include <libc.h>
8
9#include "../gc/go.h"
10#include "../6l/6.out.h"
11
12#ifndef EXTERN
13#define EXTERN extern
14#endif
15
16typedef struct Prog Prog;
17typedef struct Addr Addr;
18
19struct Addr
20{
21 vlong offset;
22 double dval;
23 Prog* branch;
24 char sval[NSNAME];
25
26 Sym* sym;
27 uchar type;
28 uchar index;
29 uchar etype;
30 uchar scale; /* doubles as width in DATA op */
31};
32#define A ((Addr*)0)
33
34struct Prog
35{
36 short as; // opcode
37 ulong loc; // pc offset in this func
38 ulong lineno; // source line that generated this
39 Addr from; // src address
40 Addr to; // dst address
41 Prog* link; // next instruction in this func
42};
43#define P ((Prog*)0)
44
45typedef struct Plist Plist;
46struct Plist
47{
48 Node* name;
49 Dcl* locals;
50 Prog* firstpc;
51 int recur;
52 Plist* link;
53};
54
55typedef struct Sig Sig;
56struct Sig
57{
58 char* name;
59 Sym* sym;
60 ulong hash;
61 long offset;
62 Sig* link;
63};
64
65typedef struct Case Case;
66struct Case
67{
68 Prog* sprog;
69 Node* scase;
70 Case* slink;
71};
72#define C ((Case*)0)
73
74typedef struct Pool Pool;
75struct Pool
76{
77 String* sval;
78 Pool* link;
79};
80
81EXTERN Prog* continpc;
82EXTERN Prog* breakpc;
83EXTERN Prog* pc;
84EXTERN Prog* firstpc;
85EXTERN Plist* plist;
86EXTERN Plist* plast;
87EXTERN Pool* poolist;
88EXTERN Pool* poolast;
89EXTERN Biobuf* bout;
90EXTERN long dynloc;
91EXTERN uchar reg[D_NONE];
92EXTERN ushort txt[NTYPE*NTYPE];
93EXTERN long maxround;
94EXTERN long widthptr;
Rob Pike0cafb9e2008-06-04 14:37:38 -070095EXTERN Sym* symstringo; // string objects
96EXTERN long stringo; // size of string objects
97EXTERN long pcloc; // instruction counter
98EXTERN String emptystring;
99extern char* anames[];
Ken Thompsonefec14b2008-06-13 18:16:23 -0700100EXTERN Hist* hist;
101EXTERN Prog zprog;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700102
103/*
104 * gen.c
105 */
106void compile(Node*);
107void proglist(void);
108void gen(Node*);
109void swgen(Node*);
110Node* lookdot(Node*, Node*, int);
111void inarggen(void);
112void agen_inter(Node*, Node*);
113void cgen_as(Node*, Node*, int);
Ken Thompsonef61a4c2008-06-12 14:21:09 -0700114void cgen_asop(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700115void cgen_ret(Node*);
Ken Thompson1d31a252008-07-07 17:59:32 -0700116void cgen_call(Node*, int);
117void cgen_callmeth(Node*, int);
118void cgen_callinter(Node*, Node*, int);
119void cgen_proc(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700120void cgen_callret(Node*, Node*);
Ken Thompsond83b9942008-06-06 20:43:29 -0700121void cgen_div(int, Node*, Node*, Node*);
Ken Thompsonf7753f12008-06-07 15:21:02 -0700122void cgen_shift(int, Node*, Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700123void genpanic(void);
124int needconvert(Type*, Type*);
125void genconv(Type*, Type*);
126void allocparams(void);
127
128/*
129 * cgen
130 */
131void cgen(Node*, Node*);
132void agen(Node*, Node*);
133void igen(Node*, Node*, Node*);
134vlong fieldoffset(Type*, Node*);
135void bgen(Node*, int, Prog*);
136void sgen(Node*, Node*, ulong);
137void gmove(Node*, Node*);
138Prog* gins(int, Node*, Node*);
139int samaddr(Node*, Node*);
140void naddr(Node*, Addr*);
141
142/*
143 * gsubr.c
144 */
145void clearp(Prog*);
146void proglist(void);
147Prog* gbranch(int, Type*);
148void patch(Prog*, Prog*);
149Prog* prog(int);
150void gaddoffset(Node*);
151void gconv(int, int);
152int conv2pt(Type*);
153void belexinit(int);
154vlong convvtox(vlong, int);
155int brcom(int);
156int brrev(int);
157void fnparam(Type*, int, int);
158Sig* lsort(Sig*, int(*)(Sig*, Sig*));
159Prog* gop(int, Node*, Node*, Node*);
160void setconst(Addr*, vlong);
161void setaddr(Addr*, Node*);
162int optoas(int, Type*);
163void ginit(void);
164void gclean(void);
165void regalloc(Node*, Type*, Node*);
166void regfree(Node*);
167void regsalloc(Node*, Type*); // replace w tmpvar
168void regret(Node*, Type*);
169Node* nodarg(Type*, int);
170void nodreg(Node*, Type*, int);
171void nodindreg(Node*, Type*, int);
172void nodconst(Node*, Type*, vlong);
173Sym* signame(Type*);
174void nodtypesig(Node*, Type*);
175void gconreg(int, vlong, int);
176void buildtxt(void);
177void stringpool(Node*);
178void tempname(Node*, Type*);
179Plist* newplist(void);
180int isfat(Type*);
181void setmaxarg(Type*);
182
183/*
184 * list.c
185 */
186int Aconv(Fmt*);
187int Dconv(Fmt*);
188int Pconv(Fmt*);
189int Rconv(Fmt*);
190int Yconv(Fmt*);
191void listinit(void);
192
193/*
194 * obj
195 */
196void zname(Biobuf*, Sym*, int);
197void zaddr(Biobuf*, Addr*, int);
198void ieeedtod(Ieee*, double);
199void dumpstrings(void);
200void dumpsignatures(void);
Ken Thompsonefec14b2008-06-13 18:16:23 -0700201void outhist(Biobuf*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700202
203/*
204 * align
205 */
206void dowidth(Type*);
207ulong rnd(ulong, ulong);