blob: c76adf6925b9e7ac713c7dd9dd265912d05ec671 [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,
Russ Cox79214572008-11-11 13:46:55 -080044
45 BADWIDTH = -1000000000
Rob Pike0cafb9e2008-06-04 14:37:38 -070046};
47
48/*
49 * note this is the representation
50 * of the compilers string literals,
51 * it happens to also be the runtime
52 * representation, ignoring sizes and
53 * alignment, but that may change.
54 */
55typedef struct String String;
56struct String
57{
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
64 * of the compilers arrays. it is probably
65 * insafe to use it this way, but it puts
66 * all the changes in one place.
67 */
68typedef struct Array Array;
69struct Array
70{ // must not move anything
71 uchar array[8]; // pointer to data
72 uint32 nel; // number of elements
73 uint32 cap; // allocated number of elements
74 uchar b; // actual array - may not be contig
75};
76
Ken Thompson9c2ade32008-08-08 17:13:31 -070077enum
78{
79 Mpscale = 29, /* safely smaller than bits in a long */
80 Mpprec = 10, /* Mpscale*Mpprec is max number of bits */
81 Mpbase = 1L<<Mpscale,
82 Mpsign = Mpbase >> 1,
83 Mpmask = Mpbase -1,
84 Debug = 1,
85};
86
87typedef struct Mpint Mpint;
88struct Mpint
89{
90 vlong val;
91 long a[Mpprec];
92 uchar neg;
93 uchar ovf;
94};
95
96typedef struct Mpflt Mpflt;
97struct Mpflt
98{
99 double val;
Ken Thompson9c2ade32008-08-08 17:13:31 -0700100 uchar ovf;
101};
102
Rob Pike0cafb9e2008-06-04 14:37:38 -0700103typedef struct Val Val;
104struct Val
105{
Ken Thompson9c2ade32008-08-08 17:13:31 -0700106 short ctype;
107 union
108 {
109 short reg; // OREGISTER
110 short bval; // bool value CTBOOL
111 Mpint* xval; // int CTINT
112 Mpflt* fval; // float CTFLT
113 String* sval; // string CTSTR
114 } u;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700115};
116
117typedef struct Sym Sym;
118typedef struct Node Node;
119typedef struct Type Type;
120
121struct Type
122{
Ken Thompson54abac62008-06-21 15:11:29 -0700123 uchar etype;
124 uchar chan;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700125 uchar recur; // to detect loops
126 uchar trecur; // to detect loops
Ken Thompson8877d272008-10-03 16:12:21 -0700127 uchar methptr; // 1=direct 2=pointer
Russ Coxb8babed2008-10-03 16:15:55 -0700128 uchar printed;
Ken Thompson14c63912008-10-21 20:55:40 -0700129 uchar embedded; // TFIELD embedded type
Russ Cox19831212008-11-05 11:27:50 -0800130 uchar siggen;
Russ Cox79214572008-11-11 13:46:55 -0800131 uchar funarg;
Ken Thompson54abac62008-06-21 15:11:29 -0700132
133 // TFUNCT
134 uchar thistuple;
135 uchar outtuple;
136 uchar intuple;
Ken Thompson417a9712008-07-05 12:49:25 -0700137 uchar outnamed;
Ken Thompson54abac62008-06-21 15:11:29 -0700138
Ken Thompson21192942008-09-14 16:57:55 -0700139 Type* method;
140
Rob Pike0cafb9e2008-06-04 14:37:38 -0700141 Sym* sym;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700142 int32 vargen; // unique name for OTYPE/ONAME
Rob Pike0cafb9e2008-06-04 14:37:38 -0700143
Ken Thompson21192942008-09-14 16:57:55 -0700144 Node* nname;
145 vlong argwid;
146
Rob Pike0cafb9e2008-06-04 14:37:38 -0700147 // most nodes
148 Type* type;
149 vlong width; // offset in TFIELD, width in all others
150
151 // TFIELD
152 Type* down; // also used in TMAP
Russ Coxf27aaf42008-10-30 15:13:09 -0700153 String* note; // literal string annotation
Rob Pike0cafb9e2008-06-04 14:37:38 -0700154
Rob Pike0cafb9e2008-06-04 14:37:38 -0700155 // TARRAY
Ken Thompsonc6130e92008-08-28 15:17:37 -0700156 int32 bound; // negative is dynamic array
Rob Pike0cafb9e2008-06-04 14:37:38 -0700157};
158#define T ((Type*)0)
159
160struct Node
161{
Ken Thompson54abac62008-06-21 15:11:29 -0700162 uchar op;
163 uchar ullman; // sethi/ullman number
164 uchar addable; // type of addressability - 0 is not addressable
165 uchar trecur; // to detect loops
166 uchar etype; // op for OASOP, etype for OTYPE, exclam for export
167 uchar class; // PPARAM, PAUTO, PEXTERN, PSTATIC
168 uchar method; // OCALLMETH name
Ken Thompsond915b962008-07-03 16:41:32 -0700169 uchar iota; // OLITERAL made from iota
Ken Thompson14c63912008-10-21 20:55:40 -0700170 uchar embedded; // ODCLFIELD embedded type
Rob Pike0cafb9e2008-06-04 14:37:38 -0700171
172 // most nodes
173 Node* left;
174 Node* right;
175 Type* type;
176
177 // for-body
178 Node* ninit;
179 Node* ntest;
180 Node* nincr;
181 Node* nbody;
182
183 // if-body
184 Node* nelse;
185
186 // cases
187 Node* ncase;
188
189 // func
190 Node* nname;
191
Ken Thompson9c2ade32008-08-08 17:13:31 -0700192 // OLITERAL/OREGISTER
Rob Pike0cafb9e2008-06-04 14:37:38 -0700193 Val val;
194
195 Sym* osym; // import
Rob Pike0cafb9e2008-06-04 14:37:38 -0700196 Sym* psym; // import
197 Sym* sym; // various
Russ Cox9aad9fe2008-08-03 17:25:15 -0700198 int32 vargen; // unique name for OTYPE/ONAME
199 int32 lineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700200 vlong xoffset;
201};
202#define N ((Node*)0)
203
204struct Sym
205{
Ken Thompsonf25843e2008-10-04 15:17:49 -0700206 ushort tblock; // blocknumber for type
207 ushort vblock; // blocknumber for variable
Ken Thompson54abac62008-06-21 15:11:29 -0700208
209 uchar undef; // a diagnostic has been generated
210 uchar export; // marked as export
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700211 uchar exported; // exported
Ken Thompson54abac62008-06-21 15:11:29 -0700212 uchar sym; // huffman encoding in object file
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700213 uchar local; // created in this file
Ken Thompsonb379d542008-10-24 20:14:28 -0700214 uchar uniq; // imbedded field name first found
Russ Cox19831212008-11-05 11:27:50 -0800215 uchar siggen; // signature generated
Ken Thompson54abac62008-06-21 15:11:29 -0700216
Rob Pike0cafb9e2008-06-04 14:37:38 -0700217 char* opackage; // original package name
218 char* package; // package name
219 char* name; // variable name
220 Node* oname; // ONAME node if a var
221 Type* otype; // TYPE node if a type
222 Node* oconst; // OLITERAL node if a const
Rob Pike0cafb9e2008-06-04 14:37:38 -0700223 vlong offset; // stack location if automatic
Russ Cox9aad9fe2008-08-03 17:25:15 -0700224 int32 lexical;
225 int32 vargen; // unique variable number
Rob Pike0cafb9e2008-06-04 14:37:38 -0700226 Sym* link;
227};
228#define S ((Sym*)0)
229
Ken Thompson9e2d1852008-07-17 15:03:39 -0700230typedef struct Dcl Dcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700231struct Dcl
232{
Ken Thompson54abac62008-06-21 15:11:29 -0700233 uchar op;
Ken Thompsonf25843e2008-10-04 15:17:49 -0700234 ushort block;
235 int32 lineno;
236
Rob Pike0cafb9e2008-06-04 14:37:38 -0700237 Sym* dsym; // for printing only
238 Node* dnode; // oname
239 Type* dtype; // otype
Rob Pike0cafb9e2008-06-04 14:37:38 -0700240
241 Dcl* forw;
242 Dcl* back; // sentinel has pointer to last
243};
244#define D ((Dcl*)0)
245
246typedef struct Iter Iter;
247struct Iter
248{
249 int done;
250 Type* tfunc;
251 Type* t;
252 Node** an;
253 Node* n;
254};
255
Ken Thompsonefec14b2008-06-13 18:16:23 -0700256typedef struct Hist Hist;
257struct Hist
258{
259 Hist* link;
260 char* name;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700261 int32 line;
262 int32 offset;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700263};
264#define H ((Hist*)0)
265
Rob Pike0cafb9e2008-06-04 14:37:38 -0700266enum
267{
268 OXXX,
269
Ken Thompson989676d2008-08-03 18:47:02 -0700270 OTYPE, OCONST, OVAR, OIMPORT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700271
Ken Thompson54abac62008-06-21 15:11:29 -0700272 ONAME, ONONAME,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700273 ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
274 ODCLFUNC, ODCLFIELD, ODCLARG,
Ken Thompsonb6f59352008-09-29 20:33:51 -0700275 OLIST, OCMP, OPTR, OARRAY,
Ken Thompson8231e942008-09-22 12:16:19 -0700276 ORETURN, OFOR, OIF, OSWITCH,
Ken Thompson9dbaab52008-09-04 12:21:10 -0700277 OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
Ken Thompsonead7a6d2008-08-12 16:36:18 -0700278 OGOTO, OPROC, ONEW, OEMPTY, OSELECT,
Ken Thompsonf21e7312008-10-02 14:38:07 -0700279 OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700280
281 OOROR,
282 OANDAND,
283 OEQ, ONE, OLT, OLE, OGE, OGT,
284 OADD, OSUB, OOR, OXOR,
285 OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700286 OFUNC,
287 OLABEL,
288 OBREAK,
289 OCONTINUE,
290 OADDR,
291 OIND,
292 OCALL, OCALLMETH, OCALLINTER,
293 OINDEX, OINDEXPTR, OSLICE,
294 ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
295 OLITERAL, OREGISTER, OINDREG,
Ken Thompson182f91f2008-09-03 14:40:22 -0700296 OCONV, OKEY,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700297 OBAD,
298
299 OEND,
300};
301enum
302{
303 Txxx, // 0
304
305 TINT8, TUINT8, // 1
306 TINT16, TUINT16,
307 TINT32, TUINT32,
308 TINT64, TUINT64,
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700309 TINT, TUINT, TUINTPTR,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700310
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700311 TFLOAT32, // 12
Rob Pike0cafb9e2008-06-04 14:37:38 -0700312 TFLOAT64,
313 TFLOAT80,
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700314 TFLOAT,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700315
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700316 TBOOL, // 16
Rob Pike0cafb9e2008-06-04 14:37:38 -0700317
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700318 TPTR32, TPTR64, // 17
Rob Pike0cafb9e2008-06-04 14:37:38 -0700319
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700320 TDDD, // 19
Rob Pike0cafb9e2008-06-04 14:37:38 -0700321 TFUNC,
322 TARRAY,
Ken Thompsonc6130e92008-08-28 15:17:37 -0700323 T_old_DARRAY,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700324 TSTRUCT,
325 TCHAN,
326 TMAP,
327 TINTER,
328 TFORW,
329 TFIELD,
330 TANY,
331 TSTRING,
Russ Cox74e2e082008-10-06 16:44:17 -0700332 TFORWSTRUCT,
333 TFORWINTER,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700334
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700335 NTYPE,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700336};
337enum
338{
339 CTxxx,
340
341 CTINT,
342 CTSINT,
343 CTUINT,
344 CTFLT,
345
346 CTSTR,
347 CTBOOL,
348 CTNIL,
349};
350
351enum
352{
353 /* indications for whatis() */
354 Wnil = 0,
355 Wtnil,
356
357 Wtfloat,
358 Wtint,
359 Wtbool,
360 Wtstr,
361
362 Wlitfloat,
363 Wlitint,
364 Wlitbool,
365 Wlitstr,
Ken Thompson53ec6502008-06-17 17:59:06 -0700366 Wlitnil,
Rob Pike0cafb9e2008-06-04 14:37:38 -0700367
368 Wtunkn,
369};
370
371enum
372{
373 /* types of channel */
374 Cxxx,
375 Cboth,
376 Crecv,
377 Csend,
378};
379
380enum
381{
382 Pxxx,
383
384 PEXTERN, // declaration context
385 PAUTO,
386 PPARAM,
387 PSTATIC,
388};
389
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700390enum
391{
392 Exxx,
393 Eyyy,
394 Etop, // evaluated at statement level
395 Elv, // evaluated in lvalue context
396 Erv, // evaluated in rvalue context
397};
398
Rob Pike0cafb9e2008-06-04 14:37:38 -0700399typedef struct Io Io;
400struct Io
401{
402 char* infile;
403 Biobuf* bin;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700404 int32 ilineno;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700405 int peekc;
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700406 int peekc1; // second peekc for ...
Rob Pike0cafb9e2008-06-04 14:37:38 -0700407 char* cp; // used for content when bin==nil
408};
409
Ken Thompsonb379d542008-10-24 20:14:28 -0700410typedef struct Dlist Dlist;
411struct Dlist
412{
Ken Thompsonb642cf82008-10-25 13:31:25 -0700413 Type* field;
Ken Thompsonb379d542008-10-24 20:14:28 -0700414};
415
416EXTERN Dlist dotlist[10]; // size is max depth of embeddeds
417
Rob Pike0cafb9e2008-06-04 14:37:38 -0700418EXTERN Io curio;
419EXTERN Io pushedio;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700420EXTERN int32 lineno;
Ken Thompsonefec14b2008-06-13 18:16:23 -0700421EXTERN char* pathname;
422EXTERN Hist* hist;
423EXTERN Hist* ehist;
424
Rob Pike0cafb9e2008-06-04 14:37:38 -0700425
Ken Thompsonbbb20732008-06-05 19:38:39 -0700426EXTERN char* infile;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700427EXTERN char* outfile;
428EXTERN char* package;
429EXTERN Biobuf* bout;
430EXTERN int nerrors;
431EXTERN char namebuf[NSYMB];
432EXTERN char debug[256];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700433EXTERN Sym* hash[NHASH];
434EXTERN Sym* dclstack;
435EXTERN Sym* b0stack;
436EXTERN Sym* pkgmyname; // my name for package
Ken Thompson343f5aa2008-06-12 21:48:56 -0700437EXTERN Sym* pkgimportname; // package name from imported package
Rob Pike0cafb9e2008-06-04 14:37:38 -0700438EXTERN int tptr; // either TPTR32 or TPTR64
439extern char* sysimport;
Ken Thompson45288542008-07-08 17:19:17 -0700440EXTERN char* filename; // name to uniqify names
Ken Thompson989676d2008-08-03 18:47:02 -0700441EXTERN int exportadj; // declaration is being exported
Rob Pike0cafb9e2008-06-04 14:37:38 -0700442
443EXTERN Type* types[NTYPE];
Ken Thompsonc21d9a12008-10-29 12:46:44 -0700444EXTERN uchar simtype[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700445EXTERN uchar isptr[NTYPE];
446EXTERN uchar isint[NTYPE];
447EXTERN uchar isfloat[NTYPE];
448EXTERN uchar issigned[NTYPE];
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700449EXTERN uchar issimple[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700450EXTERN uchar okforeq[NTYPE];
451EXTERN uchar okforadd[NTYPE];
452EXTERN uchar okforand[NTYPE];
Ken Thompson9c2ade32008-08-08 17:13:31 -0700453
454EXTERN Mpint* minintval[NTYPE];
455EXTERN Mpint* maxintval[NTYPE];
456EXTERN Mpflt* minfltval[NTYPE];
457EXTERN Mpflt* maxfltval[NTYPE];
Rob Pike0cafb9e2008-06-04 14:37:38 -0700458
459EXTERN Dcl* autodcl;
Ken Thompson80038492008-07-16 17:22:54 -0700460EXTERN Dcl* paramdcl;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700461EXTERN Dcl* externdcl;
462EXTERN Dcl* exportlist;
Ken Thompson0a7e4a72008-09-10 19:49:35 -0700463EXTERN Dcl* signatlist;
Russ Coxaacfbb42008-10-21 14:34:45 -0700464EXTERN Dcl* typelist;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700465EXTERN int dclcontext; // PEXTERN/PAUTO
466EXTERN int importflag;
Ken Thompson2254a8e2008-06-11 21:06:26 -0700467EXTERN int inimportsys;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700468
469EXTERN Node* booltrue;
470EXTERN Node* boolfalse;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700471EXTERN uint32 iota;
Ken Thompsond915b962008-07-03 16:41:32 -0700472EXTERN Node* lastconst;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700473EXTERN int32 vargen;
474EXTERN int32 exportgen;
475EXTERN int32 maxarg;
Ken Thompson1ea5bc72008-10-13 20:14:09 -0700476EXTERN int32 stksize; // stack size for current frame
477EXTERN int32 initstksize; // stack size for init function
Ken Thompson54abac62008-06-21 15:11:29 -0700478EXTERN ushort blockgen; // max block number
479EXTERN ushort block; // current block number
Rob Pike0cafb9e2008-06-04 14:37:38 -0700480
481EXTERN Node* retnil;
482EXTERN Node* fskel;
483
Russ Cox9906bfc2008-11-06 13:31:13 -0800484EXTERN Node* addtop;
485
Rob Pike0cafb9e2008-06-04 14:37:38 -0700486EXTERN char* context;
487EXTERN int thechar;
488EXTERN char* thestring;
489EXTERN char* hunk;
Russ Cox9aad9fe2008-08-03 17:25:15 -0700490EXTERN int32 nhunk;
491EXTERN int32 thunk;
Rob Pike0cafb9e2008-06-04 14:37:38 -0700492
Russ Coxb8babed2008-10-03 16:15:55 -0700493EXTERN int exporting;
494
Russ Cox7cd173a2008-10-15 17:09:42 -0700495EXTERN int func;
496
Rob Pike0cafb9e2008-06-04 14:37:38 -0700497/*
498 * y.tab.c
499 */
500int yyparse(void);
501
502/*
503 * lex.c
504 */
Ken Thompsonf1880572008-06-04 15:33:59 -0700505int mainlex(int, char*[]);
Ken Thompson45288542008-07-08 17:19:17 -0700506void setfilename(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700507void importfile(Val*);
508void cannedimports(void);
509void unimportfile();
Russ Cox9aad9fe2008-08-03 17:25:15 -0700510int32 yylex(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700511void lexinit(void);
512char* lexname(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700513int32 getr(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700514int getnsc(void);
Ken Thompsonf9c58c22008-06-08 19:02:27 -0700515int escchar(int, int*, vlong*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700516int getc(void);
517void ungetc(int);
518void mkpackage(char*);
519
520/*
Ken Thompson272ae652008-08-09 17:29:26 -0700521 * mparith1.c
Rob Pike0cafb9e2008-06-04 14:37:38 -0700522 */
Ken Thompson47975232008-08-12 14:04:03 -0700523int mpcmpfixflt(Mpint *a, Mpflt *b);
524int mpcmpfltfix(Mpflt *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700525int mpcmpfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700526int mpcmpfixc(Mpint *b, vlong c);
Ken Thompson272ae652008-08-09 17:29:26 -0700527int mpcmpfltflt(Mpflt *a, Mpflt *b);
528int mpcmpfltc(Mpflt *b, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700529void mpsubfixfix(Mpint *a, Mpint *b);
530void mpsubfltflt(Mpflt *a, Mpflt *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700531void mpaddcfix(Mpint *a, vlong c);
532void mpaddcflt(Mpflt *a, double c);
533void mpmulcfix(Mpint *a, vlong c);
534void mpmulcflt(Mpflt *a, double c);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700535void mpdivfixfix(Mpint *a, Mpint *b);
Ken Thompson272ae652008-08-09 17:29:26 -0700536void mpmodfixfix(Mpint *a, Mpint *b);
537void mpatofix(Mpint *a, char *s);
538void mpatoflt(Mpflt *a, char *s);
539void mpmovefltfix(Mpint *a, Mpflt *b);
540void mpmovefixflt(Mpflt *a, Mpint *b);
Ken Thompson2b755562008-08-11 13:22:04 -0700541int Bconv(Fmt*);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700542
Ken Thompson272ae652008-08-09 17:29:26 -0700543/*
544 * mparith2.c
545 */
546void mpmovefixfix(Mpint *a, Mpint *b);
547void mpmovecfix(Mpint *a, vlong v);
548int mptestfix(Mpint *a);
549void mpaddfixfix(Mpint *a, Mpint *b);
550void mpmulfixfix(Mpint *a, Mpint *b);
551void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
552void mpnegfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700553void mpandfixfix(Mpint *a, Mpint *b);
554void mplshfixfix(Mpint *a, Mpint *b);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700555void mporfixfix(Mpint *a, Mpint *b);
556void mprshfixfix(Mpint *a, Mpint *b);
557void mpxorfixfix(Mpint *a, Mpint *b);
558void mpcomfix(Mpint *a);
Ken Thompson9c2ade32008-08-08 17:13:31 -0700559vlong mpgetfix(Mpint *a);
560
Ken Thompson272ae652008-08-09 17:29:26 -0700561/*
562 * mparith3.c
563 */
564void mpmovefltflt(Mpflt *a, Mpflt *b);
565void mpmovecflt(Mpflt *a, double f);
566int mptestflt(Mpflt *a);
567void mpaddfltflt(Mpflt *a, Mpflt *b);
568void mpmulfltflt(Mpflt *a, Mpflt *b);
569void mpdivfltflt(Mpflt *a, Mpflt *b);
570void mpnegflt(Mpflt *a);
571double mpgetflt(Mpflt *a);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700572
573/*
574 * subr.c
575 */
576void myexit(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700577void* mal(int32);
578void* remal(void*, int32, int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700579void errorexit(void);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700580uint32 stringhash(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700581Sym* lookup(char*);
582Sym* pkglookup(char*, char*);
583void yyerror(char*, ...);
584void warn(char*, ...);
585void fatal(char*, ...);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700586void linehist(char*, int32);
587int32 setlineno(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700588Node* nod(int, Node*, Node*);
Ken Thompsonc242b532008-06-17 22:33:32 -0700589Node* list(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700590Type* typ(int);
591Dcl* dcl(void);
Ken Thompson89ac5612008-09-28 20:22:31 -0700592int algtype(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700593Node* rev(Node*);
594Node* unrev(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700595Node* appendr(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700596void dodump(Node*, int);
597void dump(char*, Node*);
598Type* aindex(Node*, Type*);
599int isnil(Node*);
600int isptrto(Type*, int);
Ken Thompsonc6130e92008-08-28 15:17:37 -0700601int isptrarray(Type*);
602int isptrdarray(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700603int isinter(Type*);
Ken Thompson1bf38482008-10-15 17:08:10 -0700604int isnilinter(Type*);
Ken Thompson74427c62008-11-01 16:36:46 -0700605int isddd(Type*);
Ken Thompsoned139c12008-10-02 20:51:10 -0700606Type* ismethod(Type*);
Ken Thompson7ed8fc62008-10-22 18:18:08 -0700607Type* methtype(Type*);
608int needaddr(Type*);
Russ Cox19831212008-11-05 11:27:50 -0800609Sym* signame(Type*);
Ken Thompson9c5669b2008-09-02 16:21:30 -0700610int bytearraysz(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700611int eqtype(Type*, Type*, int);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700612void argtype(Node*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700613int eqargs(Type*, Type*);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700614uint32 typehash(Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700615void frame(int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700616Node* literal(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700617Node* dobad(void);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700618Node* nodintconst(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700619void ullmancalc(Node*);
620void badtype(int, Type*, Type*);
621Type* ptrto(Type*);
622Node* cleanidlist(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700623Node* syslook(char*, int);
Ken Thompsond915b962008-07-03 16:41:32 -0700624Node* treecopy(Node*);
Russ Cox45f4e382008-10-03 16:23:02 -0700625int isselect(Node*);
626void tempname(Node*, Type*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700627int iscomposite(Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700628
629Type** getthis(Type*);
630Type** getoutarg(Type*);
631Type** getinarg(Type*);
632
633Type* getthisx(Type*);
634Type* getoutargx(Type*);
635Type* getinargx(Type*);
636
637Node* listfirst(Iter*, Node**);
638Node* listnext(Iter*);
639Type* structfirst(Iter*, Type**);
640Type* structnext(Iter*);
641Type* funcfirst(Iter*, Type*);
642Type* funcnext(Iter*);
643
644int Econv(Fmt*);
645int Jconv(Fmt*);
Ken Thompsonefec14b2008-06-13 18:16:23 -0700646int Lconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700647int Oconv(Fmt*);
648int Sconv(Fmt*);
649int Tconv(Fmt*);
650int Nconv(Fmt*);
Russ Cox1163b1d2008-10-16 15:59:31 -0700651int Wconv(Fmt*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700652int Zconv(Fmt*);
653
Ken Thompsonb379d542008-10-24 20:14:28 -0700654int lookdot0(Sym*, Type*);
655int adddot1(Sym*, Type*, int);
656Node* adddot(Node*);
657void expand0(Type*);
658void expand1(Type*, int);
659void expandmeth(Sym*, Type*);
660
Rob Pike0cafb9e2008-06-04 14:37:38 -0700661/*
662 * dcl.c
663 */
664void dodclvar(Node*, Type*);
Russ Cox74e2e082008-10-06 16:44:17 -0700665Type* dodcltype(Type*);
666void updatetype(Type*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700667void dodclconst(Node*, Node*);
668void defaultlit(Node*);
669int listcount(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700670void addmethod(Node*, Type*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700671Node* methodname(Node*, Type*);
Russ Coxc249a8de2008-11-03 15:36:08 -0800672Sym* methodsym(Sym*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700673Type* functype(Node*, Node*, Node*);
674char* thistypenam(Node*);
675void funcnam(Type*, char*);
Ken Thompsonf24f8ff2008-07-19 18:39:12 -0700676Node* renameinit(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700677void funchdr(Node*);
678void funcargs(Type*);
679void funcbody(Node*);
680Type* dostruct(Node*, int);
681Type** stotype(Node*, Type**);
682Type* sortinter(Type*);
Ken Thompson417a9712008-07-05 12:49:25 -0700683void markdcl(void);
684void popdcl(void);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700685void poptodcl(void);
Ken Thompson80038492008-07-16 17:22:54 -0700686void dumpdcl(char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700687void markdclstack(void);
688void testdclstack(void);
689Sym* pushdcl(Sym*);
690void addvar(Node*, Type*, int);
Russ Cox74e2e082008-10-06 16:44:17 -0700691void addtyp(Type*, int);
692void addconst(Node*, Node*, int);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700693Node* fakethis(void);
694Node* newname(Sym*);
695Node* oldname(Sym*);
696Type* newtype(Sym*);
697Type* oldtype(Sym*);
Ken Thompsonfb3af532008-07-19 13:38:29 -0700698void fninit(Node*);
Russ Cox4d571c92008-09-30 12:53:11 -0700699Node* nametoanondcl(Node*);
700Node* nametodcl(Node*, Type*);
701Node* anondcl(Type*);
Russ Coxb8babed2008-10-03 16:15:55 -0700702void checkarglist(Node*);
Russ Cox74e2e082008-10-06 16:44:17 -0700703void checkwidth(Type*);
704void defercheckwidth(void);
705void resumecheckwidth(void);
Ken Thompson14c63912008-10-21 20:55:40 -0700706Node* embedded(Sym*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700707
708/*
709 * export.c
710 */
Ken Thompson343f5aa2008-06-12 21:48:56 -0700711void renamepkg(Node*);
Ken Thompson989676d2008-08-03 18:47:02 -0700712void exportsym(Sym*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700713void dumpe(Sym*);
714void dumpexport(void);
715void dumpexporttype(Sym*);
716void dumpexportvar(Sym*);
717void dumpexportconst(Sym*);
718void doimportv1(Node*, Node*);
719void doimportc1(Node*, Val*);
720void doimportc2(Node*, Node*, Val*);
721void doimport1(Node*, Node*, Node*);
722void doimport2(Node*, Val*, Node*);
723void doimport3(Node*, Node*);
724void doimport4(Node*, Node*);
725void doimport5(Node*, Val*);
726void doimport6(Node*, Node*);
727void doimport7(Node*, Node*);
Ken Thompson3856e452008-07-12 13:08:53 -0700728void doimport8(Node*, Val*, Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700729void doimport9(Sym*, Node*);
Russ Coxb8babed2008-10-03 16:15:55 -0700730void importconst(int, Node *ss, Type *t, Val *v);
731void importmethod(Sym *s, Type *t);
732void importtype(int, Node *ss, Type *t);
733void importvar(int, Node *ss, Type *t);
734void checkimports(void);
735Type* pkgtype(char*, char*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700736
737/*
738 * walk.c
739 */
Ken Thompsond01a1ec2008-09-14 17:29:50 -0700740void addtotop(Node*);
741void gettype(Node*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700742void walk(Node*);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700743void walkstate(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700744void walktype(Node*, int);
Ken Thompson9dbaab52008-09-04 12:21:10 -0700745void walkas(Node*);
Ken Thompson417a9712008-07-05 12:49:25 -0700746void walkbool(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700747Type* walkswitch(Node*, Type*(*)(Node*, Type*));
Rob Pike0cafb9e2008-06-04 14:37:38 -0700748int casebody(Node*);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700749void walkselect(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700750int whatis(Node*);
Ken Thompson21192942008-09-14 16:57:55 -0700751void walkdot(Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700752Node* ascompatee(int, Node**, Node**);
753Node* ascompatet(int, Node**, Type**, int);
754Node* ascompatte(int, Type**, Node**, int);
755int ascompat(Type*, Type*);
Ken Thompsonf21e7312008-10-02 14:38:07 -0700756Node* prcompat(Node*, int);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700757Node* nodpanic(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700758Node* newcompat(Node*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700759Node* stringop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700760Type* fixmap(Type*);
Ken Thompsone1a06cc2008-06-15 20:24:30 -0700761Node* mapop(Node*, int);
Ken Thompsoncb9b1032008-07-24 15:57:30 -0700762Type* fixchan(Type*);
Ken Thompson3856e452008-07-12 13:08:53 -0700763Node* chanop(Node*, int);
Ken Thompson66a603c2008-08-27 17:28:30 -0700764Node* arrayop(Node*, int);
Ken Thompson8231e942008-09-22 12:16:19 -0700765Node* ifaceop(Type*, Node*, int);
766int isandss(Type*, Node*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700767Node* convas(Node*);
Ken Thompson8200a0b2008-06-08 12:48:37 -0700768void arrayconv(Type*, Node*);
Ken Thompson54abac62008-06-21 15:11:29 -0700769Node* colas(Node*, Node*);
Ken Thompson0b3093f2008-06-10 21:29:57 -0700770Node* reorder1(Node*);
771Node* reorder2(Node*);
772Node* reorder3(Node*);
773Node* reorder4(Node*);
Ken Thompson9c5669b2008-09-02 16:21:30 -0700774Node* structlit(Node*);
Ken Thompson4539ced2008-09-03 14:09:29 -0700775Node* arraylit(Node*);
Ken Thompson182f91f2008-09-03 14:40:22 -0700776Node* maplit(Node*);
Ken Thompson30444032008-09-16 20:51:50 -0700777Node* selectas(Node*, Node*);
778Node* old2new(Node*, Type*);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700779
780/*
781 * const.c
782 */
783void convlit(Node*, Type*);
784void evconst(Node*);
785int cmpslit(Node *l, Node *r);
786
787/*
788 * gen.c/gsubr.c/obj.c
789 */
790void belexinit(int);
791void besetptr(void);
792vlong convvtox(vlong, int);
793void compile(Node*);
794void proglist(void);
795int optopop(int);
796void dumpobj(void);
797void dowidth(Type*);
Russ Cox9aad9fe2008-08-03 17:25:15 -0700798void argspace(int32);
Rob Pike0cafb9e2008-06-04 14:37:38 -0700799Node* nodarg(Type*, int);
Ken Thompson4c5a1652008-07-18 11:59:35 -0700800void nodconst(Node*, Type*, vlong);
Russ Coxfb2c6672008-09-22 12:45:01 -0700801Type* deep(Type*);