Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 1 | // 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 | |
| 16 | typedef struct Prog Prog; |
| 17 | typedef struct Addr Addr; |
| 18 | |
| 19 | struct 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 | |
| 34 | struct 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 | |
| 45 | typedef struct Plist Plist; |
| 46 | struct Plist |
| 47 | { |
| 48 | Node* name; |
| 49 | Dcl* locals; |
| 50 | Prog* firstpc; |
| 51 | int recur; |
| 52 | Plist* link; |
| 53 | }; |
| 54 | |
| 55 | typedef struct Sig Sig; |
| 56 | struct Sig |
| 57 | { |
| 58 | char* name; |
| 59 | Sym* sym; |
| 60 | ulong hash; |
| 61 | long offset; |
| 62 | Sig* link; |
| 63 | }; |
| 64 | |
| 65 | typedef struct Case Case; |
| 66 | struct Case |
| 67 | { |
| 68 | Prog* sprog; |
| 69 | Node* scase; |
| 70 | Case* slink; |
| 71 | }; |
| 72 | #define C ((Case*)0) |
| 73 | |
| 74 | typedef struct Pool Pool; |
| 75 | struct Pool |
| 76 | { |
| 77 | String* sval; |
| 78 | Pool* link; |
| 79 | }; |
| 80 | |
| 81 | EXTERN Prog* continpc; |
| 82 | EXTERN Prog* breakpc; |
| 83 | EXTERN Prog* pc; |
| 84 | EXTERN Prog* firstpc; |
| 85 | EXTERN Plist* plist; |
| 86 | EXTERN Plist* plast; |
| 87 | EXTERN Pool* poolist; |
| 88 | EXTERN Pool* poolast; |
| 89 | EXTERN Biobuf* bout; |
| 90 | EXTERN long dynloc; |
| 91 | EXTERN uchar reg[D_NONE]; |
| 92 | EXTERN ushort txt[NTYPE*NTYPE]; |
| 93 | EXTERN long maxround; |
| 94 | EXTERN long widthptr; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 95 | EXTERN Sym* symstringo; // string objects |
| 96 | EXTERN long stringo; // size of string objects |
| 97 | EXTERN long pcloc; // instruction counter |
| 98 | EXTERN String emptystring; |
| 99 | extern char* anames[]; |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 100 | EXTERN Hist* hist; |
| 101 | EXTERN Prog zprog; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 102 | |
| 103 | /* |
| 104 | * gen.c |
| 105 | */ |
| 106 | void compile(Node*); |
| 107 | void proglist(void); |
| 108 | void gen(Node*); |
| 109 | void swgen(Node*); |
| 110 | Node* lookdot(Node*, Node*, int); |
| 111 | void inarggen(void); |
| 112 | void agen_inter(Node*, Node*); |
| 113 | void cgen_as(Node*, Node*, int); |
Ken Thompson | ef61a4c | 2008-06-12 14:21:09 -0700 | [diff] [blame] | 114 | void cgen_asop(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 115 | void cgen_ret(Node*); |
Ken Thompson | 1d31a25 | 2008-07-07 17:59:32 -0700 | [diff] [blame^] | 116 | void cgen_call(Node*, int); |
| 117 | void cgen_callmeth(Node*, int); |
| 118 | void cgen_callinter(Node*, Node*, int); |
| 119 | void cgen_proc(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 120 | void cgen_callret(Node*, Node*); |
Ken Thompson | d83b994 | 2008-06-06 20:43:29 -0700 | [diff] [blame] | 121 | void cgen_div(int, Node*, Node*, Node*); |
Ken Thompson | f7753f1 | 2008-06-07 15:21:02 -0700 | [diff] [blame] | 122 | void cgen_shift(int, Node*, Node*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 123 | void genpanic(void); |
| 124 | int needconvert(Type*, Type*); |
| 125 | void genconv(Type*, Type*); |
| 126 | void allocparams(void); |
| 127 | |
| 128 | /* |
| 129 | * cgen |
| 130 | */ |
| 131 | void cgen(Node*, Node*); |
| 132 | void agen(Node*, Node*); |
| 133 | void igen(Node*, Node*, Node*); |
| 134 | vlong fieldoffset(Type*, Node*); |
| 135 | void bgen(Node*, int, Prog*); |
| 136 | void sgen(Node*, Node*, ulong); |
| 137 | void gmove(Node*, Node*); |
| 138 | Prog* gins(int, Node*, Node*); |
| 139 | int samaddr(Node*, Node*); |
| 140 | void naddr(Node*, Addr*); |
| 141 | |
| 142 | /* |
| 143 | * gsubr.c |
| 144 | */ |
| 145 | void clearp(Prog*); |
| 146 | void proglist(void); |
| 147 | Prog* gbranch(int, Type*); |
| 148 | void patch(Prog*, Prog*); |
| 149 | Prog* prog(int); |
| 150 | void gaddoffset(Node*); |
| 151 | void gconv(int, int); |
| 152 | int conv2pt(Type*); |
| 153 | void belexinit(int); |
| 154 | vlong convvtox(vlong, int); |
| 155 | int brcom(int); |
| 156 | int brrev(int); |
| 157 | void fnparam(Type*, int, int); |
| 158 | Sig* lsort(Sig*, int(*)(Sig*, Sig*)); |
| 159 | Prog* gop(int, Node*, Node*, Node*); |
| 160 | void setconst(Addr*, vlong); |
| 161 | void setaddr(Addr*, Node*); |
| 162 | int optoas(int, Type*); |
| 163 | void ginit(void); |
| 164 | void gclean(void); |
| 165 | void regalloc(Node*, Type*, Node*); |
| 166 | void regfree(Node*); |
| 167 | void regsalloc(Node*, Type*); // replace w tmpvar |
| 168 | void regret(Node*, Type*); |
| 169 | Node* nodarg(Type*, int); |
| 170 | void nodreg(Node*, Type*, int); |
| 171 | void nodindreg(Node*, Type*, int); |
| 172 | void nodconst(Node*, Type*, vlong); |
| 173 | Sym* signame(Type*); |
| 174 | void nodtypesig(Node*, Type*); |
| 175 | void gconreg(int, vlong, int); |
| 176 | void buildtxt(void); |
| 177 | void stringpool(Node*); |
| 178 | void tempname(Node*, Type*); |
| 179 | Plist* newplist(void); |
| 180 | int isfat(Type*); |
| 181 | void setmaxarg(Type*); |
| 182 | |
| 183 | /* |
| 184 | * list.c |
| 185 | */ |
| 186 | int Aconv(Fmt*); |
| 187 | int Dconv(Fmt*); |
| 188 | int Pconv(Fmt*); |
| 189 | int Rconv(Fmt*); |
| 190 | int Yconv(Fmt*); |
| 191 | void listinit(void); |
| 192 | |
| 193 | /* |
| 194 | * obj |
| 195 | */ |
| 196 | void zname(Biobuf*, Sym*, int); |
| 197 | void zaddr(Biobuf*, Addr*, int); |
| 198 | void ieeedtod(Ieee*, double); |
| 199 | void dumpstrings(void); |
| 200 | void dumpsignatures(void); |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 201 | void outhist(Biobuf*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 202 | |
| 203 | /* |
| 204 | * align |
| 205 | */ |
| 206 | void dowidth(Type*); |
| 207 | ulong rnd(ulong, ulong); |