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 | /* |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 6 | */ |
| 7 | |
| 8 | #include <u.h> |
| 9 | #include <libc.h> |
| 10 | #include <bio.h> |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 11 | #include "compat.h" |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 12 | |
| 13 | #ifndef EXTERN |
Russ Cox | 531f242 | 2009-03-30 16:13:11 -0700 | [diff] [blame] | 14 | #define EXTERN extern |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 15 | #endif |
| 16 | enum |
| 17 | { |
| 18 | NHUNK = 50000, |
| 19 | BUFSIZ = 8192, |
| 20 | NSYMB = 500, |
| 21 | NHASH = 1024, |
| 22 | STRINGSZ = 200, |
| 23 | YYMAXDEPTH = 500, |
| 24 | MAXALIGN = 7, |
| 25 | UINF = 100, |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 26 | HISTSZ = 10, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 27 | |
| 28 | PRIME1 = 3, |
| 29 | PRIME2 = 10007, |
| 30 | PRIME3 = 10009, |
| 31 | PRIME4 = 10037, |
| 32 | PRIME5 = 10039, |
| 33 | PRIME6 = 10061, |
| 34 | PRIME7 = 10067, |
| 35 | PRIME8 = 10079, |
| 36 | PRIME9 = 10091, |
Russ Cox | 61590c4 | 2009-01-21 14:51:57 -0800 | [diff] [blame] | 37 | PRIME10 = 10093, |
Ken Thompson | 89ac561 | 2008-09-28 20:22:31 -0700 | [diff] [blame] | 38 | |
| 39 | AUNK = 100, |
Russ Cox | a7f6d40 | 2009-01-26 09:56:42 -0800 | [diff] [blame] | 40 | |
Ken Thompson | 89ac561 | 2008-09-28 20:22:31 -0700 | [diff] [blame] | 41 | // these values are known by runtime |
Russ Cox | a7f6d40 | 2009-01-26 09:56:42 -0800 | [diff] [blame] | 42 | AMEM = 0, |
| 43 | ANOEQ, |
Ken Thompson | 89ac561 | 2008-09-28 20:22:31 -0700 | [diff] [blame] | 44 | ASTRING, |
Ken Thompson | 89ac561 | 2008-09-28 20:22:31 -0700 | [diff] [blame] | 45 | AINTER, |
Russ Cox | d3f6093 | 2008-11-14 16:35:08 -0800 | [diff] [blame] | 46 | |
Russ Cox | 7921457 | 2008-11-11 13:46:55 -0800 | [diff] [blame] | 47 | BADWIDTH = -1000000000 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 48 | }; |
| 49 | |
| 50 | /* |
| 51 | * note this is the representation |
| 52 | * of the compilers string literals, |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 53 | * it is not the runtime representation |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 54 | */ |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 55 | typedef struct Strlit Strlit; |
| 56 | struct Strlit |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 57 | { |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 58 | int32 len; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 59 | char s[3]; // variable |
| 60 | }; |
| 61 | |
Ken Thompson | 66a603c | 2008-08-27 17:28:30 -0700 | [diff] [blame] | 62 | /* |
| 63 | * note this is the runtime representation |
Ken Thompson | 26b357c | 2008-12-05 18:24:05 -0800 | [diff] [blame] | 64 | * of hashmap iterator. it is probably |
| 65 | * insafe to use it this way, but it puts |
| 66 | * all the changes in one place. |
| 67 | * only flag is referenced from go. |
| 68 | * actual placement does not matter as long |
| 69 | * as the size is >= actual size. |
| 70 | */ |
| 71 | typedef struct Hiter Hiter; |
| 72 | struct Hiter |
| 73 | { |
| 74 | uchar data[8]; // return val from next |
| 75 | int32 elemsize; // size of elements in table */ |
| 76 | int32 changes; // number of changes observed last time */ |
| 77 | int32 i; // stack pointer in subtable_state */ |
| 78 | uchar last[8]; // last hash value returned */ |
| 79 | uchar h[8]; // the hash table */ |
| 80 | struct |
| 81 | { |
| 82 | uchar sub[8]; // pointer into subtable */ |
| 83 | uchar start[8]; // pointer into start of subtable */ |
| 84 | uchar end[8]; // pointer into end of subtable */ |
| 85 | uchar pad[8]; |
| 86 | } sub[4]; |
| 87 | }; |
| 88 | |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 89 | enum |
| 90 | { |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 91 | Mpscale = 29, // safely smaller than bits in a long |
| 92 | Mpprec = 16, // Mpscale*Mpprec is max number of bits |
| 93 | Mpnorm = Mpprec - 1, // significant words in a normalized float |
| 94 | Mpbase = 1L << Mpscale, |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 95 | Mpsign = Mpbase >> 1, |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 96 | Mpmask = Mpbase - 1, |
| 97 | Mpdebug = 0, |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 98 | }; |
| 99 | |
| 100 | typedef struct Mpint Mpint; |
| 101 | struct Mpint |
| 102 | { |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 103 | long a[Mpprec]; |
| 104 | uchar neg; |
| 105 | uchar ovf; |
| 106 | }; |
| 107 | |
| 108 | typedef struct Mpflt Mpflt; |
| 109 | struct Mpflt |
| 110 | { |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 111 | Mpint val; |
| 112 | short exp; |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 113 | }; |
| 114 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 115 | typedef struct Val Val; |
| 116 | struct Val |
| 117 | { |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 118 | short ctype; |
| 119 | union |
| 120 | { |
| 121 | short reg; // OREGISTER |
| 122 | short bval; // bool value CTBOOL |
| 123 | Mpint* xval; // int CTINT |
| 124 | Mpflt* fval; // float CTFLT |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 125 | Strlit* sval; // string CTSTR |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 126 | } u; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 127 | }; |
| 128 | |
| 129 | typedef struct Sym Sym; |
| 130 | typedef struct Node Node; |
| 131 | typedef struct Type Type; |
Russ Cox | aacdc25 | 2009-03-30 22:26:00 -0700 | [diff] [blame] | 132 | typedef struct Dcl Dcl; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 133 | |
| 134 | struct Type |
| 135 | { |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 136 | uchar etype; |
| 137 | uchar chan; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 138 | uchar recur; // to detect loops |
| 139 | uchar trecur; // to detect loops |
Ken Thompson | 8877d27 | 2008-10-03 16:12:21 -0700 | [diff] [blame] | 140 | uchar methptr; // 1=direct 2=pointer |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 141 | uchar printed; |
Ken Thompson | 14c6391 | 2008-10-21 20:55:40 -0700 | [diff] [blame] | 142 | uchar embedded; // TFIELD embedded type |
Russ Cox | 1983121 | 2008-11-05 11:27:50 -0800 | [diff] [blame] | 143 | uchar siggen; |
Russ Cox | 7921457 | 2008-11-11 13:46:55 -0800 | [diff] [blame] | 144 | uchar funarg; |
Ken Thompson | 92a1190 | 2008-12-09 13:00:50 -0800 | [diff] [blame] | 145 | uchar copyany; |
Russ Cox | cb64ec5 | 2008-12-11 11:54:33 -0800 | [diff] [blame] | 146 | uchar local; // created in this file |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 147 | |
| 148 | // TFUNCT |
| 149 | uchar thistuple; |
| 150 | uchar outtuple; |
| 151 | uchar intuple; |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 152 | uchar outnamed; |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 153 | |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 154 | Type* method; |
| 155 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 156 | Sym* sym; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 157 | int32 vargen; // unique name for OTYPE/ONAME |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 158 | |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 159 | Node* nname; |
| 160 | vlong argwid; |
| 161 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 162 | // most nodes |
| 163 | Type* type; |
| 164 | vlong width; // offset in TFIELD, width in all others |
| 165 | |
| 166 | // TFIELD |
| 167 | Type* down; // also used in TMAP |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 168 | Strlit* note; // literal string annotation |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 169 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 170 | // TARRAY |
Ken Thompson | c6130e9 | 2008-08-28 15:17:37 -0700 | [diff] [blame] | 171 | int32 bound; // negative is dynamic array |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 172 | }; |
| 173 | #define T ((Type*)0) |
| 174 | |
| 175 | struct Node |
| 176 | { |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 177 | uchar op; |
| 178 | uchar ullman; // sethi/ullman number |
| 179 | uchar addable; // type of addressability - 0 is not addressable |
| 180 | uchar trecur; // to detect loops |
| 181 | uchar etype; // op for OASOP, etype for OTYPE, exclam for export |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 182 | uchar class; // PPARAM, PAUTO, PEXTERN, etc |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 183 | uchar method; // OCALLMETH name |
Ken Thompson | d915b96 | 2008-07-03 16:41:32 -0700 | [diff] [blame] | 184 | uchar iota; // OLITERAL made from iota |
Ken Thompson | 14c6391 | 2008-10-21 20:55:40 -0700 | [diff] [blame] | 185 | uchar embedded; // ODCLFIELD embedded type |
Ken Thompson | ae5a475 | 2008-12-15 13:44:27 -0800 | [diff] [blame] | 186 | uchar colas; // OAS resulting from := |
Russ Cox | 5b129cd | 2009-01-26 17:20:29 -0800 | [diff] [blame] | 187 | uchar diag; // already printed error about this |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 188 | uchar noescape; // ONAME never move to heap |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 189 | uchar funcdepth; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 190 | |
| 191 | // most nodes |
| 192 | Node* left; |
| 193 | Node* right; |
| 194 | Type* type; |
| 195 | |
| 196 | // for-body |
| 197 | Node* ninit; |
| 198 | Node* ntest; |
| 199 | Node* nincr; |
| 200 | Node* nbody; |
| 201 | |
| 202 | // if-body |
| 203 | Node* nelse; |
| 204 | |
| 205 | // cases |
| 206 | Node* ncase; |
| 207 | |
| 208 | // func |
| 209 | Node* nname; |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 210 | Node* enter; |
| 211 | Node* exit; |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 212 | Node* cvars; // closure params |
Russ Cox | aacdc25 | 2009-03-30 22:26:00 -0700 | [diff] [blame] | 213 | Dcl* dcl; // outer autodcl |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 214 | |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 215 | // OLITERAL/OREGISTER |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 216 | Val val; |
| 217 | |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 218 | // ONAME func param with PHEAP |
| 219 | Node* heapaddr; // temp holding heap address of param |
| 220 | Node* stackparam; // OPARAM node referring to stack copy of param |
| 221 | Node* alloc; // allocation call |
| 222 | |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 223 | // ONAME closure param with PPARAMREF |
| 224 | Node* outer; // outer PPARAMREF in nested closure |
| 225 | Node* closure; // ONAME/PHEAP <-> ONAME/PPARAMREF |
| 226 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 227 | Sym* osym; // import |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 228 | Sym* psym; // import |
| 229 | Sym* sym; // various |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 230 | int32 vargen; // unique name for OTYPE/ONAME |
| 231 | int32 lineno; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 232 | vlong xoffset; |
Russ Cox | 6b07021 | 2009-04-02 16:48:06 -0700 | [diff] [blame] | 233 | int32 ostk; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 234 | }; |
| 235 | #define N ((Node*)0) |
| 236 | |
| 237 | struct Sym |
| 238 | { |
Ken Thompson | 57bd0da | 2008-12-09 18:31:31 -0800 | [diff] [blame] | 239 | ushort block; // blocknumber to catch redeclaration |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 240 | |
| 241 | uchar undef; // a diagnostic has been generated |
| 242 | uchar export; // marked as export |
Ken Thompson | 0a7e4a7 | 2008-09-10 19:49:35 -0700 | [diff] [blame] | 243 | uchar exported; // exported |
Russ Cox | 9c7b064 | 2008-11-14 17:31:29 -0800 | [diff] [blame] | 244 | uchar imported; // imported |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 245 | uchar sym; // huffman encoding in object file |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 246 | uchar uniq; // imbedded field name first found |
Russ Cox | 1983121 | 2008-11-05 11:27:50 -0800 | [diff] [blame] | 247 | uchar siggen; // signature generated |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 248 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 249 | char* opackage; // original package name |
| 250 | char* package; // package name |
| 251 | char* name; // variable name |
| 252 | Node* oname; // ONAME node if a var |
| 253 | Type* otype; // TYPE node if a type |
| 254 | Node* oconst; // OLITERAL node if a const |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 255 | vlong offset; // stack location if automatic |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 256 | int32 lexical; |
| 257 | int32 vargen; // unique variable number |
Ken Thompson | 57bd0da | 2008-12-09 18:31:31 -0800 | [diff] [blame] | 258 | int32 lastlineno; // last declaration for diagnostic |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 259 | Sym* link; |
| 260 | }; |
| 261 | #define S ((Sym*)0) |
| 262 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 263 | struct Dcl |
| 264 | { |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 265 | uchar op; |
Ken Thompson | f25843e | 2008-10-04 15:17:49 -0700 | [diff] [blame] | 266 | ushort block; |
| 267 | int32 lineno; |
| 268 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 269 | Sym* dsym; // for printing only |
| 270 | Node* dnode; // oname |
| 271 | Type* dtype; // otype |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 272 | |
| 273 | Dcl* forw; |
| 274 | Dcl* back; // sentinel has pointer to last |
| 275 | }; |
| 276 | #define D ((Dcl*)0) |
| 277 | |
| 278 | typedef struct Iter Iter; |
| 279 | struct Iter |
| 280 | { |
| 281 | int done; |
| 282 | Type* tfunc; |
| 283 | Type* t; |
| 284 | Node** an; |
| 285 | Node* n; |
| 286 | }; |
| 287 | |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 288 | typedef struct Hist Hist; |
| 289 | struct Hist |
| 290 | { |
| 291 | Hist* link; |
| 292 | char* name; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 293 | int32 line; |
| 294 | int32 offset; |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 295 | }; |
| 296 | #define H ((Hist*)0) |
| 297 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 298 | enum |
| 299 | { |
| 300 | OXXX, |
| 301 | |
Ken Thompson | 989676d | 2008-08-03 18:47:02 -0700 | [diff] [blame] | 302 | OTYPE, OCONST, OVAR, OIMPORT, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 303 | |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 304 | ONAME, ONONAME, ODCL, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 305 | ODOT, ODOTPTR, ODOTMETH, ODOTINTER, |
| 306 | ODCLFUNC, ODCLFIELD, ODCLARG, |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 307 | OLIST, OCMP, OPTR, OARRAY, ORANGE, |
Ken Thompson | 1e1cc4e | 2009-01-27 12:03:53 -0800 | [diff] [blame] | 308 | ORETURN, OFOR, OIF, OSWITCH, ODEFER, |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 309 | OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL, |
Ken Thompson | 88b5c5f | 2009-01-06 14:52:26 -0800 | [diff] [blame] | 310 | OGOTO, OPROC, OMAKE, ONEW, OEMPTY, OSELECT, |
Ken Thompson | f21e731 | 2008-10-02 14:38:07 -0700 | [diff] [blame] | 311 | OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF, |
Ken Thompson | 6eb54cb | 2009-03-12 17:55:11 -0700 | [diff] [blame] | 312 | OCLOSE, OCLOSED, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 313 | |
| 314 | OOROR, |
| 315 | OANDAND, |
| 316 | OEQ, ONE, OLT, OLE, OGE, OGT, |
| 317 | OADD, OSUB, OOR, OXOR, |
Ken Thompson | bb02e48 | 2009-03-11 19:59:35 -0700 | [diff] [blame] | 318 | OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT, |
Ken Thompson | e081f25 | 2008-11-22 17:58:53 -0800 | [diff] [blame] | 319 | OINC, ODEC, // placeholders - not used |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 320 | OFUNC, |
| 321 | OLABEL, |
| 322 | OBREAK, |
| 323 | OCONTINUE, |
| 324 | OADDR, |
| 325 | OIND, |
| 326 | OCALL, OCALLMETH, OCALLINTER, |
Russ Cox | ae167bf | 2009-01-09 15:21:41 -0800 | [diff] [blame] | 327 | OINDEX, OSLICE, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 328 | ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV, |
| 329 | OLITERAL, OREGISTER, OINDREG, |
Russ Cox | 07244f7 | 2009-02-13 14:48:16 -0800 | [diff] [blame] | 330 | OKEY, OPARAM, |
Russ Cox | 49cc649 | 2009-03-03 08:41:02 -0800 | [diff] [blame] | 331 | OCOMPOS, |
Russ Cox | 07244f7 | 2009-02-13 14:48:16 -0800 | [diff] [blame] | 332 | OCONV, |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 333 | ODOTTYPE, OTYPESW, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 334 | OBAD, |
Russ Cox | 20595ac | 2009-01-08 14:30:00 -0800 | [diff] [blame] | 335 | |
Russ Cox | 2d259c8 | 2009-01-05 17:32:23 -0800 | [diff] [blame] | 336 | OEXTEND, // 6g internal |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 337 | |
| 338 | OEND, |
| 339 | }; |
| 340 | enum |
| 341 | { |
| 342 | Txxx, // 0 |
| 343 | |
| 344 | TINT8, TUINT8, // 1 |
| 345 | TINT16, TUINT16, |
| 346 | TINT32, TUINT32, |
| 347 | TINT64, TUINT64, |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 348 | TINT, TUINT, TUINTPTR, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 349 | |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 350 | TFLOAT32, // 12 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 351 | TFLOAT64, |
| 352 | TFLOAT80, |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 353 | TFLOAT, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 354 | |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 355 | TBOOL, // 16 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 356 | |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 357 | TPTR32, TPTR64, // 17 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 358 | |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 359 | TDDD, // 19 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 360 | TFUNC, |
| 361 | TARRAY, |
Ken Thompson | c6130e9 | 2008-08-28 15:17:37 -0700 | [diff] [blame] | 362 | T_old_DARRAY, |
Russ Cox | c4416ac | 2008-12-19 09:03:24 -0800 | [diff] [blame] | 363 | TSTRUCT, // 23 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 364 | TCHAN, |
| 365 | TMAP, |
Russ Cox | c4416ac | 2008-12-19 09:03:24 -0800 | [diff] [blame] | 366 | TINTER, // 26 |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 367 | TFORW, |
| 368 | TFIELD, |
| 369 | TANY, |
| 370 | TSTRING, |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 371 | TFORWSTRUCT, |
| 372 | TFORWINTER, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 373 | |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 374 | // pseudo-types for literals |
| 375 | TIDEAL, |
| 376 | TNIL, |
| 377 | |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 378 | NTYPE, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 379 | }; |
| 380 | enum |
| 381 | { |
| 382 | CTxxx, |
| 383 | |
| 384 | CTINT, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 385 | CTFLT, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 386 | CTSTR, |
| 387 | CTBOOL, |
| 388 | CTNIL, |
| 389 | }; |
| 390 | |
| 391 | enum |
| 392 | { |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 393 | /* types of channel */ |
| 394 | Cxxx, |
| 395 | Cboth, |
| 396 | Crecv, |
| 397 | Csend, |
| 398 | }; |
| 399 | |
| 400 | enum |
| 401 | { |
| 402 | Pxxx, |
| 403 | |
| 404 | PEXTERN, // declaration context |
| 405 | PAUTO, |
| 406 | PPARAM, |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 407 | PPARAMOUT, |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 408 | PPARAMREF, // param passed by reference |
Russ Cox | 4a43198 | 2009-01-30 14:39:42 -0800 | [diff] [blame] | 409 | PFUNC, |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 410 | |
| 411 | PHEAP = 1<<7, |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 412 | }; |
| 413 | |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 414 | enum |
| 415 | { |
| 416 | Exxx, |
| 417 | Eyyy, |
| 418 | Etop, // evaluated at statement level |
| 419 | Elv, // evaluated in lvalue context |
| 420 | Erv, // evaluated in rvalue context |
| 421 | }; |
| 422 | |
Russ Cox | 531f242 | 2009-03-30 16:13:11 -0700 | [diff] [blame] | 423 | #define BITS 5 |
| 424 | #define NVAR (BITS*sizeof(uint32)*8) |
| 425 | |
| 426 | typedef struct Bits Bits; |
| 427 | struct Bits |
| 428 | { |
| 429 | uint32 b[BITS]; |
| 430 | }; |
| 431 | |
| 432 | EXTERN Bits zbits; |
| 433 | |
| 434 | typedef struct Var Var; |
| 435 | struct Var |
| 436 | { |
| 437 | vlong offset; |
| 438 | Sym* sym; |
| 439 | char name; |
| 440 | char etype; |
| 441 | }; |
| 442 | |
| 443 | EXTERN Var var[NVAR]; |
| 444 | |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 445 | typedef struct Typedef Typedef; |
| 446 | struct Typedef |
| 447 | { |
| 448 | char* name; |
| 449 | int etype; |
| 450 | int sameas; |
| 451 | }; |
| 452 | |
| 453 | extern Typedef typedefs[]; |
Russ Cox | 531f242 | 2009-03-30 16:13:11 -0700 | [diff] [blame] | 454 | |
Russ Cox | d30285a | 2009-03-30 17:52:21 -0700 | [diff] [blame] | 455 | typedef struct Sig Sig; |
| 456 | struct Sig |
| 457 | { |
| 458 | char* name; |
| 459 | Sym* sym; |
| 460 | uint32 hash; |
| 461 | int32 perm; |
| 462 | int32 offset; |
| 463 | Sig* link; |
| 464 | }; |
| 465 | |
| 466 | typedef struct Pool Pool; |
| 467 | struct Pool |
| 468 | { |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 469 | Strlit* sval; |
Russ Cox | d30285a | 2009-03-30 17:52:21 -0700 | [diff] [blame] | 470 | Pool* link; |
| 471 | }; |
| 472 | |
| 473 | EXTERN Pool* poolist; |
| 474 | EXTERN Pool* poolast; |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 475 | EXTERN Sym* symstringl; // string literals |
| 476 | EXTERN Sym* symstringc; // string characters |
| 477 | EXTERN int32 stringl; // size of string literals |
| 478 | EXTERN int32 stringc; // size of string characters |
Russ Cox | d30285a | 2009-03-30 17:52:21 -0700 | [diff] [blame] | 479 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 480 | typedef struct Io Io; |
| 481 | struct Io |
| 482 | { |
| 483 | char* infile; |
| 484 | Biobuf* bin; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 485 | int32 ilineno; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 486 | int peekc; |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 487 | int peekc1; // second peekc for ... |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 488 | char* cp; // used for content when bin==nil |
| 489 | }; |
| 490 | |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 491 | typedef struct Dlist Dlist; |
| 492 | struct Dlist |
| 493 | { |
Ken Thompson | b642cf8 | 2008-10-25 13:31:25 -0700 | [diff] [blame] | 494 | Type* field; |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 495 | }; |
| 496 | |
Ian Lance Taylor | 062d699 | 2009-03-10 20:03:31 -0700 | [diff] [blame] | 497 | typedef struct Idir Idir; |
| 498 | struct Idir |
| 499 | { |
| 500 | Idir* link; |
| 501 | char* dir; |
| 502 | }; |
| 503 | |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 504 | /* |
| 505 | * note this is the runtime representation |
| 506 | * of the compilers arrays. |
| 507 | * |
| 508 | * typedef struct |
| 509 | * { // must not move anything |
| 510 | * uchar array[8]; // pointer to data |
| 511 | * uchar nel[4]; // number of elements |
| 512 | * uchar cap[4]; // allocated number of elements |
| 513 | * } Array; |
| 514 | */ |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 515 | EXTERN int Array_array; // runtime offsetof(Array,array) - same for String |
| 516 | EXTERN int Array_nel; // runtime offsetof(Array,nel) - same for String |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 517 | EXTERN int Array_cap; // runtime offsetof(Array,cap) |
| 518 | EXTERN int sizeof_Array; // runtime sizeof(Array) |
| 519 | |
Ken Thompson | 3657061 | 2009-04-09 18:16:21 -0700 | [diff] [blame^] | 520 | |
| 521 | /* |
| 522 | * note this is the runtime representation |
| 523 | * of the compilers strings. |
| 524 | * |
| 525 | * typedef struct |
| 526 | * { // must not move anything |
| 527 | * uchar array[8]; // pointer to data |
| 528 | * uchar nel[4]; // number of elements |
| 529 | * } String; |
| 530 | */ |
| 531 | EXTERN int sizeof_String; // runtime sizeof(String) |
| 532 | |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 533 | EXTERN Dlist dotlist[10]; // size is max depth of embeddeds |
| 534 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 535 | EXTERN Io curio; |
| 536 | EXTERN Io pushedio; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 537 | EXTERN int32 lineno; |
Russ Cox | 4656686 | 2008-11-18 09:32:05 -0800 | [diff] [blame] | 538 | EXTERN int32 prevlineno; |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 539 | EXTERN char* pathname; |
| 540 | EXTERN Hist* hist; |
| 541 | EXTERN Hist* ehist; |
| 542 | |
Ken Thompson | bbb2073 | 2008-06-05 19:38:39 -0700 | [diff] [blame] | 543 | EXTERN char* infile; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 544 | EXTERN char* outfile; |
| 545 | EXTERN char* package; |
| 546 | EXTERN Biobuf* bout; |
| 547 | EXTERN int nerrors; |
| 548 | EXTERN char namebuf[NSYMB]; |
Russ Cox | 58f5f4f | 2009-04-02 17:59:09 -0700 | [diff] [blame] | 549 | EXTERN char lexbuf[NSYMB]; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 550 | EXTERN char debug[256]; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 551 | EXTERN Sym* hash[NHASH]; |
| 552 | EXTERN Sym* dclstack; |
| 553 | EXTERN Sym* b0stack; |
| 554 | EXTERN Sym* pkgmyname; // my name for package |
Ken Thompson | 343f5aa | 2008-06-12 21:48:56 -0700 | [diff] [blame] | 555 | EXTERN Sym* pkgimportname; // package name from imported package |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 556 | EXTERN int tptr; // either TPTR32 or TPTR64 |
| 557 | extern char* sysimport; |
Ken Thompson | 1d4daa2 | 2008-12-08 19:46:39 -0800 | [diff] [blame] | 558 | extern char* unsafeimport; |
Ken Thompson | 4528854 | 2008-07-08 17:19:17 -0700 | [diff] [blame] | 559 | EXTERN char* filename; // name to uniqify names |
Ian Lance Taylor | 062d699 | 2009-03-10 20:03:31 -0700 | [diff] [blame] | 560 | EXTERN Idir* idirs; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 561 | |
| 562 | EXTERN Type* types[NTYPE]; |
Ken Thompson | c21d9a1 | 2008-10-29 12:46:44 -0700 | [diff] [blame] | 563 | EXTERN uchar simtype[NTYPE]; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 564 | EXTERN uchar isptr[NTYPE]; |
| 565 | EXTERN uchar isint[NTYPE]; |
| 566 | EXTERN uchar isfloat[NTYPE]; |
| 567 | EXTERN uchar issigned[NTYPE]; |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 568 | EXTERN uchar issimple[NTYPE]; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 569 | EXTERN uchar okforeq[NTYPE]; |
| 570 | EXTERN uchar okforadd[NTYPE]; |
| 571 | EXTERN uchar okforand[NTYPE]; |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 572 | |
| 573 | EXTERN Mpint* minintval[NTYPE]; |
| 574 | EXTERN Mpint* maxintval[NTYPE]; |
| 575 | EXTERN Mpflt* minfltval[NTYPE]; |
| 576 | EXTERN Mpflt* maxfltval[NTYPE]; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 577 | |
| 578 | EXTERN Dcl* autodcl; |
Ken Thompson | 8003849 | 2008-07-16 17:22:54 -0700 | [diff] [blame] | 579 | EXTERN Dcl* paramdcl; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 580 | EXTERN Dcl* externdcl; |
| 581 | EXTERN Dcl* exportlist; |
Ken Thompson | 0a7e4a7 | 2008-09-10 19:49:35 -0700 | [diff] [blame] | 582 | EXTERN Dcl* signatlist; |
Russ Cox | aacfbb4 | 2008-10-21 14:34:45 -0700 | [diff] [blame] | 583 | EXTERN Dcl* typelist; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 584 | EXTERN int dclcontext; // PEXTERN/PAUTO |
| 585 | EXTERN int importflag; |
Ken Thompson | 2254a8e | 2008-06-11 21:06:26 -0700 | [diff] [blame] | 586 | EXTERN int inimportsys; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 587 | |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 588 | EXTERN uint32 iota; |
Ken Thompson | d915b96 | 2008-07-03 16:41:32 -0700 | [diff] [blame] | 589 | EXTERN Node* lastconst; |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 590 | EXTERN Type* lasttype; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 591 | EXTERN int32 vargen; |
| 592 | EXTERN int32 exportgen; |
| 593 | EXTERN int32 maxarg; |
Ken Thompson | 1ea5bc7 | 2008-10-13 20:14:09 -0700 | [diff] [blame] | 594 | EXTERN int32 stksize; // stack size for current frame |
| 595 | EXTERN int32 initstksize; // stack size for init function |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 596 | EXTERN ushort blockgen; // max block number |
| 597 | EXTERN ushort block; // current block number |
Ken Thompson | 1e1cc4e | 2009-01-27 12:03:53 -0800 | [diff] [blame] | 598 | EXTERN int hasdefer; // flag that curfn has defer statetment |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 599 | |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 600 | EXTERN int maxround; |
| 601 | EXTERN int widthptr; |
| 602 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 603 | EXTERN Node* retnil; |
| 604 | EXTERN Node* fskel; |
| 605 | |
Russ Cox | 9906bfc | 2008-11-06 13:31:13 -0800 | [diff] [blame] | 606 | EXTERN Node* addtop; |
Ken Thompson | a4a10ed | 2009-03-06 17:50:43 -0800 | [diff] [blame] | 607 | EXTERN Node* typeswvar; |
Russ Cox | 9906bfc | 2008-11-06 13:31:13 -0800 | [diff] [blame] | 608 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 609 | EXTERN char* context; |
Russ Cox | 4efad58 | 2009-01-26 16:57:24 -0800 | [diff] [blame] | 610 | EXTERN char* pkgcontext; |
Russ Cox | 5e792b6 | 2009-03-30 21:31:29 -0700 | [diff] [blame] | 611 | extern int thechar; |
| 612 | extern char* thestring; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 613 | EXTERN char* hunk; |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 614 | EXTERN int32 nhunk; |
| 615 | EXTERN int32 thunk; |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 616 | |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 617 | EXTERN int exporting; |
| 618 | |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 619 | EXTERN int funcdepth; |
| 620 | |
| 621 | EXTERN Node* funclit; |
| 622 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 623 | /* |
| 624 | * y.tab.c |
| 625 | */ |
| 626 | int yyparse(void); |
| 627 | |
| 628 | /* |
| 629 | * lex.c |
| 630 | */ |
Ken Thompson | 4528854 | 2008-07-08 17:19:17 -0700 | [diff] [blame] | 631 | void setfilename(char*); |
Ian Lance Taylor | 062d699 | 2009-03-10 20:03:31 -0700 | [diff] [blame] | 632 | void addidir(char*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 633 | void importfile(Val*); |
Ken Thompson | 1d4daa2 | 2008-12-08 19:46:39 -0800 | [diff] [blame] | 634 | void cannedimports(char*, char*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 635 | void unimportfile(); |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 636 | int32 yylex(void); |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 637 | void typeinit(int lex); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 638 | void lexinit(void); |
| 639 | char* lexname(int); |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 640 | int32 getr(void); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 641 | int getnsc(void); |
Ken Thompson | f9c58c2 | 2008-06-08 19:02:27 -0700 | [diff] [blame] | 642 | int escchar(int, int*, vlong*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 643 | int getc(void); |
| 644 | void ungetc(int); |
| 645 | void mkpackage(char*); |
| 646 | |
| 647 | /* |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 648 | * mparith1.c |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 649 | */ |
Ken Thompson | 4797523 | 2008-08-12 14:04:03 -0700 | [diff] [blame] | 650 | int mpcmpfixflt(Mpint *a, Mpflt *b); |
| 651 | int mpcmpfltfix(Mpflt *a, Mpint *b); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 652 | int mpcmpfixfix(Mpint *a, Mpint *b); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 653 | int mpcmpfixc(Mpint *b, vlong c); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 654 | int mpcmpfltflt(Mpflt *a, Mpflt *b); |
| 655 | int mpcmpfltc(Mpflt *b, double c); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 656 | void mpsubfixfix(Mpint *a, Mpint *b); |
| 657 | void mpsubfltflt(Mpflt *a, Mpflt *b); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 658 | void mpaddcfix(Mpint *a, vlong c); |
| 659 | void mpaddcflt(Mpflt *a, double c); |
| 660 | void mpmulcfix(Mpint *a, vlong c); |
| 661 | void mpmulcflt(Mpflt *a, double c); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 662 | void mpdivfixfix(Mpint *a, Mpint *b); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 663 | void mpmodfixfix(Mpint *a, Mpint *b); |
| 664 | void mpatofix(Mpint *a, char *s); |
| 665 | void mpatoflt(Mpflt *a, char *s); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 666 | int mpmovefltfix(Mpint *a, Mpflt *b); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 667 | void mpmovefixflt(Mpflt *a, Mpint *b); |
Ken Thompson | 2b75556 | 2008-08-11 13:22:04 -0700 | [diff] [blame] | 668 | int Bconv(Fmt*); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 669 | |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 670 | /* |
| 671 | * mparith2.c |
| 672 | */ |
| 673 | void mpmovefixfix(Mpint *a, Mpint *b); |
| 674 | void mpmovecfix(Mpint *a, vlong v); |
| 675 | int mptestfix(Mpint *a); |
| 676 | void mpaddfixfix(Mpint *a, Mpint *b); |
| 677 | void mpmulfixfix(Mpint *a, Mpint *b); |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 678 | void mpmulfract(Mpint *a, Mpint *b); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 679 | void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d); |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 680 | void mpdivfract(Mpint *a, Mpint *b); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 681 | void mpnegfix(Mpint *a); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 682 | void mpandfixfix(Mpint *a, Mpint *b); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 683 | void mpandnotfixfix(Mpint *a, Mpint *b); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 684 | void mplshfixfix(Mpint *a, Mpint *b); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 685 | void mporfixfix(Mpint *a, Mpint *b); |
| 686 | void mprshfixfix(Mpint *a, Mpint *b); |
| 687 | void mpxorfixfix(Mpint *a, Mpint *b); |
| 688 | void mpcomfix(Mpint *a); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 689 | vlong mpgetfix(Mpint *a); |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 690 | void mpshiftfix(Mpint *a, int s); |
Ken Thompson | 9c2ade3 | 2008-08-08 17:13:31 -0700 | [diff] [blame] | 691 | |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 692 | /* |
| 693 | * mparith3.c |
| 694 | */ |
Ken Thompson | f8797da | 2008-12-03 13:17:26 -0800 | [diff] [blame] | 695 | int sigfig(Mpflt *a); |
| 696 | void mpnorm(Mpflt *a); |
Ken Thompson | 272ae65 | 2008-08-09 17:29:26 -0700 | [diff] [blame] | 697 | void mpmovefltflt(Mpflt *a, Mpflt *b); |
| 698 | void mpmovecflt(Mpflt *a, double f); |
| 699 | int mptestflt(Mpflt *a); |
| 700 | void mpaddfltflt(Mpflt *a, Mpflt *b); |
| 701 | void mpmulfltflt(Mpflt *a, Mpflt *b); |
| 702 | void mpdivfltflt(Mpflt *a, Mpflt *b); |
| 703 | void mpnegflt(Mpflt *a); |
| 704 | double mpgetflt(Mpflt *a); |
Ken Thompson | 3fa4610 | 2008-12-01 17:22:05 -0800 | [diff] [blame] | 705 | int Fconv(Fmt*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 706 | |
| 707 | /* |
| 708 | * subr.c |
| 709 | */ |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 710 | void* mal(int32); |
| 711 | void* remal(void*, int32, int32); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 712 | void errorexit(void); |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 713 | uint32 stringhash(char*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 714 | Sym* lookup(char*); |
| 715 | Sym* pkglookup(char*, char*); |
| 716 | void yyerror(char*, ...); |
| 717 | void warn(char*, ...); |
| 718 | void fatal(char*, ...); |
Russ Cox | f95da9a | 2009-04-08 22:45:33 -0700 | [diff] [blame] | 719 | void linehist(char*, int32, int); |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 720 | int32 setlineno(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 721 | Node* nod(int, Node*, Node*); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 722 | Node* nodlit(Val); |
Ken Thompson | c242b53 | 2008-06-17 22:33:32 -0700 | [diff] [blame] | 723 | Node* list(Node*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 724 | Type* typ(int); |
| 725 | Dcl* dcl(void); |
Ken Thompson | 89ac561 | 2008-09-28 20:22:31 -0700 | [diff] [blame] | 726 | int algtype(Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 727 | Node* rev(Node*); |
| 728 | Node* unrev(Node*); |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 729 | Node* appendr(Node*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 730 | void dodump(Node*, int); |
| 731 | void dump(char*, Node*); |
| 732 | Type* aindex(Node*, Type*); |
| 733 | int isnil(Node*); |
| 734 | int isptrto(Type*, int); |
Russ Cox | a91af04 | 2009-01-09 11:13:39 -0800 | [diff] [blame] | 735 | int istype(Type*, int); |
Russ Cox | ae167bf | 2009-01-09 15:21:41 -0800 | [diff] [blame] | 736 | int isfixedarray(Type*); |
| 737 | int isslice(Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 738 | int isinter(Type*); |
Ken Thompson | 1bf3848 | 2008-10-15 17:08:10 -0700 | [diff] [blame] | 739 | int isnilinter(Type*); |
Ken Thompson | 74427c6 | 2008-11-01 16:36:46 -0700 | [diff] [blame] | 740 | int isddd(Type*); |
Russ Cox | 98b34e5 | 2009-03-04 17:38:37 -0800 | [diff] [blame] | 741 | Type* maptype(Type*, Type*); |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 742 | Type* dclmethod(Type*); |
Ken Thompson | 7ed8fc6 | 2008-10-22 18:18:08 -0700 | [diff] [blame] | 743 | Type* methtype(Type*); |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 744 | int methconv(Type*); |
Russ Cox | 1983121 | 2008-11-05 11:27:50 -0800 | [diff] [blame] | 745 | Sym* signame(Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 746 | int eqtype(Type*, Type*, int); |
Russ Cox | b0009be | 2009-02-05 15:22:49 -0800 | [diff] [blame] | 747 | int eqtypenoname(Type*, Type*); |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 748 | void argtype(Node*, Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 749 | int eqargs(Type*, Type*); |
Ken Thompson | 0f469a9 | 2009-03-17 13:58:38 -0700 | [diff] [blame] | 750 | uint32 typehash(Type*, int, int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 751 | void frame(int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 752 | Node* dobad(void); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 753 | Node* nodintconst(int64); |
Russ Cox | d30285a | 2009-03-30 17:52:21 -0700 | [diff] [blame] | 754 | void nodconst(Node*, Type*, int64); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 755 | Node* nodnil(void); |
| 756 | Node* nodbool(int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 757 | void ullmancalc(Node*); |
| 758 | void badtype(int, Type*, Type*); |
| 759 | Type* ptrto(Type*); |
| 760 | Node* cleanidlist(Node*); |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 761 | Node* syslook(char*, int); |
Ken Thompson | d915b96 | 2008-07-03 16:41:32 -0700 | [diff] [blame] | 762 | Node* treecopy(Node*); |
Russ Cox | 45f4e38 | 2008-10-03 16:23:02 -0700 | [diff] [blame] | 763 | int isselect(Node*); |
| 764 | void tempname(Node*, Type*); |
Russ Cox | 1163b1d | 2008-10-16 15:59:31 -0700 | [diff] [blame] | 765 | int iscomposite(Type*); |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 766 | Node* callnew(Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 767 | |
| 768 | Type** getthis(Type*); |
| 769 | Type** getoutarg(Type*); |
| 770 | Type** getinarg(Type*); |
| 771 | |
| 772 | Type* getthisx(Type*); |
| 773 | Type* getoutargx(Type*); |
| 774 | Type* getinargx(Type*); |
| 775 | |
| 776 | Node* listfirst(Iter*, Node**); |
| 777 | Node* listnext(Iter*); |
| 778 | Type* structfirst(Iter*, Type**); |
| 779 | Type* structnext(Iter*); |
| 780 | Type* funcfirst(Iter*, Type*); |
| 781 | Type* funcnext(Iter*); |
| 782 | |
Russ Cox | d30285a | 2009-03-30 17:52:21 -0700 | [diff] [blame] | 783 | int brcom(int); |
| 784 | int brrev(int); |
| 785 | void setmaxarg(Type*); |
| 786 | Sig* lsort(Sig*, int(*)(Sig*, Sig*)); |
| 787 | int dotoffset(Node*, int*, Node**); |
| 788 | void stringpool(Node*); |
| 789 | void tempname(Node*, Type*); |
| 790 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 791 | int Econv(Fmt*); |
| 792 | int Jconv(Fmt*); |
Ken Thompson | efec14b | 2008-06-13 18:16:23 -0700 | [diff] [blame] | 793 | int Lconv(Fmt*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 794 | int Oconv(Fmt*); |
| 795 | int Sconv(Fmt*); |
| 796 | int Tconv(Fmt*); |
| 797 | int Nconv(Fmt*); |
Russ Cox | 1163b1d | 2008-10-16 15:59:31 -0700 | [diff] [blame] | 798 | int Wconv(Fmt*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 799 | int Zconv(Fmt*); |
| 800 | |
Russ Cox | 20595ac | 2009-01-08 14:30:00 -0800 | [diff] [blame] | 801 | int lookdot0(Sym*, Type*, Type**); |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 802 | Type* lookdot1(Sym*, Type*, Type*); |
Russ Cox | 20595ac | 2009-01-08 14:30:00 -0800 | [diff] [blame] | 803 | int adddot1(Sym*, Type*, int, Type**); |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 804 | Node* adddot(Node*); |
| 805 | void expand0(Type*); |
| 806 | void expand1(Type*, int); |
| 807 | void expandmeth(Sym*, Type*); |
Russ Cox | 20595ac | 2009-01-08 14:30:00 -0800 | [diff] [blame] | 808 | void genptrtramp(Sym*, Sym*, Type*, Type*, Sym*, Type*); |
Ken Thompson | b379d54 | 2008-10-24 20:14:28 -0700 | [diff] [blame] | 809 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 810 | /* |
| 811 | * dcl.c |
| 812 | */ |
| 813 | void dodclvar(Node*, Type*); |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 814 | Type* dodcltype(Type*); |
| 815 | void updatetype(Type*, Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 816 | void dodclconst(Node*, Node*); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 817 | void defaultlit(Node*, Type*); |
| 818 | void defaultlit2(Node*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 819 | int listcount(Node*); |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 820 | void addmethod(Node*, Type*, int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 821 | Node* methodname(Node*, Type*); |
Russ Cox | c249a8de | 2008-11-03 15:36:08 -0800 | [diff] [blame] | 822 | Sym* methodsym(Sym*, Type*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 823 | Type* functype(Node*, Node*, Node*); |
| 824 | char* thistypenam(Node*); |
| 825 | void funcnam(Type*, char*); |
Ken Thompson | f24f8ff | 2008-07-19 18:39:12 -0700 | [diff] [blame] | 826 | Node* renameinit(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 827 | void funchdr(Node*); |
| 828 | void funcargs(Type*); |
| 829 | void funcbody(Node*); |
| 830 | Type* dostruct(Node*, int); |
Russ Cox | f1fe21a | 2009-01-26 17:06:20 -0800 | [diff] [blame] | 831 | Type** stotype(Node*, int, Type**); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 832 | Type* sortinter(Type*); |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 833 | void markdcl(void); |
| 834 | void popdcl(void); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 835 | void poptodcl(void); |
Ken Thompson | 8003849 | 2008-07-16 17:22:54 -0700 | [diff] [blame] | 836 | void dumpdcl(char*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 837 | void markdclstack(void); |
| 838 | void testdclstack(void); |
| 839 | Sym* pushdcl(Sym*); |
| 840 | void addvar(Node*, Type*, int); |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 841 | void addtyp(Type*, int); |
| 842 | void addconst(Node*, Node*, int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 843 | Node* fakethis(void); |
| 844 | Node* newname(Sym*); |
| 845 | Node* oldname(Sym*); |
| 846 | Type* newtype(Sym*); |
| 847 | Type* oldtype(Sym*); |
Ken Thompson | fb3af53 | 2008-07-19 13:38:29 -0700 | [diff] [blame] | 848 | void fninit(Node*); |
Russ Cox | 4d571c9 | 2008-09-30 12:53:11 -0700 | [diff] [blame] | 849 | Node* nametoanondcl(Node*); |
| 850 | Node* nametodcl(Node*, Type*); |
| 851 | Node* anondcl(Type*); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 852 | void checkarglist(Node*); |
Russ Cox | 74e2e08 | 2008-10-06 16:44:17 -0700 | [diff] [blame] | 853 | void checkwidth(Type*); |
| 854 | void defercheckwidth(void); |
| 855 | void resumecheckwidth(void); |
Ken Thompson | 14c6391 | 2008-10-21 20:55:40 -0700 | [diff] [blame] | 856 | Node* embedded(Sym*); |
Ken Thompson | c597845 | 2008-12-04 15:33:40 -0800 | [diff] [blame] | 857 | Node* variter(Node*, Type*, Node*); |
| 858 | void constiter(Node*, Type*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 859 | |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 860 | void funclit0(Type*); |
| 861 | Node* funclit1(Type*, Node*); |
Ken Thompson | 8a70545 | 2009-02-07 12:34:45 -0800 | [diff] [blame] | 862 | Node* unsafenmagic(Node*, Node*); |
Russ Cox | 0970c46 | 2009-02-06 13:47:10 -0800 | [diff] [blame] | 863 | |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 864 | /* |
| 865 | * export.c |
| 866 | */ |
Ken Thompson | 343f5aa | 2008-06-12 21:48:56 -0700 | [diff] [blame] | 867 | void renamepkg(Node*); |
Russ Cox | 07d344e | 2009-01-15 16:16:52 -0800 | [diff] [blame] | 868 | void autoexport(Sym*); |
Russ Cox | 06869ee | 2009-01-16 15:25:52 -0800 | [diff] [blame] | 869 | int exportname(char*); |
Ken Thompson | 989676d | 2008-08-03 18:47:02 -0700 | [diff] [blame] | 870 | void exportsym(Sym*); |
Russ Cox | d3f6093 | 2008-11-14 16:35:08 -0800 | [diff] [blame] | 871 | void packagesym(Sym*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 872 | void dumpe(Sym*); |
| 873 | void dumpexport(void); |
| 874 | void dumpexporttype(Sym*); |
| 875 | void dumpexportvar(Sym*); |
| 876 | void dumpexportconst(Sym*); |
| 877 | void doimportv1(Node*, Node*); |
| 878 | void doimportc1(Node*, Val*); |
| 879 | void doimportc2(Node*, Node*, Val*); |
| 880 | void doimport1(Node*, Node*, Node*); |
| 881 | void doimport2(Node*, Val*, Node*); |
| 882 | void doimport3(Node*, Node*); |
| 883 | void doimport4(Node*, Node*); |
| 884 | void doimport5(Node*, Val*); |
| 885 | void doimport6(Node*, Node*); |
| 886 | void doimport7(Node*, Node*); |
Ken Thompson | 3856e45 | 2008-07-12 13:08:53 -0700 | [diff] [blame] | 887 | void doimport8(Node*, Val*, Node*); |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 888 | void doimport9(Sym*, Node*); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 889 | void importconst(Node *ss, Type *t, Node *v); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 890 | void importmethod(Sym *s, Type *t); |
Russ Cox | 0183baa | 2009-01-20 14:40:00 -0800 | [diff] [blame] | 891 | void importtype(Node *ss, Type *t); |
Russ Cox | 4a43198 | 2009-01-30 14:39:42 -0800 | [diff] [blame] | 892 | void importvar(Node *ss, Type *t, int ctxt); |
Russ Cox | b8babed | 2008-10-03 16:15:55 -0700 | [diff] [blame] | 893 | void checkimports(void); |
| 894 | Type* pkgtype(char*, char*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 895 | |
| 896 | /* |
| 897 | * walk.c |
| 898 | */ |
Ken Thompson | d01a1ec | 2008-09-14 17:29:50 -0700 | [diff] [blame] | 899 | void addtotop(Node*); |
| 900 | void gettype(Node*, Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 901 | void walk(Node*); |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 902 | void walkstate(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 903 | void walktype(Node*, int); |
Russ Cox | 07244f7 | 2009-02-13 14:48:16 -0800 | [diff] [blame] | 904 | void walkconv(Node*); |
Ken Thompson | 9dbaab5 | 2008-09-04 12:21:10 -0700 | [diff] [blame] | 905 | void walkas(Node*); |
Ken Thompson | 417a971 | 2008-07-05 12:49:25 -0700 | [diff] [blame] | 906 | void walkbool(Node*); |
Ken Thompson | bf98347 | 2009-03-05 15:49:34 -0800 | [diff] [blame] | 907 | void walkswitch(Node*); |
Ken Thompson | cb9b103 | 2008-07-24 15:57:30 -0700 | [diff] [blame] | 908 | void walkselect(Node*); |
Ken Thompson | 2119294 | 2008-09-14 16:57:55 -0700 | [diff] [blame] | 909 | void walkdot(Node*); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 910 | Node* ascompatee(int, Node**, Node**); |
| 911 | Node* ascompatet(int, Node**, Type**, int); |
| 912 | Node* ascompatte(int, Type**, Node**, int); |
| 913 | int ascompat(Type*, Type*); |
Ken Thompson | f21e731 | 2008-10-02 14:38:07 -0700 | [diff] [blame] | 914 | Node* prcompat(Node*, int); |
Russ Cox | 9aad9fe | 2008-08-03 17:25:15 -0700 | [diff] [blame] | 915 | Node* nodpanic(int32); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 916 | Node* newcompat(Node*); |
Ken Thompson | 88b5c5f | 2009-01-06 14:52:26 -0800 | [diff] [blame] | 917 | Node* makecompat(Node*); |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 918 | Node* stringop(Node*, int); |
Ken Thompson | cb9b103 | 2008-07-24 15:57:30 -0700 | [diff] [blame] | 919 | Type* fixmap(Type*); |
Ken Thompson | e1a06cc | 2008-06-15 20:24:30 -0700 | [diff] [blame] | 920 | Node* mapop(Node*, int); |
Ken Thompson | cb9b103 | 2008-07-24 15:57:30 -0700 | [diff] [blame] | 921 | Type* fixchan(Type*); |
Ken Thompson | 3856e45 | 2008-07-12 13:08:53 -0700 | [diff] [blame] | 922 | Node* chanop(Node*, int); |
Ken Thompson | 66a603c | 2008-08-27 17:28:30 -0700 | [diff] [blame] | 923 | Node* arrayop(Node*, int); |
Ken Thompson | 8231e94 | 2008-09-22 12:16:19 -0700 | [diff] [blame] | 924 | Node* ifaceop(Type*, Node*, int); |
Russ Cox | 5f4f564 | 2009-02-11 17:57:29 -0800 | [diff] [blame] | 925 | int ifaceas(Type*, Type*, int); |
| 926 | int ifaceas1(Type*, Type*, int); |
| 927 | void ifacecheck(Type*, Type*, int, int); |
Russ Cox | e512481 | 2009-01-08 18:06:06 -0800 | [diff] [blame] | 928 | void runifacechecks(void); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 929 | Node* convas(Node*); |
Ken Thompson | 8200a0b | 2008-06-08 12:48:37 -0700 | [diff] [blame] | 930 | void arrayconv(Type*, Node*); |
Ken Thompson | 54abac6 | 2008-06-21 15:11:29 -0700 | [diff] [blame] | 931 | Node* colas(Node*, Node*); |
Ken Thompson | b79272d | 2008-12-06 13:40:30 -0800 | [diff] [blame] | 932 | Node* dorange(Node*); |
Ken Thompson | 0b3093f | 2008-06-10 21:29:57 -0700 | [diff] [blame] | 933 | Node* reorder1(Node*); |
| 934 | Node* reorder2(Node*); |
| 935 | Node* reorder3(Node*); |
| 936 | Node* reorder4(Node*); |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 937 | Node* structlit(Node*, Node*); |
Russ Cox | 07244f7 | 2009-02-13 14:48:16 -0800 | [diff] [blame] | 938 | Node* arraylit(Node*, Node*); |
| 939 | Node* maplit(Node*, Node*); |
Ken Thompson | 3044403 | 2008-09-16 20:51:50 -0700 | [diff] [blame] | 940 | Node* selectas(Node*, Node*); |
| 941 | Node* old2new(Node*, Type*); |
Russ Cox | 391425a | 2009-01-29 17:38:58 -0800 | [diff] [blame] | 942 | void addrescapes(Node*); |
| 943 | void heapmoves(void); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 944 | |
| 945 | /* |
| 946 | * const.c |
| 947 | */ |
Ken Thompson | e683fb7 | 2008-12-12 13:10:36 -0800 | [diff] [blame] | 948 | void convlit1(Node*, Type*, int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 949 | void convlit(Node*, Type*); |
| 950 | void evconst(Node*); |
| 951 | int cmpslit(Node *l, Node *r); |
Ken Thompson | 42d89ac | 2008-12-14 18:45:00 -0800 | [diff] [blame] | 952 | int smallintconst(Node*); |
Russ Cox | 8f194bf | 2009-03-12 19:04:38 -0700 | [diff] [blame] | 953 | int consttype(Node*); |
| 954 | int isconst(Node*, int); |
Rob Pike | 0cafb9e | 2008-06-04 14:37:38 -0700 | [diff] [blame] | 955 | |
| 956 | /* |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 957 | * align.c |
| 958 | */ |
| 959 | uint32 rnd(uint32, uint32); |
| 960 | void dowidth(Type*); |
Russ Cox | bac922c | 2009-03-30 19:15:07 -0700 | [diff] [blame] | 961 | int argsize(Type*); |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 962 | |
| 963 | /* |
| 964 | * bits.c |
Russ Cox | 531f242 | 2009-03-30 16:13:11 -0700 | [diff] [blame] | 965 | */ |
| 966 | Bits bor(Bits, Bits); |
| 967 | Bits band(Bits, Bits); |
| 968 | Bits bnot(Bits); |
| 969 | int bany(Bits*); |
| 970 | int bnum(Bits); |
| 971 | Bits blsh(uint); |
| 972 | int beq(Bits, Bits); |
| 973 | int bset(Bits, uint); |
| 974 | int Qconv(Fmt *fp); |
| 975 | int bitno(int32); |
Russ Cox | 8e54729 | 2009-03-30 17:09:28 -0700 | [diff] [blame] | 976 | |
Russ Cox | bac922c | 2009-03-30 19:15:07 -0700 | [diff] [blame] | 977 | /* |
| 978 | * gen.c |
| 979 | */ |
| 980 | typedef struct Prog Prog; |
| 981 | #define P ((Prog*)0) |
| 982 | |
| 983 | typedef struct Label Label; |
| 984 | struct Label |
| 985 | { |
| 986 | uchar op; // OGOTO/OLABEL |
| 987 | Sym* sym; |
| 988 | Prog* label; // pointer to code |
| 989 | Prog* breakpc; // pointer to code |
| 990 | Prog* continpc; // pointer to code |
| 991 | Label* link; |
| 992 | }; |
| 993 | #define L ((Label*)0) |
| 994 | |
| 995 | EXTERN Label* labellist; |
| 996 | EXTERN Label* findlab(Sym*); |
| 997 | |
Russ Cox | 5e792b6 | 2009-03-30 21:31:29 -0700 | [diff] [blame] | 998 | typedef struct Plist Plist; |
| 999 | struct Plist |
| 1000 | { |
| 1001 | Node* name; |
| 1002 | Dcl* locals; |
| 1003 | Prog* firstpc; |
| 1004 | int recur; |
| 1005 | Plist* link; |
| 1006 | }; |
| 1007 | |
| 1008 | EXTERN Plist* plist; |
| 1009 | EXTERN Plist* plast; |
| 1010 | |
Russ Cox | bac922c | 2009-03-30 19:15:07 -0700 | [diff] [blame] | 1011 | EXTERN Prog* continpc; |
| 1012 | EXTERN Prog* breakpc; |
| 1013 | EXTERN Prog* pc; |
| 1014 | EXTERN Prog* firstpc; |
| 1015 | |
| 1016 | void allocparams(void); |
| 1017 | void cgen_as(Node *nl, Node *nr); |
| 1018 | void cgen_callmeth(Node *n, int proc); |
| 1019 | void cgen_dcl(Node *n); |
| 1020 | void cgen_proc(Node *n, int proc); |
| 1021 | void checklabels(void); |
| 1022 | Label* findlab(Sym *s); |
| 1023 | void gen(Node *n); |
| 1024 | void newlab(int op, Sym *s); |
| 1025 | Node* sysfunc(char *name); |
Russ Cox | 5e792b6 | 2009-03-30 21:31:29 -0700 | [diff] [blame] | 1026 | Plist* newplist(void); |
Russ Cox | bac922c | 2009-03-30 19:15:07 -0700 | [diff] [blame] | 1027 | |
| 1028 | /* |
Russ Cox | 5e792b6 | 2009-03-30 21:31:29 -0700 | [diff] [blame] | 1029 | * obj.c |
| 1030 | */ |
| 1031 | void Bputdot(Biobuf *b); |
| 1032 | void dumpfuncs(void); |
| 1033 | void dumpglobls(void); |
| 1034 | void dumpobj(void); |
| 1035 | void ieeedtod(uint64 *ieee, double native); |
| 1036 | void outhist(Biobuf *b); |
| 1037 | |
| 1038 | /* |
| 1039 | * arch-specific gen.c/gsubr.c/obj.c |
Russ Cox | bac922c | 2009-03-30 19:15:07 -0700 | [diff] [blame] | 1040 | */ |
| 1041 | void betypeinit(void); |
| 1042 | vlong convvtox(vlong, int); |
| 1043 | void compile(Node*); |
| 1044 | void proglist(void); |
| 1045 | int optopop(int); |
| 1046 | void dumpobj(void); |
| 1047 | void dowidth(Type*); |
| 1048 | void argspace(int32); |
| 1049 | Node* nodarg(Type*, int); |
| 1050 | Type* deep(Type*); |
| 1051 | Type* shallow(Type*); |
| 1052 | Prog* gjmp(Prog*); |
| 1053 | void patch(Prog*, Prog*); |
| 1054 | void bgen(Node *n, int true, Prog *to); |
| 1055 | void cgen_asop(Node *n); |
| 1056 | void cgen_call(Node *n, int proc); |
| 1057 | void cgen_callinter(Node *n, Node *res, int proc); |
| 1058 | void cgen_ret(Node *n); |
| 1059 | int isfat(Type*); |
| 1060 | void clearfat(Node *n); |
| 1061 | void cgen(Node*, Node*); |
| 1062 | void gused(Node*); |
Russ Cox | 5e792b6 | 2009-03-30 21:31:29 -0700 | [diff] [blame] | 1063 | void dumpstrings(void); |
| 1064 | void dumpsignatures(void); |
| 1065 | void dumpfuncs(void); |
| 1066 | void ggloblnod(Node *nam, int32 width); |
| 1067 | void ggloblsym(Sym *s, int32 width, int dupok); |
| 1068 | void zfile(Biobuf *b, char *p, int n); |
| 1069 | void zhist(Biobuf *b, int line, vlong offset); |
| 1070 | void zname(Biobuf *b, Sym *s, int t); |
| 1071 | void dumpstrings(void); |
| 1072 | void nopout(Prog*); |
| 1073 | void datastring(char *s, int len); |
| 1074 | int dstringptr(Sym *s, int off, char *str); |
| 1075 | int dsymptr(Sym *s, int off, Sym *x); |
| 1076 | int duint16(Sym *s, int off, uint32 v); |
| 1077 | int duint32(Sym *s, int off, uint32 v); |
| 1078 | int duintptr(Sym *s, int off, uint32 v); |
| 1079 | int duintxx(Sym *s, int off, uint64 v, int wid); |
| 1080 | void genembedtramp(Type*, Sig*); |