blob: cdf2e2f1f963ecfc0639da7a7519542fcfd24612 [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/*
Rob Pike0cafb9e2008-06-04 14:37:38 -07006*/
7
8#include <u.h>
9#include <libc.h>
10#include <bio.h>
Ken Thompsonefec14b2008-06-13 18:16:23 -070011#include "compat.h"
Rob Pike0cafb9e2008-06-04 14:37:38 -070012
13#ifndef EXTERN
Russ Cox531f2422009-03-30 16:13:11 -070014#define EXTERN extern
Rob Pike0cafb9e2008-06-04 14:37:38 -070015#endif
16enum
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 Thompsonefec14b2008-06-13 18:16:23 -070026 HISTSZ = 10,
Rob Pike0cafb9e2008-06-04 14:37:38 -070027
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 Cox61590c42009-01-21 14:51:57 -080037 PRIME10 = 10093,
Ken Thompson89ac5612008-09-28 20:22:31 -070038
39 AUNK = 100,
Russ Coxa7f6d402009-01-26 09:56:42 -080040
Ken Thompson89ac5612008-09-28 20:22:31 -070041 // these values are known by runtime
Russ Coxa7f6d402009-01-26 09:56:42 -080042 AMEM = 0,
43 ANOEQ,
Ken Thompson89ac5612008-09-28 20:22:31 -070044 ASTRING,
Ken Thompson89ac5612008-09-28 20:22:31 -070045 AINTER,
Russ Coxd3f60932008-11-14 16:35:08 -080046
Russ Cox79214572008-11-11 13:46:55 -080047 BADWIDTH = -1000000000
Rob Pike0cafb9e2008-06-04 14:37:38 -070048};
49
50/*
51 * note this is the representation
52 * of the compilers string literals,
Ken Thompson36570612009-04-09 18:16:21 -070053 * it is not the runtime representation
Rob Pike0cafb9e2008-06-04 14:37:38 -070054 */
Ken Thompson36570612009-04-09 18:16:21 -070055typedef struct Strlit Strlit;
56struct Strlit
Rob Pike0cafb9e2008-06-04 14:37:38 -070057{
Russ Cox9aad9fe2008-08-03 17:25:15 -070058 int32 len;
Rob Pike0cafb9e2008-06-04 14:37:38 -070059 char s[3]; // variable
60};
61
Ken Thompson66a603c2008-08-27 17:28:30 -070062/*
63 * note this is the runtime representation
Ken Thompson26b357c2008-12-05 18:24:05 -080064 * 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 */
71typedef struct Hiter Hiter;
72struct 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 Thompson9c2ade32008-08-08 17:13:31 -070089enum
90{
Ken Thompson3fa46102008-12-01 17:22:05 -080091 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 Thompson9c2ade32008-08-08 17:13:31 -070095 Mpsign = Mpbase >> 1,
Ken Thompson3fa46102008-12-01 17:22:05 -080096 Mpmask = Mpbase - 1,
97 Mpdebug = 0,
Ken Thompson9c2ade32008-08-08 17:13:31 -070098};
99
100typedef struct Mpint Mpint;
101struct Mpint
102{
Ken Thompson9c2ade32008-08-08 17:13:31 -0700103 long a[Mpprec];
104 uchar neg;
105 uchar ovf;
106};
107
108typedef struct Mpflt Mpflt;
109struct Mpflt
110{
Ken Thompson3fa46102008-12-01 17:22:05 -0800111 Mpint val;
112 short exp;
Ken Thompson9c2ade32008-08-08 17:13:31 -0700113};
114
Rob Pike0cafb9e2008-06-04 14:37:38 -0700115typedef struct Val Val;
116struct Val
117{
Ken Thompson9c2ade32008-08-08 17:13:31 -0700118 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 Thompson36570612009-04-09 18:16:21 -0700125 Strlit* sval; // string CTSTR
Ken Thompson9c2ade32008-08-08 17:13:31 -0700126 } u;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700127};
128
129typedef struct Sym Sym;
130typedef struct Node Node;
131typedef struct Type Type;
Russ Coxaacdc252009-03-30 22:26:00 -0700132typedef struct Dcl Dcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700133
134struct Type
135{
Ken Thompson54abac62008-06-21 15:11:29 -0700136 uchar etype;
137 uchar chan;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700138 uchar recur; // to detect loops
139 uchar trecur; // to detect loops
Ken Thompson8877d272008-10-03 16:12:21 -0700140 uchar methptr; // 1=direct 2=pointer
Russ Coxb8babed2008-10-03 16:15:55 -0700141 uchar printed;
Ken Thompson14c63912008-10-21 20:55:40 -0700142 uchar embedded; // TFIELD embedded type
Russ Cox19831212008-11-05 11:27:50 -0800143 uchar siggen;
Russ Cox79214572008-11-11 13:46:55 -0800144 uchar funarg;
Ken Thompson92a11902008-12-09 13:00:50 -0800145 uchar copyany;
Russ Coxcb64ec52008-12-11 11:54:33 -0800146 uchar local; // created in this file
Ken Thompson54abac62008-06-21 15:11:29 -0700147
148 // TFUNCT
149 uchar thistuple;
150 uchar outtuple;
151 uchar intuple;
Ken Thompson417a9712008-07-05 12:49:25 -0700152 uchar outnamed;
Ken Thompson54abac62008-06-21 15:11:29 -0700153
Ken Thompson21192942008-09-14 16:57:55 -0700154 Type* method;
155
Rob Pike0cafb9e2008-06-04 14:37:38 -0700156 Sym* sym;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700157 int32 vargen; // unique name for OTYPE/ONAME
Rob Pike0cafb9e2008-06-04 14:37:38 -0700158
Ken Thompson21192942008-09-14 16:57:55 -0700159 Node* nname;
160 vlong argwid;
161
Rob Pike0cafb9e2008-06-04 14:37:38 -0700162 // 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 Thompson36570612009-04-09 18:16:21 -0700168 Strlit* note; // literal string annotation
Rob Pike0cafb9e2008-06-04 14:37:38 -0700169
Rob Pike0cafb9e2008-06-04 14:37:38 -0700170 // TARRAY
Ken Thompsonc6130e92008-08-28 15:17:37 -0700171 int32 bound; // negative is dynamic array
Rob Pike0cafb9e2008-06-04 14:37:38 -0700172};
173#define T ((Type*)0)
174
175struct Node
176{
Ken Thompson54abac62008-06-21 15:11:29 -0700177 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 Cox391425a2009-01-29 17:38:58 -0800182 uchar class; // PPARAM, PAUTO, PEXTERN, etc
Ken Thompson54abac62008-06-21 15:11:29 -0700183 uchar method; // OCALLMETH name
Ken Thompsond915b962008-07-03 16:41:32 -0700184 uchar iota; // OLITERAL made from iota
Ken Thompson14c63912008-10-21 20:55:40 -0700185 uchar embedded; // ODCLFIELD embedded type
Ken Thompsonae5a4752008-12-15 13:44:27 -0800186 uchar colas; // OAS resulting from :=
Russ Cox5b129cd2009-01-26 17:20:29 -0800187 uchar diag; // already printed error about this
Russ Cox391425a2009-01-29 17:38:58 -0800188 uchar noescape; // ONAME never move to heap
Russ Cox0970c462009-02-06 13:47:10 -0800189 uchar funcdepth;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700190
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 Cox391425a2009-01-29 17:38:58 -0800210 Node* enter;
211 Node* exit;
Russ Cox0970c462009-02-06 13:47:10 -0800212 Node* cvars; // closure params
Russ Coxaacdc252009-03-30 22:26:00 -0700213 Dcl* dcl; // outer autodcl
Rob Pike0cafb9e2008-06-04 14:37:38 -0700214
Ken Thompson9c2ade32008-08-08 17:13:31 -0700215 // OLITERAL/OREGISTER
Rob Pike0cafb9e2008-06-04 14:37:38 -0700216 Val val;
217
Russ Cox391425a2009-01-29 17:38:58 -0800218 // 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 Cox0970c462009-02-06 13:47:10 -0800223 // ONAME closure param with PPARAMREF
224 Node* outer; // outer PPARAMREF in nested closure
225 Node* closure; // ONAME/PHEAP <-> ONAME/PPARAMREF
226
Rob Pike0cafb9e2008-06-04 14:37:38 -0700227 Sym* osym; // import
Rob Pike0cafb9e2008-06-04 14:37:38 -0700228 Sym* psym; // import
229 Sym* sym; // various
Russ Cox9aad9fe2008-08-03 17:25:15 -0700230 int32 vargen; // unique name for OTYPE/ONAME
231 int32 lineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700232 vlong xoffset;
Russ Cox6b070212009-04-02 16:48:06 -0700233 int32 ostk;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700234};
235#define N ((Node*)0)
236
237struct Sym
238{
Ken Thompson57bd0da2008-12-09 18:31:31 -0800239 ushort block; // blocknumber to catch redeclaration
Ken Thompson54abac62008-06-21 15:11:29 -0700240
241 uchar undef; // a diagnostic has been generated
242 uchar export; // marked as export
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700243 uchar exported; // exported
Russ Cox9c7b0642008-11-14 17:31:29 -0800244 uchar imported; // imported
Ken Thompson54abac62008-06-21 15:11:29 -0700245 uchar sym; // huffman encoding in object file
Ken Thompsonb379d542008-10-24 20:14:28 -0700246 uchar uniq; // imbedded field name first found
Russ Cox19831212008-11-05 11:27:50 -0800247 uchar siggen; // signature generated
Ken Thompson54abac62008-06-21 15:11:29 -0700248
Rob Pike0cafb9e2008-06-04 14:37:38 -0700249 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 Pike0cafb9e2008-06-04 14:37:38 -0700255 vlong offset; // stack location if automatic
Russ Cox9aad9fe2008-08-03 17:25:15 -0700256 int32 lexical;
257 int32 vargen; // unique variable number
Ken Thompson57bd0da2008-12-09 18:31:31 -0800258 int32 lastlineno; // last declaration for diagnostic
Rob Pike0cafb9e2008-06-04 14:37:38 -0700259 Sym* link;
260};
261#define S ((Sym*)0)
262
Rob Pike0cafb9e2008-06-04 14:37:38 -0700263struct Dcl
264{
Ken Thompson54abac62008-06-21 15:11:29 -0700265 uchar op;
Ken Thompsonf25843e2008-10-04 15:17:49 -0700266 ushort block;
267 int32 lineno;
268
Rob Pike0cafb9e2008-06-04 14:37:38 -0700269 Sym* dsym; // for printing only
270 Node* dnode; // oname
271 Type* dtype; // otype
Rob Pike0cafb9e2008-06-04 14:37:38 -0700272
273 Dcl* forw;
274 Dcl* back; // sentinel has pointer to last
275};
276#define D ((Dcl*)0)
277
278typedef struct Iter Iter;
279struct Iter
280{
281 int done;
282 Type* tfunc;
283 Type* t;
284 Node** an;
285 Node* n;
286};
287
Ken Thompsonefec14b2008-06-13 18:16:23 -0700288typedef struct Hist Hist;
289struct Hist
290{
291 Hist* link;
292 char* name;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700293 int32 line;
294 int32 offset;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700295};
296#define H ((Hist*)0)
297
Rob Pike0cafb9e2008-06-04 14:37:38 -0700298enum
299{
300 OXXX,
301
Ken Thompson989676d2008-08-03 18:47:02 -0700302 OTYPE, OCONST, OVAR, OIMPORT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700303
Russ Cox391425a2009-01-29 17:38:58 -0800304 ONAME, ONONAME, ODCL,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700305 ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
306 ODCLFUNC, ODCLFIELD, ODCLARG,
Ken Thompsonb79272d2008-12-06 13:40:30 -0800307 OLIST, OCMP, OPTR, OARRAY, ORANGE,
Ken Thompson1e1cc4e2009-01-27 12:03:53 -0800308 ORETURN, OFOR, OIF, OSWITCH, ODEFER,
Ken Thompson9dbaab52008-09-04 12:21:10 -0700309 OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
Ken Thompson88b5c5f2009-01-06 14:52:26 -0800310 OGOTO, OPROC, OMAKE, ONEW, OEMPTY, OSELECT,
Ken Thompsonf21e7312008-10-02 14:38:07 -0700311 OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF,
Ken Thompson6eb54cb2009-03-12 17:55:11 -0700312 OCLOSE, OCLOSED,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700313
314 OOROR,
315 OANDAND,
316 OEQ, ONE, OLT, OLE, OGE, OGT,
317 OADD, OSUB, OOR, OXOR,
Ken Thompsonbb02e482009-03-11 19:59:35 -0700318 OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
Ken Thompsone081f252008-11-22 17:58:53 -0800319 OINC, ODEC, // placeholders - not used
Rob Pike0cafb9e2008-06-04 14:37:38 -0700320 OFUNC,
321 OLABEL,
322 OBREAK,
323 OCONTINUE,
324 OADDR,
325 OIND,
326 OCALL, OCALLMETH, OCALLINTER,
Russ Coxae167bf2009-01-09 15:21:41 -0800327 OINDEX, OSLICE,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700328 ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
329 OLITERAL, OREGISTER, OINDREG,
Russ Cox07244f72009-02-13 14:48:16 -0800330 OKEY, OPARAM,
Russ Cox49cc6492009-03-03 08:41:02 -0800331 OCOMPOS,
Russ Cox07244f72009-02-13 14:48:16 -0800332 OCONV,
Ken Thompsona4a10ed2009-03-06 17:50:43 -0800333 ODOTTYPE, OTYPESW,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700334 OBAD,
Russ Cox20595ac2009-01-08 14:30:00 -0800335
Russ Cox2d259c82009-01-05 17:32:23 -0800336 OEXTEND, // 6g internal
Rob Pike0cafb9e2008-06-04 14:37:38 -0700337
338 OEND,
339};
340enum
341{
342 Txxx, // 0
343
344 TINT8, TUINT8, // 1
345 TINT16, TUINT16,
346 TINT32, TUINT32,
347 TINT64, TUINT64,
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700348 TINT, TUINT, TUINTPTR,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700349
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700350 TFLOAT32, // 12
Rob Pike0cafb9e2008-06-04 14:37:38 -0700351 TFLOAT64,
352 TFLOAT80,
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700353 TFLOAT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700354
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700355 TBOOL, // 16
Rob Pike0cafb9e2008-06-04 14:37:38 -0700356
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700357 TPTR32, TPTR64, // 17
Rob Pike0cafb9e2008-06-04 14:37:38 -0700358
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700359 TDDD, // 19
Rob Pike0cafb9e2008-06-04 14:37:38 -0700360 TFUNC,
361 TARRAY,
Ken Thompsonc6130e92008-08-28 15:17:37 -0700362 T_old_DARRAY,
Russ Coxc4416ac2008-12-19 09:03:24 -0800363 TSTRUCT, // 23
Rob Pike0cafb9e2008-06-04 14:37:38 -0700364 TCHAN,
365 TMAP,
Russ Coxc4416ac2008-12-19 09:03:24 -0800366 TINTER, // 26
Rob Pike0cafb9e2008-06-04 14:37:38 -0700367 TFORW,
368 TFIELD,
369 TANY,
370 TSTRING,
Russ Cox74e2e082008-10-06 16:44:17 -0700371 TFORWSTRUCT,
372 TFORWINTER,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700373
Russ Cox8f194bf2009-03-12 19:04:38 -0700374 // pseudo-types for literals
375 TIDEAL,
376 TNIL,
377
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700378 NTYPE,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700379};
380enum
381{
382 CTxxx,
383
384 CTINT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700385 CTFLT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700386 CTSTR,
387 CTBOOL,
388 CTNIL,
389};
390
391enum
392{
Rob Pike0cafb9e2008-06-04 14:37:38 -0700393 /* types of channel */
394 Cxxx,
395 Cboth,
396 Crecv,
397 Csend,
398};
399
400enum
401{
402 Pxxx,
403
404 PEXTERN, // declaration context
405 PAUTO,
406 PPARAM,
Russ Cox391425a2009-01-29 17:38:58 -0800407 PPARAMOUT,
Russ Cox0970c462009-02-06 13:47:10 -0800408 PPARAMREF, // param passed by reference
Russ Cox4a431982009-01-30 14:39:42 -0800409 PFUNC,
Russ Cox391425a2009-01-29 17:38:58 -0800410
411 PHEAP = 1<<7,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700412};
413
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700414enum
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 Cox531f2422009-03-30 16:13:11 -0700423#define BITS 5
424#define NVAR (BITS*sizeof(uint32)*8)
425
426typedef struct Bits Bits;
427struct Bits
428{
429 uint32 b[BITS];
430};
431
432EXTERN Bits zbits;
433
434typedef struct Var Var;
435struct Var
436{
437 vlong offset;
438 Sym* sym;
439 char name;
440 char etype;
441};
442
443EXTERN Var var[NVAR];
444
Russ Cox8e547292009-03-30 17:09:28 -0700445typedef struct Typedef Typedef;
446struct Typedef
447{
448 char* name;
449 int etype;
450 int sameas;
451};
452
453extern Typedef typedefs[];
Russ Cox531f2422009-03-30 16:13:11 -0700454
Russ Coxd30285a2009-03-30 17:52:21 -0700455typedef struct Sig Sig;
456struct Sig
457{
458 char* name;
459 Sym* sym;
460 uint32 hash;
461 int32 perm;
462 int32 offset;
463 Sig* link;
464};
465
466typedef struct Pool Pool;
467struct Pool
468{
Ken Thompson36570612009-04-09 18:16:21 -0700469 Strlit* sval;
Russ Coxd30285a2009-03-30 17:52:21 -0700470 Pool* link;
471};
472
473EXTERN Pool* poolist;
474EXTERN Pool* poolast;
Ken Thompson36570612009-04-09 18:16:21 -0700475EXTERN Sym* symstringl; // string literals
476EXTERN Sym* symstringc; // string characters
477EXTERN int32 stringl; // size of string literals
478EXTERN int32 stringc; // size of string characters
Russ Coxd30285a2009-03-30 17:52:21 -0700479
Rob Pike0cafb9e2008-06-04 14:37:38 -0700480typedef struct Io Io;
481struct Io
482{
483 char* infile;
484 Biobuf* bin;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700485 int32 ilineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700486 int peekc;
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700487 int peekc1; // second peekc for ...
Rob Pike0cafb9e2008-06-04 14:37:38 -0700488 char* cp; // used for content when bin==nil
489};
490
Ken Thompsonb379d542008-10-24 20:14:28 -0700491typedef struct Dlist Dlist;
492struct Dlist
493{
Ken Thompsonb642cf82008-10-25 13:31:25 -0700494 Type* field;
Ken Thompsonb379d542008-10-24 20:14:28 -0700495};
496
Ian Lance Taylor062d6992009-03-10 20:03:31 -0700497typedef struct Idir Idir;
498struct Idir
499{
500 Idir* link;
501 char* dir;
502};
503
Russ Cox8e547292009-03-30 17:09:28 -0700504/*
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 Thompson36570612009-04-09 18:16:21 -0700515EXTERN int Array_array; // runtime offsetof(Array,array) - same for String
516EXTERN int Array_nel; // runtime offsetof(Array,nel) - same for String
Russ Cox8e547292009-03-30 17:09:28 -0700517EXTERN int Array_cap; // runtime offsetof(Array,cap)
518EXTERN int sizeof_Array; // runtime sizeof(Array)
519
Ken Thompson36570612009-04-09 18:16:21 -0700520
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 */
531EXTERN int sizeof_String; // runtime sizeof(String)
532
Ken Thompsonb379d542008-10-24 20:14:28 -0700533EXTERN Dlist dotlist[10]; // size is max depth of embeddeds
534
Rob Pike0cafb9e2008-06-04 14:37:38 -0700535EXTERN Io curio;
536EXTERN Io pushedio;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700537EXTERN int32 lineno;
Russ Cox46566862008-11-18 09:32:05 -0800538EXTERN int32 prevlineno;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700539EXTERN char* pathname;
540EXTERN Hist* hist;
541EXTERN Hist* ehist;
542
Ken Thompsonbbb20732008-06-05 19:38:39 -0700543EXTERN char* infile;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700544EXTERN char* outfile;
545EXTERN char* package;
546EXTERN Biobuf* bout;
547EXTERN int nerrors;
548EXTERN char namebuf[NSYMB];
Russ Cox58f5f4f2009-04-02 17:59:09 -0700549EXTERN char lexbuf[NSYMB];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700550EXTERN char debug[256];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700551EXTERN Sym* hash[NHASH];
552EXTERN Sym* dclstack;
553EXTERN Sym* b0stack;
554EXTERN Sym* pkgmyname; // my name for package
Ken Thompson343f5aa2008-06-12 21:48:56 -0700555EXTERN Sym* pkgimportname; // package name from imported package
Rob Pike0cafb9e2008-06-04 14:37:38 -0700556EXTERN int tptr; // either TPTR32 or TPTR64
557extern char* sysimport;
Ken Thompson1d4daa22008-12-08 19:46:39 -0800558extern char* unsafeimport;
Ken Thompson45288542008-07-08 17:19:17 -0700559EXTERN char* filename; // name to uniqify names
Ian Lance Taylor062d6992009-03-10 20:03:31 -0700560EXTERN Idir* idirs;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700561
562EXTERN Type* types[NTYPE];
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700563EXTERN uchar simtype[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700564EXTERN uchar isptr[NTYPE];
565EXTERN uchar isint[NTYPE];
566EXTERN uchar isfloat[NTYPE];
567EXTERN uchar issigned[NTYPE];
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700568EXTERN uchar issimple[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700569EXTERN uchar okforeq[NTYPE];
570EXTERN uchar okforadd[NTYPE];
571EXTERN uchar okforand[NTYPE];
Ken Thompson9c2ade32008-08-08 17:13:31 -0700572
573EXTERN Mpint* minintval[NTYPE];
574EXTERN Mpint* maxintval[NTYPE];
575EXTERN Mpflt* minfltval[NTYPE];
576EXTERN Mpflt* maxfltval[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700577
578EXTERN Dcl* autodcl;
Ken Thompson80038492008-07-16 17:22:54 -0700579EXTERN Dcl* paramdcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700580EXTERN Dcl* externdcl;
581EXTERN Dcl* exportlist;
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700582EXTERN Dcl* signatlist;
Russ Coxaacfbb42008-10-21 14:34:45 -0700583EXTERN Dcl* typelist;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700584EXTERN int dclcontext; // PEXTERN/PAUTO
585EXTERN int importflag;
Ken Thompson2254a8e2008-06-11 21:06:26 -0700586EXTERN int inimportsys;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700587
Russ Cox9aad9fe2008-08-03 17:25:15 -0700588EXTERN uint32 iota;
Ken Thompsond915b962008-07-03 16:41:32 -0700589EXTERN Node* lastconst;
Russ Cox8f194bf2009-03-12 19:04:38 -0700590EXTERN Type* lasttype;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700591EXTERN int32 vargen;
592EXTERN int32 exportgen;
593EXTERN int32 maxarg;
Ken Thompson1ea5bc72008-10-13 20:14:09 -0700594EXTERN int32 stksize; // stack size for current frame
595EXTERN int32 initstksize; // stack size for init function
Ken Thompson54abac62008-06-21 15:11:29 -0700596EXTERN ushort blockgen; // max block number
597EXTERN ushort block; // current block number
Ken Thompson1e1cc4e2009-01-27 12:03:53 -0800598EXTERN int hasdefer; // flag that curfn has defer statetment
Rob Pike0cafb9e2008-06-04 14:37:38 -0700599
Russ Cox8e547292009-03-30 17:09:28 -0700600EXTERN int maxround;
601EXTERN int widthptr;
602
Rob Pike0cafb9e2008-06-04 14:37:38 -0700603EXTERN Node* retnil;
604EXTERN Node* fskel;
605
Russ Cox9906bfc2008-11-06 13:31:13 -0800606EXTERN Node* addtop;
Ken Thompsona4a10ed2009-03-06 17:50:43 -0800607EXTERN Node* typeswvar;
Russ Cox9906bfc2008-11-06 13:31:13 -0800608
Rob Pike0cafb9e2008-06-04 14:37:38 -0700609EXTERN char* context;
Russ Cox4efad582009-01-26 16:57:24 -0800610EXTERN char* pkgcontext;
Russ Cox5e792b62009-03-30 21:31:29 -0700611extern int thechar;
612extern char* thestring;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700613EXTERN char* hunk;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700614EXTERN int32 nhunk;
615EXTERN int32 thunk;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700616
Russ Coxb8babed2008-10-03 16:15:55 -0700617EXTERN int exporting;
618
Russ Cox0970c462009-02-06 13:47:10 -0800619EXTERN int funcdepth;
620
621EXTERN Node* funclit;
622
Rob Pike0cafb9e2008-06-04 14:37:38 -0700623/*
624 * y.tab.c
625 */
626int yyparse(void);
627
628/*
629 * lex.c
630 */
Ken Thompson45288542008-07-08 17:19:17 -0700631void setfilename(char*);
Ian Lance Taylor062d6992009-03-10 20:03:31 -0700632void addidir(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700633void importfile(Val*);
Ken Thompson1d4daa22008-12-08 19:46:39 -0800634void cannedimports(char*, char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700635void unimportfile();
Russ Cox9aad9fe2008-08-03 17:25:15 -0700636int32 yylex(void);
Russ Cox8e547292009-03-30 17:09:28 -0700637void typeinit(int lex);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700638void lexinit(void);
639char* lexname(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700640int32 getr(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700641int getnsc(void);
Ken Thompsonf9c58c22008-06-08 19:02:27 -0700642int escchar(int, int*, vlong*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700643int getc(void);
644void ungetc(int);
645void mkpackage(char*);
646
647/*
Ken Thompson272ae652008-08-09 17:29:26 -0700648 * mparith1.c
Rob Pike0cafb9e2008-06-04 14:37:38 -0700649 */
Ken Thompson47975232008-08-12 14:04:03 -0700650int mpcmpfixflt(Mpint *a, Mpflt *b);
651int mpcmpfltfix(Mpflt *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700652int mpcmpfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700653int mpcmpfixc(Mpint *b, vlong c);
Ken Thompson272ae652008-08-09 17:29:26 -0700654int mpcmpfltflt(Mpflt *a, Mpflt *b);
655int mpcmpfltc(Mpflt *b, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700656void mpsubfixfix(Mpint *a, Mpint *b);
657void mpsubfltflt(Mpflt *a, Mpflt *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700658void mpaddcfix(Mpint *a, vlong c);
659void mpaddcflt(Mpflt *a, double c);
660void mpmulcfix(Mpint *a, vlong c);
661void mpmulcflt(Mpflt *a, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700662void mpdivfixfix(Mpint *a, Mpint *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700663void mpmodfixfix(Mpint *a, Mpint *b);
664void mpatofix(Mpint *a, char *s);
665void mpatoflt(Mpflt *a, char *s);
Russ Cox8f194bf2009-03-12 19:04:38 -0700666int mpmovefltfix(Mpint *a, Mpflt *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700667void mpmovefixflt(Mpflt *a, Mpint *b);
Ken Thompson2b755562008-08-11 13:22:04 -0700668int Bconv(Fmt*);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700669
Ken Thompson272ae652008-08-09 17:29:26 -0700670/*
671 * mparith2.c
672 */
673void mpmovefixfix(Mpint *a, Mpint *b);
674void mpmovecfix(Mpint *a, vlong v);
675int mptestfix(Mpint *a);
676void mpaddfixfix(Mpint *a, Mpint *b);
677void mpmulfixfix(Mpint *a, Mpint *b);
Ken Thompson3fa46102008-12-01 17:22:05 -0800678void mpmulfract(Mpint *a, Mpint *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700679void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
Ken Thompson3fa46102008-12-01 17:22:05 -0800680void mpdivfract(Mpint *a, Mpint *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700681void mpnegfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700682void mpandfixfix(Mpint *a, Mpint *b);
Russ Cox8f194bf2009-03-12 19:04:38 -0700683void mpandnotfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700684void mplshfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700685void mporfixfix(Mpint *a, Mpint *b);
686void mprshfixfix(Mpint *a, Mpint *b);
687void mpxorfixfix(Mpint *a, Mpint *b);
688void mpcomfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700689vlong mpgetfix(Mpint *a);
Ken Thompson3fa46102008-12-01 17:22:05 -0800690void mpshiftfix(Mpint *a, int s);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700691
Ken Thompson272ae652008-08-09 17:29:26 -0700692/*
693 * mparith3.c
694 */
Ken Thompsonf8797da2008-12-03 13:17:26 -0800695int sigfig(Mpflt *a);
696void mpnorm(Mpflt *a);
Ken Thompson272ae652008-08-09 17:29:26 -0700697void mpmovefltflt(Mpflt *a, Mpflt *b);
698void mpmovecflt(Mpflt *a, double f);
699int mptestflt(Mpflt *a);
700void mpaddfltflt(Mpflt *a, Mpflt *b);
701void mpmulfltflt(Mpflt *a, Mpflt *b);
702void mpdivfltflt(Mpflt *a, Mpflt *b);
703void mpnegflt(Mpflt *a);
704double mpgetflt(Mpflt *a);
Ken Thompson3fa46102008-12-01 17:22:05 -0800705int Fconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700706
707/*
708 * subr.c
709 */
Russ Cox9aad9fe2008-08-03 17:25:15 -0700710void* mal(int32);
711void* remal(void*, int32, int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700712void errorexit(void);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700713uint32 stringhash(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700714Sym* lookup(char*);
715Sym* pkglookup(char*, char*);
716void yyerror(char*, ...);
717void warn(char*, ...);
718void fatal(char*, ...);
Russ Coxf95da9a2009-04-08 22:45:33 -0700719void linehist(char*, int32, int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700720int32 setlineno(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700721Node* nod(int, Node*, Node*);
Russ Cox8f194bf2009-03-12 19:04:38 -0700722Node* nodlit(Val);
Ken Thompsonc242b532008-06-17 22:33:32 -0700723Node* list(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700724Type* typ(int);
725Dcl* dcl(void);
Ken Thompson89ac5612008-09-28 20:22:31 -0700726int algtype(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700727Node* rev(Node*);
728Node* unrev(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700729Node* appendr(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700730void dodump(Node*, int);
731void dump(char*, Node*);
732Type* aindex(Node*, Type*);
733int isnil(Node*);
734int isptrto(Type*, int);
Russ Coxa91af042009-01-09 11:13:39 -0800735int istype(Type*, int);
Russ Coxae167bf2009-01-09 15:21:41 -0800736int isfixedarray(Type*);
737int isslice(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700738int isinter(Type*);
Ken Thompson1bf38482008-10-15 17:08:10 -0700739int isnilinter(Type*);
Ken Thompson74427c62008-11-01 16:36:46 -0700740int isddd(Type*);
Russ Cox98b34e52009-03-04 17:38:37 -0800741Type* maptype(Type*, Type*);
Russ Coxe5124812009-01-08 18:06:06 -0800742Type* dclmethod(Type*);
Ken Thompson7ed8fc62008-10-22 18:18:08 -0700743Type* methtype(Type*);
Russ Coxe5124812009-01-08 18:06:06 -0800744int methconv(Type*);
Russ Cox19831212008-11-05 11:27:50 -0800745Sym* signame(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700746int eqtype(Type*, Type*, int);
Russ Coxb0009be2009-02-05 15:22:49 -0800747int eqtypenoname(Type*, Type*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700748void argtype(Node*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700749int eqargs(Type*, Type*);
Ken Thompson0f469a92009-03-17 13:58:38 -0700750uint32 typehash(Type*, int, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700751void frame(int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700752Node* dobad(void);
Russ Cox8f194bf2009-03-12 19:04:38 -0700753Node* nodintconst(int64);
Russ Coxd30285a2009-03-30 17:52:21 -0700754void nodconst(Node*, Type*, int64);
Russ Cox8f194bf2009-03-12 19:04:38 -0700755Node* nodnil(void);
756Node* nodbool(int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700757void ullmancalc(Node*);
758void badtype(int, Type*, Type*);
759Type* ptrto(Type*);
760Node* cleanidlist(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700761Node* syslook(char*, int);
Ken Thompsond915b962008-07-03 16:41:32 -0700762Node* treecopy(Node*);
Russ Cox45f4e382008-10-03 16:23:02 -0700763int isselect(Node*);
764void tempname(Node*, Type*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700765int iscomposite(Type*);
Russ Cox391425a2009-01-29 17:38:58 -0800766Node* callnew(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700767
768Type** getthis(Type*);
769Type** getoutarg(Type*);
770Type** getinarg(Type*);
771
772Type* getthisx(Type*);
773Type* getoutargx(Type*);
774Type* getinargx(Type*);
775
776Node* listfirst(Iter*, Node**);
777Node* listnext(Iter*);
778Type* structfirst(Iter*, Type**);
779Type* structnext(Iter*);
780Type* funcfirst(Iter*, Type*);
781Type* funcnext(Iter*);
782
Russ Coxd30285a2009-03-30 17:52:21 -0700783int brcom(int);
784int brrev(int);
785void setmaxarg(Type*);
786Sig* lsort(Sig*, int(*)(Sig*, Sig*));
787int dotoffset(Node*, int*, Node**);
788void stringpool(Node*);
789void tempname(Node*, Type*);
790
Rob Pike0cafb9e2008-06-04 14:37:38 -0700791int Econv(Fmt*);
792int Jconv(Fmt*);
Ken Thompsonefec14b2008-06-13 18:16:23 -0700793int Lconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700794int Oconv(Fmt*);
795int Sconv(Fmt*);
796int Tconv(Fmt*);
797int Nconv(Fmt*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700798int Wconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700799int Zconv(Fmt*);
800
Russ Cox20595ac2009-01-08 14:30:00 -0800801int lookdot0(Sym*, Type*, Type**);
Russ Coxe5124812009-01-08 18:06:06 -0800802Type* lookdot1(Sym*, Type*, Type*);
Russ Cox20595ac2009-01-08 14:30:00 -0800803int adddot1(Sym*, Type*, int, Type**);
Ken Thompsonb379d542008-10-24 20:14:28 -0700804Node* adddot(Node*);
805void expand0(Type*);
806void expand1(Type*, int);
807void expandmeth(Sym*, Type*);
Russ Cox20595ac2009-01-08 14:30:00 -0800808void genptrtramp(Sym*, Sym*, Type*, Type*, Sym*, Type*);
Ken Thompsonb379d542008-10-24 20:14:28 -0700809
Rob Pike0cafb9e2008-06-04 14:37:38 -0700810/*
811 * dcl.c
812 */
813void dodclvar(Node*, Type*);
Russ Cox74e2e082008-10-06 16:44:17 -0700814Type* dodcltype(Type*);
815void updatetype(Type*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700816void dodclconst(Node*, Node*);
Russ Cox8f194bf2009-03-12 19:04:38 -0700817void defaultlit(Node*, Type*);
818void defaultlit2(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700819int listcount(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700820void addmethod(Node*, Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700821Node* methodname(Node*, Type*);
Russ Coxc249a8de2008-11-03 15:36:08 -0800822Sym* methodsym(Sym*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700823Type* functype(Node*, Node*, Node*);
824char* thistypenam(Node*);
825void funcnam(Type*, char*);
Ken Thompsonf24f8ff2008-07-19 18:39:12 -0700826Node* renameinit(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700827void funchdr(Node*);
828void funcargs(Type*);
829void funcbody(Node*);
830Type* dostruct(Node*, int);
Russ Coxf1fe21a2009-01-26 17:06:20 -0800831Type** stotype(Node*, int, Type**);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700832Type* sortinter(Type*);
Ken Thompson417a9712008-07-05 12:49:25 -0700833void markdcl(void);
834void popdcl(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700835void poptodcl(void);
Ken Thompson80038492008-07-16 17:22:54 -0700836void dumpdcl(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700837void markdclstack(void);
838void testdclstack(void);
839Sym* pushdcl(Sym*);
840void addvar(Node*, Type*, int);
Russ Cox74e2e082008-10-06 16:44:17 -0700841void addtyp(Type*, int);
842void addconst(Node*, Node*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700843Node* fakethis(void);
844Node* newname(Sym*);
845Node* oldname(Sym*);
846Type* newtype(Sym*);
847Type* oldtype(Sym*);
Ken Thompsonfb3af532008-07-19 13:38:29 -0700848void fninit(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700849Node* nametoanondcl(Node*);
850Node* nametodcl(Node*, Type*);
851Node* anondcl(Type*);
Russ Coxb8babed2008-10-03 16:15:55 -0700852void checkarglist(Node*);
Russ Cox74e2e082008-10-06 16:44:17 -0700853void checkwidth(Type*);
854void defercheckwidth(void);
855void resumecheckwidth(void);
Ken Thompson14c63912008-10-21 20:55:40 -0700856Node* embedded(Sym*);
Ken Thompsonc5978452008-12-04 15:33:40 -0800857Node* variter(Node*, Type*, Node*);
858void constiter(Node*, Type*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700859
Russ Cox0970c462009-02-06 13:47:10 -0800860void funclit0(Type*);
861Node* funclit1(Type*, Node*);
Ken Thompson8a705452009-02-07 12:34:45 -0800862Node* unsafenmagic(Node*, Node*);
Russ Cox0970c462009-02-06 13:47:10 -0800863
Rob Pike0cafb9e2008-06-04 14:37:38 -0700864/*
865 * export.c
866 */
Ken Thompson343f5aa2008-06-12 21:48:56 -0700867void renamepkg(Node*);
Russ Cox07d344e2009-01-15 16:16:52 -0800868void autoexport(Sym*);
Russ Cox06869ee2009-01-16 15:25:52 -0800869int exportname(char*);
Ken Thompson989676d2008-08-03 18:47:02 -0700870void exportsym(Sym*);
Russ Coxd3f60932008-11-14 16:35:08 -0800871void packagesym(Sym*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700872void dumpe(Sym*);
873void dumpexport(void);
874void dumpexporttype(Sym*);
875void dumpexportvar(Sym*);
876void dumpexportconst(Sym*);
877void doimportv1(Node*, Node*);
878void doimportc1(Node*, Val*);
879void doimportc2(Node*, Node*, Val*);
880void doimport1(Node*, Node*, Node*);
881void doimport2(Node*, Val*, Node*);
882void doimport3(Node*, Node*);
883void doimport4(Node*, Node*);
884void doimport5(Node*, Val*);
885void doimport6(Node*, Node*);
886void doimport7(Node*, Node*);
Ken Thompson3856e452008-07-12 13:08:53 -0700887void doimport8(Node*, Val*, Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700888void doimport9(Sym*, Node*);
Russ Cox8f194bf2009-03-12 19:04:38 -0700889void importconst(Node *ss, Type *t, Node *v);
Russ Coxb8babed2008-10-03 16:15:55 -0700890void importmethod(Sym *s, Type *t);
Russ Cox0183baa2009-01-20 14:40:00 -0800891void importtype(Node *ss, Type *t);
Russ Cox4a431982009-01-30 14:39:42 -0800892void importvar(Node *ss, Type *t, int ctxt);
Russ Coxb8babed2008-10-03 16:15:55 -0700893void checkimports(void);
894Type* pkgtype(char*, char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700895
896/*
897 * walk.c
898 */
Ken Thompsond01a1ec2008-09-14 17:29:50 -0700899void addtotop(Node*);
900void gettype(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700901void walk(Node*);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700902void walkstate(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700903void walktype(Node*, int);
Russ Cox07244f72009-02-13 14:48:16 -0800904void walkconv(Node*);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700905void walkas(Node*);
Ken Thompson417a9712008-07-05 12:49:25 -0700906void walkbool(Node*);
Ken Thompsonbf983472009-03-05 15:49:34 -0800907void walkswitch(Node*);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700908void walkselect(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700909void walkdot(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700910Node* ascompatee(int, Node**, Node**);
911Node* ascompatet(int, Node**, Type**, int);
912Node* ascompatte(int, Type**, Node**, int);
913int ascompat(Type*, Type*);
Ken Thompsonf21e7312008-10-02 14:38:07 -0700914Node* prcompat(Node*, int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700915Node* nodpanic(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700916Node* newcompat(Node*);
Ken Thompson88b5c5f2009-01-06 14:52:26 -0800917Node* makecompat(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700918Node* stringop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700919Type* fixmap(Type*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700920Node* mapop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700921Type* fixchan(Type*);
Ken Thompson3856e452008-07-12 13:08:53 -0700922Node* chanop(Node*, int);
Ken Thompson66a603c2008-08-27 17:28:30 -0700923Node* arrayop(Node*, int);
Ken Thompson8231e942008-09-22 12:16:19 -0700924Node* ifaceop(Type*, Node*, int);
Russ Cox5f4f5642009-02-11 17:57:29 -0800925int ifaceas(Type*, Type*, int);
926int ifaceas1(Type*, Type*, int);
927void ifacecheck(Type*, Type*, int, int);
Russ Coxe5124812009-01-08 18:06:06 -0800928void runifacechecks(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700929Node* convas(Node*);
Ken Thompson8200a0b2008-06-08 12:48:37 -0700930void arrayconv(Type*, Node*);
Ken Thompson54abac62008-06-21 15:11:29 -0700931Node* colas(Node*, Node*);
Ken Thompsonb79272d2008-12-06 13:40:30 -0800932Node* dorange(Node*);
Ken Thompson0b3093f2008-06-10 21:29:57 -0700933Node* reorder1(Node*);
934Node* reorder2(Node*);
935Node* reorder3(Node*);
936Node* reorder4(Node*);
Russ Cox391425a2009-01-29 17:38:58 -0800937Node* structlit(Node*, Node*);
Russ Cox07244f72009-02-13 14:48:16 -0800938Node* arraylit(Node*, Node*);
939Node* maplit(Node*, Node*);
Ken Thompson30444032008-09-16 20:51:50 -0700940Node* selectas(Node*, Node*);
941Node* old2new(Node*, Type*);
Russ Cox391425a2009-01-29 17:38:58 -0800942void addrescapes(Node*);
943void heapmoves(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700944
945/*
946 * const.c
947 */
Ken Thompsone683fb72008-12-12 13:10:36 -0800948void convlit1(Node*, Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700949void convlit(Node*, Type*);
950void evconst(Node*);
951int cmpslit(Node *l, Node *r);
Ken Thompson42d89ac2008-12-14 18:45:00 -0800952int smallintconst(Node*);
Russ Cox8f194bf2009-03-12 19:04:38 -0700953int consttype(Node*);
954int isconst(Node*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700955
956/*
Russ Cox8e547292009-03-30 17:09:28 -0700957 * align.c
958 */
959uint32 rnd(uint32, uint32);
960void dowidth(Type*);
Russ Coxbac922c2009-03-30 19:15:07 -0700961int argsize(Type*);
Russ Cox8e547292009-03-30 17:09:28 -0700962
963/*
964 * bits.c
Russ Cox531f2422009-03-30 16:13:11 -0700965 */
966Bits bor(Bits, Bits);
967Bits band(Bits, Bits);
968Bits bnot(Bits);
969int bany(Bits*);
970int bnum(Bits);
971Bits blsh(uint);
972int beq(Bits, Bits);
973int bset(Bits, uint);
974int Qconv(Fmt *fp);
975int bitno(int32);
Russ Cox8e547292009-03-30 17:09:28 -0700976
Russ Coxbac922c2009-03-30 19:15:07 -0700977/*
978 * gen.c
979 */
980typedef struct Prog Prog;
981#define P ((Prog*)0)
982
983typedef struct Label Label;
984struct 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
995EXTERN Label* labellist;
996EXTERN Label* findlab(Sym*);
997
Russ Cox5e792b62009-03-30 21:31:29 -0700998typedef struct Plist Plist;
999struct Plist
1000{
1001 Node* name;
1002 Dcl* locals;
1003 Prog* firstpc;
1004 int recur;
1005 Plist* link;
1006};
1007
1008EXTERN Plist* plist;
1009EXTERN Plist* plast;
1010
Russ Coxbac922c2009-03-30 19:15:07 -07001011EXTERN Prog* continpc;
1012EXTERN Prog* breakpc;
1013EXTERN Prog* pc;
1014EXTERN Prog* firstpc;
1015
1016void allocparams(void);
1017void cgen_as(Node *nl, Node *nr);
1018void cgen_callmeth(Node *n, int proc);
1019void cgen_dcl(Node *n);
1020void cgen_proc(Node *n, int proc);
1021void checklabels(void);
1022Label* findlab(Sym *s);
1023void gen(Node *n);
1024void newlab(int op, Sym *s);
1025Node* sysfunc(char *name);
Russ Cox5e792b62009-03-30 21:31:29 -07001026Plist* newplist(void);
Russ Coxbac922c2009-03-30 19:15:07 -07001027
1028/*
Russ Cox5e792b62009-03-30 21:31:29 -07001029 * obj.c
1030 */
1031void Bputdot(Biobuf *b);
1032void dumpfuncs(void);
1033void dumpglobls(void);
1034void dumpobj(void);
1035void ieeedtod(uint64 *ieee, double native);
1036void outhist(Biobuf *b);
1037
1038/*
1039 * arch-specific gen.c/gsubr.c/obj.c
Russ Coxbac922c2009-03-30 19:15:07 -07001040 */
1041void betypeinit(void);
1042vlong convvtox(vlong, int);
1043void compile(Node*);
1044void proglist(void);
1045int optopop(int);
1046void dumpobj(void);
1047void dowidth(Type*);
1048void argspace(int32);
1049Node* nodarg(Type*, int);
1050Type* deep(Type*);
1051Type* shallow(Type*);
1052Prog* gjmp(Prog*);
1053void patch(Prog*, Prog*);
1054void bgen(Node *n, int true, Prog *to);
1055void cgen_asop(Node *n);
1056void cgen_call(Node *n, int proc);
1057void cgen_callinter(Node *n, Node *res, int proc);
1058void cgen_ret(Node *n);
1059int isfat(Type*);
1060void clearfat(Node *n);
1061void cgen(Node*, Node*);
1062void gused(Node*);
Russ Cox5e792b62009-03-30 21:31:29 -07001063void dumpstrings(void);
1064void dumpsignatures(void);
1065void dumpfuncs(void);
1066void ggloblnod(Node *nam, int32 width);
1067void ggloblsym(Sym *s, int32 width, int dupok);
1068void zfile(Biobuf *b, char *p, int n);
1069void zhist(Biobuf *b, int line, vlong offset);
1070void zname(Biobuf *b, Sym *s, int t);
1071void dumpstrings(void);
1072void nopout(Prog*);
1073void datastring(char *s, int len);
1074int dstringptr(Sym *s, int off, char *str);
1075int dsymptr(Sym *s, int off, Sym *x);
1076int duint16(Sym *s, int off, uint32 v);
1077int duint32(Sym *s, int off, uint32 v);
1078int duintptr(Sym *s, int off, uint32 v);
1079int duintxx(Sym *s, int off, uint64 v, int wid);
1080void genembedtramp(Type*, Sig*);