blob: 25e92bc9c3d218c09c76ec7c35f52d76a01e65b8 [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
14#define EXTERN extern
15#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,
Ken Thompson89ac5612008-09-28 20:22:31 -070037
38 AUNK = 100,
39 // these values are known by runtime
40 ASIMP = 0,
41 ASTRING,
42 APTR,
43 AINTER,
Rob Pike0cafb9e2008-06-04 14:37:38 -070044};
45
46/*
47 * note this is the representation
48 * of the compilers string literals,
49 * it happens to also be the runtime
50 * representation, ignoring sizes and
51 * alignment, but that may change.
52 */
53typedef struct String String;
54struct String
55{
Russ Cox9aad9fe2008-08-03 17:25:15 -070056 int32 len;
Rob Pike0cafb9e2008-06-04 14:37:38 -070057 char s[3]; // variable
58};
59
Ken Thompson66a603c2008-08-27 17:28:30 -070060/*
61 * note this is the runtime representation
62 * of the compilers arrays. it is probably
63 * insafe to use it this way, but it puts
64 * all the changes in one place.
65 */
66typedef struct Array Array;
67struct Array
68{ // must not move anything
69 uchar array[8]; // pointer to data
70 uint32 nel; // number of elements
71 uint32 cap; // allocated number of elements
72 uchar b; // actual array - may not be contig
73};
74
Ken Thompson9c2ade32008-08-08 17:13:31 -070075enum
76{
77 Mpscale = 29, /* safely smaller than bits in a long */
78 Mpprec = 10, /* Mpscale*Mpprec is max number of bits */
79 Mpbase = 1L<<Mpscale,
80 Mpsign = Mpbase >> 1,
81 Mpmask = Mpbase -1,
82 Debug = 1,
83};
84
85typedef struct Mpint Mpint;
86struct Mpint
87{
88 vlong val;
89 long a[Mpprec];
90 uchar neg;
91 uchar ovf;
92};
93
94typedef struct Mpflt Mpflt;
95struct Mpflt
96{
97 double val;
Ken Thompson9c2ade32008-08-08 17:13:31 -070098 uchar ovf;
99};
100
Rob Pike0cafb9e2008-06-04 14:37:38 -0700101typedef struct Val Val;
102struct Val
103{
Ken Thompson9c2ade32008-08-08 17:13:31 -0700104 short ctype;
105 union
106 {
107 short reg; // OREGISTER
108 short bval; // bool value CTBOOL
109 Mpint* xval; // int CTINT
110 Mpflt* fval; // float CTFLT
111 String* sval; // string CTSTR
112 } u;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700113};
114
115typedef struct Sym Sym;
116typedef struct Node Node;
117typedef struct Type Type;
118
119struct Type
120{
Ken Thompson54abac62008-06-21 15:11:29 -0700121 uchar etype;
122 uchar chan;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700123 uchar recur; // to detect loops
124 uchar trecur; // to detect loops
Ken Thompson8877d272008-10-03 16:12:21 -0700125 uchar methptr; // 1=direct 2=pointer
Russ Coxb8babed2008-10-03 16:15:55 -0700126 uchar printed;
Ken Thompson14c63912008-10-21 20:55:40 -0700127 uchar embedded; // TFIELD embedded type
Ken Thompson54abac62008-06-21 15:11:29 -0700128
129 // TFUNCT
130 uchar thistuple;
131 uchar outtuple;
132 uchar intuple;
Ken Thompson417a9712008-07-05 12:49:25 -0700133 uchar outnamed;
Ken Thompson54abac62008-06-21 15:11:29 -0700134
Ken Thompson21192942008-09-14 16:57:55 -0700135 Type* method;
136
Rob Pike0cafb9e2008-06-04 14:37:38 -0700137 Sym* sym;
Russ Coxaacfbb42008-10-21 14:34:45 -0700138 Sym* xsym; // export sym
Russ Cox9aad9fe2008-08-03 17:25:15 -0700139 int32 vargen; // unique name for OTYPE/ONAME
Rob Pike0cafb9e2008-06-04 14:37:38 -0700140
Ken Thompson21192942008-09-14 16:57:55 -0700141 Node* nname;
142 vlong argwid;
143
Rob Pike0cafb9e2008-06-04 14:37:38 -0700144 // most nodes
145 Type* type;
146 vlong width; // offset in TFIELD, width in all others
147
148 // TFIELD
149 Type* down; // also used in TMAP
150
Rob Pike0cafb9e2008-06-04 14:37:38 -0700151 // TARRAY
Ken Thompsonc6130e92008-08-28 15:17:37 -0700152 int32 bound; // negative is dynamic array
Rob Pike0cafb9e2008-06-04 14:37:38 -0700153};
154#define T ((Type*)0)
155
156struct Node
157{
Ken Thompson54abac62008-06-21 15:11:29 -0700158 uchar op;
159 uchar ullman; // sethi/ullman number
160 uchar addable; // type of addressability - 0 is not addressable
161 uchar trecur; // to detect loops
162 uchar etype; // op for OASOP, etype for OTYPE, exclam for export
163 uchar class; // PPARAM, PAUTO, PEXTERN, PSTATIC
164 uchar method; // OCALLMETH name
Ken Thompsond915b962008-07-03 16:41:32 -0700165 uchar iota; // OLITERAL made from iota
Ken Thompson14c63912008-10-21 20:55:40 -0700166 uchar embedded; // ODCLFIELD embedded type
Rob Pike0cafb9e2008-06-04 14:37:38 -0700167
168 // most nodes
169 Node* left;
170 Node* right;
171 Type* type;
172
173 // for-body
174 Node* ninit;
175 Node* ntest;
176 Node* nincr;
177 Node* nbody;
178
179 // if-body
180 Node* nelse;
181
182 // cases
183 Node* ncase;
184
185 // func
186 Node* nname;
187
Ken Thompson9c2ade32008-08-08 17:13:31 -0700188 // OLITERAL/OREGISTER
Rob Pike0cafb9e2008-06-04 14:37:38 -0700189 Val val;
190
191 Sym* osym; // import
192 Sym* fsym; // import
193 Sym* psym; // import
194 Sym* sym; // various
Russ Cox9aad9fe2008-08-03 17:25:15 -0700195 int32 vargen; // unique name for OTYPE/ONAME
196 int32 lineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700197 vlong xoffset;
198};
199#define N ((Node*)0)
200
201struct Sym
202{
Ken Thompsonf25843e2008-10-04 15:17:49 -0700203 ushort tblock; // blocknumber for type
204 ushort vblock; // blocknumber for variable
Ken Thompson54abac62008-06-21 15:11:29 -0700205
206 uchar undef; // a diagnostic has been generated
207 uchar export; // marked as export
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700208 uchar exported; // exported
Ken Thompson54abac62008-06-21 15:11:29 -0700209 uchar sym; // huffman encoding in object file
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700210 uchar local; // created in this file
Ken Thompson54abac62008-06-21 15:11:29 -0700211
Rob Pike0cafb9e2008-06-04 14:37:38 -0700212 char* opackage; // original package name
213 char* package; // package name
214 char* name; // variable name
215 Node* oname; // ONAME node if a var
216 Type* otype; // TYPE node if a type
217 Node* oconst; // OLITERAL node if a const
Rob Pike0cafb9e2008-06-04 14:37:38 -0700218 vlong offset; // stack location if automatic
Russ Cox9aad9fe2008-08-03 17:25:15 -0700219 int32 lexical;
220 int32 vargen; // unique variable number
Rob Pike0cafb9e2008-06-04 14:37:38 -0700221 Sym* link;
222};
223#define S ((Sym*)0)
224
Ken Thompson9e2d1852008-07-17 15:03:39 -0700225typedef struct Dcl Dcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700226struct Dcl
227{
Ken Thompson54abac62008-06-21 15:11:29 -0700228 uchar op;
Ken Thompsonf25843e2008-10-04 15:17:49 -0700229 ushort block;
230 int32 lineno;
231
Rob Pike0cafb9e2008-06-04 14:37:38 -0700232 Sym* dsym; // for printing only
233 Node* dnode; // oname
234 Type* dtype; // otype
Rob Pike0cafb9e2008-06-04 14:37:38 -0700235
236 Dcl* forw;
237 Dcl* back; // sentinel has pointer to last
238};
239#define D ((Dcl*)0)
240
241typedef struct Iter Iter;
242struct Iter
243{
244 int done;
245 Type* tfunc;
246 Type* t;
247 Node** an;
248 Node* n;
249};
250
Ken Thompsonefec14b2008-06-13 18:16:23 -0700251typedef struct Hist Hist;
252struct Hist
253{
254 Hist* link;
255 char* name;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700256 int32 line;
257 int32 offset;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700258};
259#define H ((Hist*)0)
260
Rob Pike0cafb9e2008-06-04 14:37:38 -0700261enum
262{
263 OXXX,
264
Ken Thompson989676d2008-08-03 18:47:02 -0700265 OTYPE, OCONST, OVAR, OIMPORT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700266
Ken Thompson54abac62008-06-21 15:11:29 -0700267 ONAME, ONONAME,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700268 ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
269 ODCLFUNC, ODCLFIELD, ODCLARG,
Ken Thompsonb6f59352008-09-29 20:33:51 -0700270 OLIST, OCMP, OPTR, OARRAY,
Ken Thompson8231e942008-09-22 12:16:19 -0700271 ORETURN, OFOR, OIF, OSWITCH,
Ken Thompson9dbaab52008-09-04 12:21:10 -0700272 OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
Ken Thompsonead7a6d2008-08-12 16:36:18 -0700273 OGOTO, OPROC, ONEW, OEMPTY, OSELECT,
Ken Thompsonf21e7312008-10-02 14:38:07 -0700274 OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700275
276 OOROR,
277 OANDAND,
278 OEQ, ONE, OLT, OLE, OGE, OGT,
279 OADD, OSUB, OOR, OXOR,
280 OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700281 OFUNC,
282 OLABEL,
283 OBREAK,
284 OCONTINUE,
285 OADDR,
286 OIND,
287 OCALL, OCALLMETH, OCALLINTER,
288 OINDEX, OINDEXPTR, OSLICE,
289 ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
290 OLITERAL, OREGISTER, OINDREG,
Ken Thompson182f91f2008-09-03 14:40:22 -0700291 OCONV, OKEY,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700292 OBAD,
293
294 OEND,
295};
296enum
297{
298 Txxx, // 0
299
300 TINT8, TUINT8, // 1
301 TINT16, TUINT16,
302 TINT32, TUINT32,
303 TINT64, TUINT64,
304
305 TFLOAT32, // 9
306 TFLOAT64,
307 TFLOAT80,
308
309 TBOOL, // 12
310
311 TPTR32, TPTR64, // 13
312
313 TFUNC,
314 TARRAY,
Ken Thompsonc6130e92008-08-28 15:17:37 -0700315 T_old_DARRAY,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700316 TSTRUCT,
317 TCHAN,
318 TMAP,
319 TINTER,
320 TFORW,
321 TFIELD,
322 TANY,
323 TSTRING,
Russ Cox74e2e082008-10-06 16:44:17 -0700324 TFORWSTRUCT,
325 TFORWINTER,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700326
Russ Cox74e2e082008-10-06 16:44:17 -0700327 NTYPE, // 28
Rob Pike0cafb9e2008-06-04 14:37:38 -0700328};
329enum
330{
331 CTxxx,
332
333 CTINT,
334 CTSINT,
335 CTUINT,
336 CTFLT,
337
338 CTSTR,
339 CTBOOL,
340 CTNIL,
341};
342
343enum
344{
345 /* indications for whatis() */
346 Wnil = 0,
347 Wtnil,
348
349 Wtfloat,
350 Wtint,
351 Wtbool,
352 Wtstr,
353
354 Wlitfloat,
355 Wlitint,
356 Wlitbool,
357 Wlitstr,
Ken Thompson53ec6502008-06-17 17:59:06 -0700358 Wlitnil,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700359
360 Wtunkn,
361};
362
363enum
364{
365 /* types of channel */
366 Cxxx,
367 Cboth,
368 Crecv,
369 Csend,
370};
371
372enum
373{
374 Pxxx,
375
376 PEXTERN, // declaration context
377 PAUTO,
378 PPARAM,
379 PSTATIC,
380};
381
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700382enum
383{
384 Exxx,
385 Eyyy,
386 Etop, // evaluated at statement level
387 Elv, // evaluated in lvalue context
388 Erv, // evaluated in rvalue context
389};
390
Rob Pike0cafb9e2008-06-04 14:37:38 -0700391typedef struct Io Io;
392struct Io
393{
394 char* infile;
395 Biobuf* bin;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700396 int32 ilineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700397 int peekc;
398 char* cp; // used for content when bin==nil
399};
400
401EXTERN Io curio;
402EXTERN Io pushedio;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700403EXTERN int32 lineno;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700404EXTERN char* pathname;
405EXTERN Hist* hist;
406EXTERN Hist* ehist;
407
Rob Pike0cafb9e2008-06-04 14:37:38 -0700408
Ken Thompsonbbb20732008-06-05 19:38:39 -0700409EXTERN char* infile;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700410EXTERN char* outfile;
411EXTERN char* package;
412EXTERN Biobuf* bout;
413EXTERN int nerrors;
414EXTERN char namebuf[NSYMB];
415EXTERN char debug[256];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700416EXTERN Sym* hash[NHASH];
417EXTERN Sym* dclstack;
418EXTERN Sym* b0stack;
419EXTERN Sym* pkgmyname; // my name for package
Ken Thompson343f5aa2008-06-12 21:48:56 -0700420EXTERN Sym* pkgimportname; // package name from imported package
Rob Pike0cafb9e2008-06-04 14:37:38 -0700421EXTERN int tptr; // either TPTR32 or TPTR64
422extern char* sysimport;
Ken Thompson45288542008-07-08 17:19:17 -0700423EXTERN char* filename; // name to uniqify names
Ken Thompson989676d2008-08-03 18:47:02 -0700424EXTERN int exportadj; // declaration is being exported
Rob Pike0cafb9e2008-06-04 14:37:38 -0700425
426EXTERN Type* types[NTYPE];
427EXTERN uchar isptr[NTYPE];
428EXTERN uchar isint[NTYPE];
429EXTERN uchar isfloat[NTYPE];
430EXTERN uchar issigned[NTYPE];
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700431EXTERN uchar issimple[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700432EXTERN uchar okforeq[NTYPE];
433EXTERN uchar okforadd[NTYPE];
434EXTERN uchar okforand[NTYPE];
Ken Thompson9c2ade32008-08-08 17:13:31 -0700435
436EXTERN Mpint* minintval[NTYPE];
437EXTERN Mpint* maxintval[NTYPE];
438EXTERN Mpflt* minfltval[NTYPE];
439EXTERN Mpflt* maxfltval[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700440
441EXTERN Dcl* autodcl;
Ken Thompson80038492008-07-16 17:22:54 -0700442EXTERN Dcl* paramdcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700443EXTERN Dcl* externdcl;
444EXTERN Dcl* exportlist;
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700445EXTERN Dcl* signatlist;
Russ Coxaacfbb42008-10-21 14:34:45 -0700446EXTERN Dcl* typelist;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700447EXTERN int dclcontext; // PEXTERN/PAUTO
448EXTERN int importflag;
Ken Thompson2254a8e2008-06-11 21:06:26 -0700449EXTERN int inimportsys;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700450
451EXTERN Node* booltrue;
452EXTERN Node* boolfalse;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700453EXTERN uint32 iota;
Ken Thompsond915b962008-07-03 16:41:32 -0700454EXTERN Node* lastconst;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700455EXTERN int32 vargen;
456EXTERN int32 exportgen;
457EXTERN int32 maxarg;
Ken Thompson1ea5bc72008-10-13 20:14:09 -0700458EXTERN int32 stksize; // stack size for current frame
459EXTERN int32 initstksize; // stack size for init function
Ken Thompson54abac62008-06-21 15:11:29 -0700460EXTERN ushort blockgen; // max block number
461EXTERN ushort block; // current block number
Rob Pike0cafb9e2008-06-04 14:37:38 -0700462
463EXTERN Node* retnil;
464EXTERN Node* fskel;
465
466EXTERN char* context;
467EXTERN int thechar;
468EXTERN char* thestring;
469EXTERN char* hunk;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700470EXTERN int32 nhunk;
471EXTERN int32 thunk;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700472
Russ Coxb8babed2008-10-03 16:15:55 -0700473EXTERN int exporting;
474
Russ Cox7cd173a2008-10-15 17:09:42 -0700475EXTERN int func;
476
Rob Pike0cafb9e2008-06-04 14:37:38 -0700477/*
478 * y.tab.c
479 */
480int yyparse(void);
481
482/*
483 * lex.c
484 */
Ken Thompsonf1880572008-06-04 15:33:59 -0700485int mainlex(int, char*[]);
Ken Thompson45288542008-07-08 17:19:17 -0700486void setfilename(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700487void importfile(Val*);
488void cannedimports(void);
489void unimportfile();
Russ Cox9aad9fe2008-08-03 17:25:15 -0700490int32 yylex(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700491void lexinit(void);
492char* lexname(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700493int32 getr(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700494int getnsc(void);
Ken Thompsonf9c58c22008-06-08 19:02:27 -0700495int escchar(int, int*, vlong*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700496int getc(void);
497void ungetc(int);
498void mkpackage(char*);
499
500/*
Ken Thompson272ae652008-08-09 17:29:26 -0700501 * mparith1.c
Rob Pike0cafb9e2008-06-04 14:37:38 -0700502 */
Ken Thompson47975232008-08-12 14:04:03 -0700503int mpcmpfixflt(Mpint *a, Mpflt *b);
504int mpcmpfltfix(Mpflt *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700505int mpcmpfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700506int mpcmpfixc(Mpint *b, vlong c);
Ken Thompson272ae652008-08-09 17:29:26 -0700507int mpcmpfltflt(Mpflt *a, Mpflt *b);
508int mpcmpfltc(Mpflt *b, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700509void mpsubfixfix(Mpint *a, Mpint *b);
510void mpsubfltflt(Mpflt *a, Mpflt *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700511void mpaddcfix(Mpint *a, vlong c);
512void mpaddcflt(Mpflt *a, double c);
513void mpmulcfix(Mpint *a, vlong c);
514void mpmulcflt(Mpflt *a, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700515void mpdivfixfix(Mpint *a, Mpint *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700516void mpmodfixfix(Mpint *a, Mpint *b);
517void mpatofix(Mpint *a, char *s);
518void mpatoflt(Mpflt *a, char *s);
519void mpmovefltfix(Mpint *a, Mpflt *b);
520void mpmovefixflt(Mpflt *a, Mpint *b);
Ken Thompson2b755562008-08-11 13:22:04 -0700521int Bconv(Fmt*);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700522
Ken Thompson272ae652008-08-09 17:29:26 -0700523/*
524 * mparith2.c
525 */
526void mpmovefixfix(Mpint *a, Mpint *b);
527void mpmovecfix(Mpint *a, vlong v);
528int mptestfix(Mpint *a);
529void mpaddfixfix(Mpint *a, Mpint *b);
530void mpmulfixfix(Mpint *a, Mpint *b);
531void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
532void mpnegfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700533void mpandfixfix(Mpint *a, Mpint *b);
534void mplshfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700535void mporfixfix(Mpint *a, Mpint *b);
536void mprshfixfix(Mpint *a, Mpint *b);
537void mpxorfixfix(Mpint *a, Mpint *b);
538void mpcomfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700539vlong mpgetfix(Mpint *a);
540
Ken Thompson272ae652008-08-09 17:29:26 -0700541/*
542 * mparith3.c
543 */
544void mpmovefltflt(Mpflt *a, Mpflt *b);
545void mpmovecflt(Mpflt *a, double f);
546int mptestflt(Mpflt *a);
547void mpaddfltflt(Mpflt *a, Mpflt *b);
548void mpmulfltflt(Mpflt *a, Mpflt *b);
549void mpdivfltflt(Mpflt *a, Mpflt *b);
550void mpnegflt(Mpflt *a);
551double mpgetflt(Mpflt *a);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700552
553/*
554 * subr.c
555 */
556void myexit(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700557void* mal(int32);
558void* remal(void*, int32, int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700559void errorexit(void);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700560uint32 stringhash(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700561Sym* lookup(char*);
562Sym* pkglookup(char*, char*);
563void yyerror(char*, ...);
564void warn(char*, ...);
565void fatal(char*, ...);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700566void linehist(char*, int32);
567int32 setlineno(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700568Node* nod(int, Node*, Node*);
Ken Thompsonc242b532008-06-17 22:33:32 -0700569Node* list(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700570Type* typ(int);
571Dcl* dcl(void);
Ken Thompson89ac5612008-09-28 20:22:31 -0700572int algtype(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700573Node* rev(Node*);
574Node* unrev(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700575Node* appendr(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700576void dodump(Node*, int);
577void dump(char*, Node*);
578Type* aindex(Node*, Type*);
579int isnil(Node*);
580int isptrto(Type*, int);
Ken Thompsonc6130e92008-08-28 15:17:37 -0700581int isptrarray(Type*);
582int isptrdarray(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700583int isinter(Type*);
Ken Thompson1bf38482008-10-15 17:08:10 -0700584int isnilinter(Type*);
585Sym* globalsig(Type*);
Ken Thompsoned139c12008-10-02 20:51:10 -0700586Type* ismethod(Type*);
Ken Thompson7ed8fc62008-10-22 18:18:08 -0700587Type* methtype(Type*);
588int needaddr(Type*);
Ken Thompsonf25843e2008-10-04 15:17:49 -0700589Sym* signame(Type*, int);
Ken Thompson9c5669b2008-09-02 16:21:30 -0700590int bytearraysz(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700591int eqtype(Type*, Type*, int);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700592void argtype(Node*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700593int eqargs(Type*, Type*);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700594uint32 typehash(Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700595void frame(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700596Node* literal(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700597Node* dobad(void);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700598Node* nodintconst(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700599void ullmancalc(Node*);
600void badtype(int, Type*, Type*);
601Type* ptrto(Type*);
602Node* cleanidlist(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700603Node* syslook(char*, int);
Ken Thompsond915b962008-07-03 16:41:32 -0700604Node* treecopy(Node*);
Russ Cox45f4e382008-10-03 16:23:02 -0700605int isselect(Node*);
606void tempname(Node*, Type*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700607int iscomposite(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700608
609Type** getthis(Type*);
610Type** getoutarg(Type*);
611Type** getinarg(Type*);
612
613Type* getthisx(Type*);
614Type* getoutargx(Type*);
615Type* getinargx(Type*);
616
617Node* listfirst(Iter*, Node**);
618Node* listnext(Iter*);
619Type* structfirst(Iter*, Type**);
620Type* structnext(Iter*);
621Type* funcfirst(Iter*, Type*);
622Type* funcnext(Iter*);
623
624int Econv(Fmt*);
625int Jconv(Fmt*);
Ken Thompsonefec14b2008-06-13 18:16:23 -0700626int Lconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700627int Oconv(Fmt*);
628int Sconv(Fmt*);
629int Tconv(Fmt*);
630int Nconv(Fmt*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700631int Wconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700632int Zconv(Fmt*);
633
634/*
635 * dcl.c
636 */
637void dodclvar(Node*, Type*);
Russ Cox74e2e082008-10-06 16:44:17 -0700638Type* dodcltype(Type*);
639void updatetype(Type*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700640void dodclconst(Node*, Node*);
641void defaultlit(Node*);
642int listcount(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700643void addmethod(Node*, Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700644Node* methodname(Node*, Type*);
645Type* functype(Node*, Node*, Node*);
646char* thistypenam(Node*);
647void funcnam(Type*, char*);
Ken Thompsonf24f8ff2008-07-19 18:39:12 -0700648Node* renameinit(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700649void funchdr(Node*);
650void funcargs(Type*);
651void funcbody(Node*);
652Type* dostruct(Node*, int);
653Type** stotype(Node*, Type**);
654Type* sortinter(Type*);
Ken Thompson417a9712008-07-05 12:49:25 -0700655void markdcl(void);
656void popdcl(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700657void poptodcl(void);
Ken Thompson80038492008-07-16 17:22:54 -0700658void dumpdcl(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700659void markdclstack(void);
660void testdclstack(void);
661Sym* pushdcl(Sym*);
662void addvar(Node*, Type*, int);
Russ Cox74e2e082008-10-06 16:44:17 -0700663void addtyp(Type*, int);
664void addconst(Node*, Node*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700665Node* fakethis(void);
666Node* newname(Sym*);
667Node* oldname(Sym*);
668Type* newtype(Sym*);
669Type* oldtype(Sym*);
Ken Thompsonfb3af532008-07-19 13:38:29 -0700670void fninit(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700671Node* nametoanondcl(Node*);
672Node* nametodcl(Node*, Type*);
673Node* anondcl(Type*);
Russ Coxb8babed2008-10-03 16:15:55 -0700674void checkarglist(Node*);
Russ Cox74e2e082008-10-06 16:44:17 -0700675void checkwidth(Type*);
676void defercheckwidth(void);
677void resumecheckwidth(void);
Ken Thompson14c63912008-10-21 20:55:40 -0700678Node* embedded(Sym*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700679
680/*
681 * export.c
682 */
Ken Thompson343f5aa2008-06-12 21:48:56 -0700683void renamepkg(Node*);
Ken Thompson989676d2008-08-03 18:47:02 -0700684void exportsym(Sym*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700685void dumpe(Sym*);
686void dumpexport(void);
687void dumpexporttype(Sym*);
688void dumpexportvar(Sym*);
689void dumpexportconst(Sym*);
690void doimportv1(Node*, Node*);
691void doimportc1(Node*, Val*);
692void doimportc2(Node*, Node*, Val*);
693void doimport1(Node*, Node*, Node*);
694void doimport2(Node*, Val*, Node*);
695void doimport3(Node*, Node*);
696void doimport4(Node*, Node*);
697void doimport5(Node*, Val*);
698void doimport6(Node*, Node*);
699void doimport7(Node*, Node*);
Ken Thompson3856e452008-07-12 13:08:53 -0700700void doimport8(Node*, Val*, Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700701void doimport9(Sym*, Node*);
Russ Coxb8babed2008-10-03 16:15:55 -0700702void importconst(int, Node *ss, Type *t, Val *v);
703void importmethod(Sym *s, Type *t);
704void importtype(int, Node *ss, Type *t);
705void importvar(int, Node *ss, Type *t);
706void checkimports(void);
707Type* pkgtype(char*, char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700708
709/*
710 * walk.c
711 */
Ken Thompsond01a1ec2008-09-14 17:29:50 -0700712void addtotop(Node*);
713void gettype(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700714void walk(Node*);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700715void walkstate(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700716void walktype(Node*, int);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700717void walkas(Node*);
Ken Thompson417a9712008-07-05 12:49:25 -0700718void walkbool(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700719Type* walkswitch(Node*, Type*(*)(Node*, Type*));
Rob Pike0cafb9e2008-06-04 14:37:38 -0700720int casebody(Node*);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700721void walkselect(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700722int whatis(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700723void walkdot(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700724Node* ascompatee(int, Node**, Node**);
725Node* ascompatet(int, Node**, Type**, int);
726Node* ascompatte(int, Type**, Node**, int);
727int ascompat(Type*, Type*);
Ken Thompsonf21e7312008-10-02 14:38:07 -0700728Node* prcompat(Node*, int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700729Node* nodpanic(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700730Node* newcompat(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700731Node* stringop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700732Type* fixmap(Type*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700733Node* mapop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700734Type* fixchan(Type*);
Ken Thompson3856e452008-07-12 13:08:53 -0700735Node* chanop(Node*, int);
Ken Thompson66a603c2008-08-27 17:28:30 -0700736Node* arrayop(Node*, int);
Ken Thompson8231e942008-09-22 12:16:19 -0700737Node* ifaceop(Type*, Node*, int);
738int isandss(Type*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700739Node* convas(Node*);
Ken Thompson8200a0b2008-06-08 12:48:37 -0700740void arrayconv(Type*, Node*);
Ken Thompson54abac62008-06-21 15:11:29 -0700741Node* colas(Node*, Node*);
Ken Thompson0b3093f2008-06-10 21:29:57 -0700742Node* reorder1(Node*);
743Node* reorder2(Node*);
744Node* reorder3(Node*);
745Node* reorder4(Node*);
Ken Thompson9c5669b2008-09-02 16:21:30 -0700746Node* structlit(Node*);
Ken Thompson4539ced2008-09-03 14:09:29 -0700747Node* arraylit(Node*);
Ken Thompson182f91f2008-09-03 14:40:22 -0700748Node* maplit(Node*);
Ken Thompson30444032008-09-16 20:51:50 -0700749Node* selectas(Node*, Node*);
750Node* old2new(Node*, Type*);
Ken Thompson14c63912008-10-21 20:55:40 -0700751Node* adddot(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700752
753/*
754 * const.c
755 */
756void convlit(Node*, Type*);
757void evconst(Node*);
758int cmpslit(Node *l, Node *r);
759
760/*
761 * gen.c/gsubr.c/obj.c
762 */
763void belexinit(int);
764void besetptr(void);
765vlong convvtox(vlong, int);
766void compile(Node*);
767void proglist(void);
768int optopop(int);
769void dumpobj(void);
770void dowidth(Type*);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700771void argspace(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700772Node* nodarg(Type*, int);
Ken Thompson4c5a1652008-07-18 11:59:35 -0700773void nodconst(Node*, Type*, vlong);
Russ Coxfb2c6672008-09-22 12:45:01 -0700774Type* deep(Type*);