2008-06-04 15:37:38 -06:00
|
|
|
// Copyright 2009 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
/*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <u.h>
|
|
|
|
#include <libc.h>
|
|
|
|
#include <bio.h>
|
2008-06-13 19:16:23 -06:00
|
|
|
#include "compat.h"
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
#ifndef EXTERN
|
2009-03-30 17:13:11 -06:00
|
|
|
#define EXTERN extern
|
2008-06-04 15:37:38 -06:00
|
|
|
#endif
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
NHUNK = 50000,
|
|
|
|
BUFSIZ = 8192,
|
|
|
|
NSYMB = 500,
|
|
|
|
NHASH = 1024,
|
|
|
|
STRINGSZ = 200,
|
|
|
|
YYMAXDEPTH = 500,
|
|
|
|
MAXALIGN = 7,
|
|
|
|
UINF = 100,
|
2008-06-13 19:16:23 -06:00
|
|
|
HISTSZ = 10,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
PRIME1 = 3,
|
|
|
|
PRIME2 = 10007,
|
|
|
|
PRIME3 = 10009,
|
|
|
|
PRIME4 = 10037,
|
|
|
|
PRIME5 = 10039,
|
|
|
|
PRIME6 = 10061,
|
|
|
|
PRIME7 = 10067,
|
|
|
|
PRIME8 = 10079,
|
|
|
|
PRIME9 = 10091,
|
2009-01-21 15:51:57 -07:00
|
|
|
PRIME10 = 10093,
|
2008-09-28 21:22:31 -06:00
|
|
|
|
|
|
|
AUNK = 100,
|
2009-01-26 10:56:42 -07:00
|
|
|
|
2008-09-28 21:22:31 -06:00
|
|
|
// these values are known by runtime
|
2009-01-26 10:56:42 -07:00
|
|
|
AMEM = 0,
|
|
|
|
ANOEQ,
|
2008-09-28 21:22:31 -06:00
|
|
|
ASTRING,
|
|
|
|
AINTER,
|
2009-05-20 15:57:55 -06:00
|
|
|
ANILINTER,
|
2008-11-14 17:35:08 -07:00
|
|
|
|
2008-11-11 14:46:55 -07:00
|
|
|
BADWIDTH = -1000000000
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* note this is the representation
|
|
|
|
* of the compilers string literals,
|
2009-04-09 19:16:21 -06:00
|
|
|
* it is not the runtime representation
|
2008-06-04 15:37:38 -06:00
|
|
|
*/
|
2009-04-09 19:16:21 -06:00
|
|
|
typedef struct Strlit Strlit;
|
|
|
|
struct Strlit
|
2008-06-04 15:37:38 -06:00
|
|
|
{
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 len;
|
2008-06-04 15:37:38 -06:00
|
|
|
char s[3]; // variable
|
|
|
|
};
|
|
|
|
|
2008-12-05 19:24:05 -07:00
|
|
|
/*
|
|
|
|
* note this is the runtime representation
|
|
|
|
* of hashmap iterator. it is probably
|
|
|
|
* insafe to use it this way, but it puts
|
|
|
|
* all the changes in one place.
|
|
|
|
* only flag is referenced from go.
|
|
|
|
* actual placement does not matter as long
|
|
|
|
* as the size is >= actual size.
|
|
|
|
*/
|
|
|
|
typedef struct Hiter Hiter;
|
|
|
|
struct Hiter
|
|
|
|
{
|
|
|
|
uchar data[8]; // return val from next
|
|
|
|
int32 elemsize; // size of elements in table */
|
|
|
|
int32 changes; // number of changes observed last time */
|
|
|
|
int32 i; // stack pointer in subtable_state */
|
|
|
|
uchar last[8]; // last hash value returned */
|
|
|
|
uchar h[8]; // the hash table */
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
uchar sub[8]; // pointer into subtable */
|
|
|
|
uchar start[8]; // pointer into start of subtable */
|
|
|
|
uchar end[8]; // pointer into end of subtable */
|
|
|
|
uchar pad[8];
|
|
|
|
} sub[4];
|
|
|
|
};
|
|
|
|
|
2008-08-08 18:13:31 -06:00
|
|
|
enum
|
|
|
|
{
|
2008-12-01 18:22:05 -07:00
|
|
|
Mpscale = 29, // safely smaller than bits in a long
|
|
|
|
Mpprec = 16, // Mpscale*Mpprec is max number of bits
|
|
|
|
Mpnorm = Mpprec - 1, // significant words in a normalized float
|
|
|
|
Mpbase = 1L << Mpscale,
|
2008-08-08 18:13:31 -06:00
|
|
|
Mpsign = Mpbase >> 1,
|
2008-12-01 18:22:05 -07:00
|
|
|
Mpmask = Mpbase - 1,
|
|
|
|
Mpdebug = 0,
|
2008-08-08 18:13:31 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Mpint Mpint;
|
|
|
|
struct Mpint
|
|
|
|
{
|
|
|
|
long a[Mpprec];
|
|
|
|
uchar neg;
|
|
|
|
uchar ovf;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Mpflt Mpflt;
|
|
|
|
struct Mpflt
|
|
|
|
{
|
2008-12-01 18:22:05 -07:00
|
|
|
Mpint val;
|
|
|
|
short exp;
|
2008-08-08 18:13:31 -06:00
|
|
|
};
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
typedef struct Val Val;
|
|
|
|
struct Val
|
|
|
|
{
|
2008-08-08 18:13:31 -06:00
|
|
|
short ctype;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
short reg; // OREGISTER
|
|
|
|
short bval; // bool value CTBOOL
|
|
|
|
Mpint* xval; // int CTINT
|
|
|
|
Mpflt* fval; // float CTFLT
|
2009-04-09 19:16:21 -06:00
|
|
|
Strlit* sval; // string CTSTR
|
2008-08-08 18:13:31 -06:00
|
|
|
} u;
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Sym Sym;
|
|
|
|
typedef struct Node Node;
|
2009-07-17 02:00:44 -06:00
|
|
|
typedef struct NodeList NodeList;
|
2008-06-04 15:37:38 -06:00
|
|
|
typedef struct Type Type;
|
2009-03-30 23:26:00 -06:00
|
|
|
typedef struct Dcl Dcl;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
struct Type
|
|
|
|
{
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar etype;
|
|
|
|
uchar chan;
|
2008-06-04 15:37:38 -06:00
|
|
|
uchar recur; // to detect loops
|
|
|
|
uchar trecur; // to detect loops
|
2008-10-03 17:15:55 -06:00
|
|
|
uchar printed;
|
2008-10-21 21:55:40 -06:00
|
|
|
uchar embedded; // TFIELD embedded type
|
2008-11-05 12:27:50 -07:00
|
|
|
uchar siggen;
|
2008-11-11 14:46:55 -07:00
|
|
|
uchar funarg;
|
2008-12-09 14:00:50 -07:00
|
|
|
uchar copyany;
|
2008-12-11 12:54:33 -07:00
|
|
|
uchar local; // created in this file
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2009-06-06 13:46:38 -06:00
|
|
|
Node* nod; // canonical OTYPE node
|
|
|
|
|
2008-06-21 16:11:29 -06:00
|
|
|
// TFUNCT
|
|
|
|
uchar thistuple;
|
|
|
|
uchar outtuple;
|
|
|
|
uchar intuple;
|
2008-07-05 13:49:25 -06:00
|
|
|
uchar outnamed;
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2008-09-14 17:57:55 -06:00
|
|
|
Type* method;
|
2009-07-07 17:05:55 -06:00
|
|
|
Type* xmethod;
|
2008-09-14 17:57:55 -06:00
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* sym;
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 vargen; // unique name for OTYPE/ONAME
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-09-14 17:57:55 -06:00
|
|
|
Node* nname;
|
|
|
|
vlong argwid;
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
// most nodes
|
|
|
|
Type* type;
|
|
|
|
vlong width; // offset in TFIELD, width in all others
|
|
|
|
|
|
|
|
// TFIELD
|
|
|
|
Type* down; // also used in TMAP
|
2009-04-09 19:16:21 -06:00
|
|
|
Strlit* note; // literal string annotation
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// TARRAY
|
2008-08-28 16:17:37 -06:00
|
|
|
int32 bound; // negative is dynamic array
|
2009-07-06 23:31:20 -06:00
|
|
|
|
2009-06-25 22:02:39 -06:00
|
|
|
int32 maplineno; // first use of TFORW as map key
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
#define T ((Type*)0)
|
|
|
|
|
|
|
|
struct Node
|
|
|
|
{
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar op;
|
|
|
|
uchar ullman; // sethi/ullman number
|
|
|
|
uchar addable; // type of addressability - 0 is not addressable
|
|
|
|
uchar trecur; // to detect loops
|
|
|
|
uchar etype; // op for OASOP, etype for OTYPE, exclam for export
|
2009-01-29 18:38:58 -07:00
|
|
|
uchar class; // PPARAM, PAUTO, PEXTERN, etc
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar method; // OCALLMETH name
|
2008-07-03 17:41:32 -06:00
|
|
|
uchar iota; // OLITERAL made from iota
|
2008-10-21 21:55:40 -06:00
|
|
|
uchar embedded; // ODCLFIELD embedded type
|
2008-12-15 14:44:27 -07:00
|
|
|
uchar colas; // OAS resulting from :=
|
2009-01-26 18:20:29 -07:00
|
|
|
uchar diag; // already printed error about this
|
2009-01-29 18:38:58 -07:00
|
|
|
uchar noescape; // ONAME never move to heap
|
2009-02-06 14:47:10 -07:00
|
|
|
uchar funcdepth;
|
2009-06-06 13:46:38 -06:00
|
|
|
uchar builtin; // built-in name, like len or close
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// most nodes
|
|
|
|
Node* left;
|
|
|
|
Node* right;
|
|
|
|
Type* type;
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* list;
|
|
|
|
NodeList* rlist;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// for-body
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* ninit;
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* ntest;
|
|
|
|
Node* nincr;
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* nbody;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// if-body
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* nelse;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// cases
|
|
|
|
Node* ncase;
|
|
|
|
|
|
|
|
// func
|
|
|
|
Node* nname;
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* enter;
|
|
|
|
NodeList* exit;
|
|
|
|
NodeList* cvars; // closure params
|
2009-03-30 23:26:00 -06:00
|
|
|
Dcl* dcl; // outer autodcl
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-08-08 18:13:31 -06:00
|
|
|
// OLITERAL/OREGISTER
|
2008-06-04 15:37:38 -06:00
|
|
|
Val val;
|
|
|
|
|
2009-07-14 00:38:39 -06:00
|
|
|
// OTFUNC
|
|
|
|
Node* rcvr;
|
|
|
|
|
2009-07-17 14:38:16 -06:00
|
|
|
// ONAME
|
|
|
|
Node* ntype;
|
|
|
|
Node* defn;
|
|
|
|
|
2009-01-29 18:38:58 -07:00
|
|
|
// ONAME func param with PHEAP
|
|
|
|
Node* heapaddr; // temp holding heap address of param
|
|
|
|
Node* stackparam; // OPARAM node referring to stack copy of param
|
|
|
|
Node* alloc; // allocation call
|
|
|
|
|
2009-02-06 14:47:10 -07:00
|
|
|
// ONAME closure param with PPARAMREF
|
|
|
|
Node* outer; // outer PPARAMREF in nested closure
|
|
|
|
Node* closure; // ONAME/PHEAP <-> ONAME/PPARAMREF
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* psym; // import
|
|
|
|
Sym* sym; // various
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 vargen; // unique name for OTYPE/ONAME
|
|
|
|
int32 lineno;
|
2008-06-04 15:37:38 -06:00
|
|
|
vlong xoffset;
|
2009-05-26 15:46:06 -06:00
|
|
|
int32 ostk;
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
#define N ((Node*)0)
|
|
|
|
|
2009-07-17 02:00:44 -06:00
|
|
|
struct NodeList
|
|
|
|
{
|
|
|
|
Node* n;
|
|
|
|
NodeList* next;
|
|
|
|
NodeList* end;
|
|
|
|
};
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
struct Sym
|
|
|
|
{
|
2008-12-09 19:31:31 -07:00
|
|
|
ushort block; // blocknumber to catch redeclaration
|
2008-06-21 16:11:29 -06:00
|
|
|
|
|
|
|
uchar undef; // a diagnostic has been generated
|
|
|
|
uchar export; // marked as export
|
2008-09-10 20:49:35 -06:00
|
|
|
uchar exported; // exported
|
2008-11-14 18:31:29 -07:00
|
|
|
uchar imported; // imported
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar sym; // huffman encoding in object file
|
2008-10-24 21:14:28 -06:00
|
|
|
uchar uniq; // imbedded field name first found
|
2008-11-05 12:27:50 -07:00
|
|
|
uchar siggen; // signature generated
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
char* package; // package name
|
|
|
|
char* name; // variable name
|
2009-06-06 13:46:38 -06:00
|
|
|
Node* def; // definition: ONAME OTYPE OPACK or OLITERAL
|
2008-06-04 15:37:38 -06:00
|
|
|
vlong offset; // stack location if automatic
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 lexical;
|
|
|
|
int32 vargen; // unique variable number
|
2008-12-09 19:31:31 -07:00
|
|
|
int32 lastlineno; // last declaration for diagnostic
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* link;
|
|
|
|
};
|
|
|
|
#define S ((Sym*)0)
|
|
|
|
|
|
|
|
struct Dcl
|
|
|
|
{
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar op;
|
2008-10-04 16:17:49 -06:00
|
|
|
ushort block;
|
|
|
|
int32 lineno;
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* dsym; // for printing only
|
|
|
|
Node* dnode; // oname
|
|
|
|
Type* dtype; // otype
|
|
|
|
|
|
|
|
Dcl* forw;
|
|
|
|
Dcl* back; // sentinel has pointer to last
|
|
|
|
};
|
|
|
|
#define D ((Dcl*)0)
|
|
|
|
|
|
|
|
typedef struct Iter Iter;
|
|
|
|
struct Iter
|
|
|
|
{
|
|
|
|
int done;
|
|
|
|
Type* tfunc;
|
|
|
|
Type* t;
|
|
|
|
Node** an;
|
|
|
|
Node* n;
|
|
|
|
};
|
|
|
|
|
2008-06-13 19:16:23 -06:00
|
|
|
typedef struct Hist Hist;
|
|
|
|
struct Hist
|
|
|
|
{
|
|
|
|
Hist* link;
|
|
|
|
char* name;
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 line;
|
|
|
|
int32 offset;
|
2008-06-13 19:16:23 -06:00
|
|
|
};
|
|
|
|
#define H ((Hist*)0)
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
OXXX,
|
|
|
|
|
2009-06-06 13:46:38 -06:00
|
|
|
ONAME, ONONAME, OTYPE, OPACK, OLITERAL,
|
|
|
|
ODCL,
|
2008-06-04 15:37:38 -06:00
|
|
|
ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
|
|
|
|
ODCLFUNC, ODCLFIELD, ODCLARG,
|
2009-07-17 02:00:44 -06:00
|
|
|
OCMP, OPTR, OARRAY, ORANGE,
|
2009-01-27 13:03:53 -07:00
|
|
|
ORETURN, OFOR, OIF, OSWITCH, ODEFER,
|
2009-07-17 02:00:44 -06:00
|
|
|
OAS, OAS2, OASOP, OCASE, OXCASE, OFALL, OXFALL,
|
2009-01-06 15:52:26 -07:00
|
|
|
OGOTO, OPROC, OMAKE, ONEW, OEMPTY, OSELECT,
|
2008-10-02 15:38:07 -06:00
|
|
|
OLEN, OCAP, OPANIC, OPANICN, OPRINT, OPRINTN, OTYPEOF,
|
2009-07-17 02:00:44 -06:00
|
|
|
OCLOSE, OCLOSED, OBLOCK,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
OOROR,
|
|
|
|
OANDAND,
|
|
|
|
OEQ, ONE, OLT, OLE, OGE, OGT,
|
|
|
|
OADD, OSUB, OOR, OXOR,
|
2009-03-11 20:59:35 -06:00
|
|
|
OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
|
2009-05-28 00:55:14 -06:00
|
|
|
OINC, ODEC,
|
2008-06-04 15:37:38 -06:00
|
|
|
OFUNC,
|
|
|
|
OLABEL,
|
|
|
|
OBREAK,
|
|
|
|
OCONTINUE,
|
|
|
|
OADDR,
|
|
|
|
OIND,
|
|
|
|
OCALL, OCALLMETH, OCALLINTER,
|
2009-01-09 16:21:41 -07:00
|
|
|
OINDEX, OSLICE,
|
2008-06-04 15:37:38 -06:00
|
|
|
ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
|
2009-06-06 13:46:38 -06:00
|
|
|
OREGISTER, OINDREG,
|
2009-02-13 15:48:16 -07:00
|
|
|
OKEY, OPARAM,
|
2009-05-18 23:11:22 -06:00
|
|
|
OCOMPOS, OCOMPSLICE, OCOMPMAP,
|
2009-06-23 16:30:59 -06:00
|
|
|
OCONV, OCONVNOP,
|
2009-03-06 18:50:43 -07:00
|
|
|
ODOTTYPE, OTYPESW,
|
2008-06-04 15:37:38 -06:00
|
|
|
OBAD,
|
2009-01-08 15:30:00 -07:00
|
|
|
|
2009-07-14 00:38:39 -06:00
|
|
|
OTCHAN, OTMAP, OTSTRUCT, OTINTER, OTFUNC, OTARRAY,
|
|
|
|
|
2009-01-05 18:32:23 -07:00
|
|
|
OEXTEND, // 6g internal
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
OEND,
|
|
|
|
};
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
Txxx, // 0
|
|
|
|
|
|
|
|
TINT8, TUINT8, // 1
|
|
|
|
TINT16, TUINT16,
|
|
|
|
TINT32, TUINT32,
|
|
|
|
TINT64, TUINT64,
|
2008-10-29 13:46:44 -06:00
|
|
|
TINT, TUINT, TUINTPTR,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-10-29 13:46:44 -06:00
|
|
|
TFLOAT32, // 12
|
2008-06-04 15:37:38 -06:00
|
|
|
TFLOAT64,
|
|
|
|
TFLOAT80,
|
2008-10-29 13:46:44 -06:00
|
|
|
TFLOAT,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-10-29 13:46:44 -06:00
|
|
|
TBOOL, // 16
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-10-29 13:46:44 -06:00
|
|
|
TPTR32, TPTR64, // 17
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-10-29 13:46:44 -06:00
|
|
|
TDDD, // 19
|
2008-06-04 15:37:38 -06:00
|
|
|
TFUNC,
|
|
|
|
TARRAY,
|
2008-08-28 16:17:37 -06:00
|
|
|
T_old_DARRAY,
|
2008-12-19 10:03:24 -07:00
|
|
|
TSTRUCT, // 23
|
2008-06-04 15:37:38 -06:00
|
|
|
TCHAN,
|
|
|
|
TMAP,
|
2008-12-19 10:03:24 -07:00
|
|
|
TINTER, // 26
|
2008-06-04 15:37:38 -06:00
|
|
|
TFORW,
|
|
|
|
TFIELD,
|
|
|
|
TANY,
|
|
|
|
TSTRING,
|
2008-10-06 17:44:17 -06:00
|
|
|
TFORWSTRUCT,
|
|
|
|
TFORWINTER,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2009-03-12 20:04:38 -06:00
|
|
|
// pseudo-types for literals
|
|
|
|
TIDEAL,
|
|
|
|
TNIL,
|
|
|
|
|
2008-10-29 13:46:44 -06:00
|
|
|
NTYPE,
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
CTxxx,
|
|
|
|
|
|
|
|
CTINT,
|
|
|
|
CTFLT,
|
|
|
|
CTSTR,
|
|
|
|
CTBOOL,
|
|
|
|
CTNIL,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
/* types of channel */
|
2009-07-07 12:03:04 -06:00
|
|
|
/* must match ../../pkg/nreflect/type.go:/Chandir */
|
2008-06-04 15:37:38 -06:00
|
|
|
Cxxx,
|
2009-05-21 18:32:44 -06:00
|
|
|
Crecv = 1<<0,
|
|
|
|
Csend = 1<<1,
|
|
|
|
Cboth = Crecv | Csend,
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
Pxxx,
|
|
|
|
|
|
|
|
PEXTERN, // declaration context
|
|
|
|
PAUTO,
|
|
|
|
PPARAM,
|
2009-01-29 18:38:58 -07:00
|
|
|
PPARAMOUT,
|
2009-02-06 14:47:10 -07:00
|
|
|
PPARAMREF, // param passed by reference
|
2009-01-30 15:39:42 -07:00
|
|
|
PFUNC,
|
2009-01-29 18:38:58 -07:00
|
|
|
|
|
|
|
PHEAP = 1<<7,
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
|
2008-06-15 21:24:30 -06:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
Exxx,
|
|
|
|
Eyyy,
|
|
|
|
Etop, // evaluated at statement level
|
|
|
|
Elv, // evaluated in lvalue context
|
|
|
|
Erv, // evaluated in rvalue context
|
2009-07-14 00:38:39 -06:00
|
|
|
Etype = 1<<8,
|
2008-06-15 21:24:30 -06:00
|
|
|
};
|
|
|
|
|
2009-03-30 17:13:11 -06:00
|
|
|
#define BITS 5
|
|
|
|
#define NVAR (BITS*sizeof(uint32)*8)
|
|
|
|
|
|
|
|
typedef struct Bits Bits;
|
|
|
|
struct Bits
|
|
|
|
{
|
|
|
|
uint32 b[BITS];
|
|
|
|
};
|
|
|
|
|
|
|
|
EXTERN Bits zbits;
|
|
|
|
|
|
|
|
typedef struct Var Var;
|
|
|
|
struct Var
|
|
|
|
{
|
|
|
|
vlong offset;
|
|
|
|
Sym* sym;
|
2009-05-23 16:34:29 -06:00
|
|
|
int width;
|
2009-03-30 17:13:11 -06:00
|
|
|
char name;
|
|
|
|
char etype;
|
|
|
|
};
|
|
|
|
|
|
|
|
EXTERN Var var[NVAR];
|
|
|
|
|
2009-03-30 18:09:28 -06:00
|
|
|
typedef struct Typedef Typedef;
|
|
|
|
struct Typedef
|
|
|
|
{
|
|
|
|
char* name;
|
|
|
|
int etype;
|
|
|
|
int sameas;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern Typedef typedefs[];
|
2009-03-30 17:13:11 -06:00
|
|
|
|
2009-03-30 18:52:21 -06:00
|
|
|
typedef struct Sig Sig;
|
|
|
|
struct Sig
|
|
|
|
{
|
|
|
|
char* name;
|
2009-07-07 12:03:04 -06:00
|
|
|
char* package;
|
|
|
|
Sym* isym;
|
|
|
|
Sym* tsym;
|
|
|
|
Type* type;
|
2009-03-30 18:52:21 -06:00
|
|
|
uint32 hash;
|
|
|
|
int32 perm;
|
|
|
|
int32 offset;
|
|
|
|
Sig* link;
|
|
|
|
};
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
typedef struct Io Io;
|
|
|
|
struct Io
|
|
|
|
{
|
|
|
|
char* infile;
|
|
|
|
Biobuf* bin;
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 ilineno;
|
2008-06-04 15:37:38 -06:00
|
|
|
int peekc;
|
2008-10-29 13:46:44 -06:00
|
|
|
int peekc1; // second peekc for ...
|
2008-06-04 15:37:38 -06:00
|
|
|
char* cp; // used for content when bin==nil
|
|
|
|
};
|
|
|
|
|
2008-10-24 21:14:28 -06:00
|
|
|
typedef struct Dlist Dlist;
|
|
|
|
struct Dlist
|
|
|
|
{
|
2008-10-25 14:31:25 -06:00
|
|
|
Type* field;
|
2008-10-24 21:14:28 -06:00
|
|
|
};
|
|
|
|
|
2009-03-10 21:03:31 -06:00
|
|
|
typedef struct Idir Idir;
|
|
|
|
struct Idir
|
|
|
|
{
|
|
|
|
Idir* link;
|
|
|
|
char* dir;
|
|
|
|
};
|
|
|
|
|
2009-03-30 18:09:28 -06:00
|
|
|
/*
|
|
|
|
* note this is the runtime representation
|
|
|
|
* of the compilers arrays.
|
|
|
|
*
|
|
|
|
* typedef struct
|
|
|
|
* { // must not move anything
|
|
|
|
* uchar array[8]; // pointer to data
|
|
|
|
* uchar nel[4]; // number of elements
|
|
|
|
* uchar cap[4]; // allocated number of elements
|
|
|
|
* } Array;
|
|
|
|
*/
|
2009-04-09 19:16:21 -06:00
|
|
|
EXTERN int Array_array; // runtime offsetof(Array,array) - same for String
|
|
|
|
EXTERN int Array_nel; // runtime offsetof(Array,nel) - same for String
|
2009-03-30 18:09:28 -06:00
|
|
|
EXTERN int Array_cap; // runtime offsetof(Array,cap)
|
|
|
|
EXTERN int sizeof_Array; // runtime sizeof(Array)
|
|
|
|
|
2009-04-09 19:16:21 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* note this is the runtime representation
|
|
|
|
* of the compilers strings.
|
|
|
|
*
|
|
|
|
* typedef struct
|
|
|
|
* { // must not move anything
|
|
|
|
* uchar array[8]; // pointer to data
|
|
|
|
* uchar nel[4]; // number of elements
|
|
|
|
* } String;
|
|
|
|
*/
|
|
|
|
EXTERN int sizeof_String; // runtime sizeof(String)
|
|
|
|
|
2008-10-24 21:14:28 -06:00
|
|
|
EXTERN Dlist dotlist[10]; // size is max depth of embeddeds
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN Io curio;
|
|
|
|
EXTERN Io pushedio;
|
2008-08-03 18:25:15 -06:00
|
|
|
EXTERN int32 lineno;
|
2008-11-18 10:32:05 -07:00
|
|
|
EXTERN int32 prevlineno;
|
2008-06-13 19:16:23 -06:00
|
|
|
EXTERN char* pathname;
|
|
|
|
EXTERN Hist* hist;
|
|
|
|
EXTERN Hist* ehist;
|
|
|
|
|
2008-06-05 20:38:39 -06:00
|
|
|
EXTERN char* infile;
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN char* outfile;
|
|
|
|
EXTERN char* package;
|
|
|
|
EXTERN Biobuf* bout;
|
|
|
|
EXTERN int nerrors;
|
2009-06-23 16:30:59 -06:00
|
|
|
EXTERN int nsyntaxerrors;
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN char namebuf[NSYMB];
|
2009-04-02 18:59:09 -06:00
|
|
|
EXTERN char lexbuf[NSYMB];
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN char debug[256];
|
|
|
|
EXTERN Sym* hash[NHASH];
|
|
|
|
EXTERN Sym* dclstack;
|
|
|
|
EXTERN Sym* b0stack;
|
|
|
|
EXTERN Sym* pkgmyname; // my name for package
|
2008-06-12 22:48:56 -06:00
|
|
|
EXTERN Sym* pkgimportname; // package name from imported package
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN int tptr; // either TPTR32 or TPTR64
|
|
|
|
extern char* sysimport;
|
2008-12-08 20:46:39 -07:00
|
|
|
extern char* unsafeimport;
|
2008-07-08 18:19:17 -06:00
|
|
|
EXTERN char* filename; // name to uniqify names
|
2009-03-10 21:03:31 -06:00
|
|
|
EXTERN Idir* idirs;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Type* types[NTYPE];
|
2008-10-29 13:46:44 -06:00
|
|
|
EXTERN uchar simtype[NTYPE];
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN uchar isptr[NTYPE];
|
2009-07-06 23:31:20 -06:00
|
|
|
EXTERN uchar isforw[NTYPE];
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN uchar isint[NTYPE];
|
|
|
|
EXTERN uchar isfloat[NTYPE];
|
|
|
|
EXTERN uchar issigned[NTYPE];
|
2008-06-15 21:24:30 -06:00
|
|
|
EXTERN uchar issimple[NTYPE];
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN uchar okforeq[NTYPE];
|
|
|
|
EXTERN uchar okforadd[NTYPE];
|
|
|
|
EXTERN uchar okforand[NTYPE];
|
2009-05-08 16:40:31 -06:00
|
|
|
EXTERN Type* idealstring;
|
2008-08-08 18:13:31 -06:00
|
|
|
|
|
|
|
EXTERN Mpint* minintval[NTYPE];
|
|
|
|
EXTERN Mpint* maxintval[NTYPE];
|
|
|
|
EXTERN Mpflt* minfltval[NTYPE];
|
|
|
|
EXTERN Mpflt* maxfltval[NTYPE];
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Dcl* autodcl;
|
2008-07-16 18:22:54 -06:00
|
|
|
EXTERN Dcl* paramdcl;
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN Dcl* externdcl;
|
|
|
|
EXTERN Dcl* exportlist;
|
2008-09-10 20:49:35 -06:00
|
|
|
EXTERN Dcl* signatlist;
|
2008-10-21 15:34:45 -06:00
|
|
|
EXTERN Dcl* typelist;
|
2009-05-18 23:11:22 -06:00
|
|
|
EXTERN int dclcontext; // PEXTERN/PAUTO
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN int importflag;
|
2008-06-11 22:06:26 -06:00
|
|
|
EXTERN int inimportsys;
|
2009-05-16 14:29:08 -06:00
|
|
|
EXTERN int initflag; // compiling the init fn
|
2009-05-18 23:11:22 -06:00
|
|
|
EXTERN int statuniqgen; // name generator for static temps
|
2009-06-06 13:46:38 -06:00
|
|
|
EXTERN int loophack;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-08-03 18:25:15 -06:00
|
|
|
EXTERN uint32 iota;
|
2009-07-17 02:00:44 -06:00
|
|
|
EXTERN NodeList* lastconst;
|
2009-07-17 14:38:16 -06:00
|
|
|
EXTERN Node* lasttype;
|
2008-08-03 18:25:15 -06:00
|
|
|
EXTERN int32 vargen;
|
|
|
|
EXTERN int32 exportgen;
|
|
|
|
EXTERN int32 maxarg;
|
2008-10-13 21:14:09 -06:00
|
|
|
EXTERN int32 stksize; // stack size for current frame
|
|
|
|
EXTERN int32 initstksize; // stack size for init function
|
2008-06-21 16:11:29 -06:00
|
|
|
EXTERN ushort blockgen; // max block number
|
|
|
|
EXTERN ushort block; // current block number
|
2009-01-27 13:03:53 -07:00
|
|
|
EXTERN int hasdefer; // flag that curfn has defer statetment
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2009-03-30 18:09:28 -06:00
|
|
|
EXTERN int maxround;
|
|
|
|
EXTERN int widthptr;
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN Node* retnil;
|
|
|
|
|
2009-03-06 18:50:43 -07:00
|
|
|
EXTERN Node* typeswvar;
|
2008-11-06 14:31:13 -07:00
|
|
|
|
2009-06-06 13:46:38 -06:00
|
|
|
EXTERN char* structpkg;
|
2009-03-30 22:31:29 -06:00
|
|
|
extern int thechar;
|
|
|
|
extern char* thestring;
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN char* hunk;
|
2008-08-03 18:25:15 -06:00
|
|
|
EXTERN int32 nhunk;
|
|
|
|
EXTERN int32 thunk;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2008-10-03 17:15:55 -06:00
|
|
|
EXTERN int exporting;
|
2009-07-06 23:31:20 -06:00
|
|
|
EXTERN int noargnames;
|
2008-10-03 17:15:55 -06:00
|
|
|
|
2009-02-06 14:47:10 -07:00
|
|
|
EXTERN int funcdepth;
|
|
|
|
|
|
|
|
EXTERN Node* funclit;
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
/*
|
|
|
|
* y.tab.c
|
|
|
|
*/
|
|
|
|
int yyparse(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* lex.c
|
|
|
|
*/
|
2008-07-08 18:19:17 -06:00
|
|
|
void setfilename(char*);
|
2009-03-10 21:03:31 -06:00
|
|
|
void addidir(char*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void importfile(Val*);
|
2008-12-08 20:46:39 -07:00
|
|
|
void cannedimports(char*, char*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void unimportfile();
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 yylex(void);
|
2009-06-06 20:27:48 -06:00
|
|
|
void yyoptsemi(int);
|
2009-06-06 13:46:38 -06:00
|
|
|
void typeinit(void);
|
2008-06-04 15:37:38 -06:00
|
|
|
void lexinit(void);
|
|
|
|
char* lexname(int);
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 getr(void);
|
2008-06-04 15:37:38 -06:00
|
|
|
int getnsc(void);
|
2008-06-08 20:02:27 -06:00
|
|
|
int escchar(int, int*, vlong*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int getc(void);
|
|
|
|
void ungetc(int);
|
|
|
|
void mkpackage(char*);
|
|
|
|
|
|
|
|
/*
|
2008-08-09 18:29:26 -06:00
|
|
|
* mparith1.c
|
2008-06-04 15:37:38 -06:00
|
|
|
*/
|
2008-08-12 15:04:03 -06:00
|
|
|
int mpcmpfixflt(Mpint *a, Mpflt *b);
|
|
|
|
int mpcmpfltfix(Mpflt *a, Mpint *b);
|
2008-08-08 18:13:31 -06:00
|
|
|
int mpcmpfixfix(Mpint *a, Mpint *b);
|
|
|
|
int mpcmpfixc(Mpint *b, vlong c);
|
2008-08-09 18:29:26 -06:00
|
|
|
int mpcmpfltflt(Mpflt *a, Mpflt *b);
|
|
|
|
int mpcmpfltc(Mpflt *b, double c);
|
2008-08-08 18:13:31 -06:00
|
|
|
void mpsubfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpsubfltflt(Mpflt *a, Mpflt *b);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpaddcfix(Mpint *a, vlong c);
|
|
|
|
void mpaddcflt(Mpflt *a, double c);
|
|
|
|
void mpmulcfix(Mpint *a, vlong c);
|
|
|
|
void mpmulcflt(Mpflt *a, double c);
|
2008-08-08 18:13:31 -06:00
|
|
|
void mpdivfixfix(Mpint *a, Mpint *b);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpmodfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpatofix(Mpint *a, char *s);
|
|
|
|
void mpatoflt(Mpflt *a, char *s);
|
2009-03-12 20:04:38 -06:00
|
|
|
int mpmovefltfix(Mpint *a, Mpflt *b);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpmovefixflt(Mpflt *a, Mpint *b);
|
2008-08-11 14:22:04 -06:00
|
|
|
int Bconv(Fmt*);
|
2008-08-08 18:13:31 -06:00
|
|
|
|
2008-08-09 18:29:26 -06:00
|
|
|
/*
|
|
|
|
* mparith2.c
|
|
|
|
*/
|
|
|
|
void mpmovefixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpmovecfix(Mpint *a, vlong v);
|
|
|
|
int mptestfix(Mpint *a);
|
|
|
|
void mpaddfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpmulfixfix(Mpint *a, Mpint *b);
|
2008-12-01 18:22:05 -07:00
|
|
|
void mpmulfract(Mpint *a, Mpint *b);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpdivmodfixfix(Mpint *q, Mpint *r, Mpint *n, Mpint *d);
|
2008-12-01 18:22:05 -07:00
|
|
|
void mpdivfract(Mpint *a, Mpint *b);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpnegfix(Mpint *a);
|
2008-08-08 18:13:31 -06:00
|
|
|
void mpandfixfix(Mpint *a, Mpint *b);
|
2009-03-12 20:04:38 -06:00
|
|
|
void mpandnotfixfix(Mpint *a, Mpint *b);
|
2008-08-08 18:13:31 -06:00
|
|
|
void mplshfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mporfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mprshfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpxorfixfix(Mpint *a, Mpint *b);
|
|
|
|
void mpcomfix(Mpint *a);
|
|
|
|
vlong mpgetfix(Mpint *a);
|
2008-12-01 18:22:05 -07:00
|
|
|
void mpshiftfix(Mpint *a, int s);
|
2008-08-08 18:13:31 -06:00
|
|
|
|
2008-08-09 18:29:26 -06:00
|
|
|
/*
|
|
|
|
* mparith3.c
|
|
|
|
*/
|
2008-12-03 14:17:26 -07:00
|
|
|
int sigfig(Mpflt *a);
|
|
|
|
void mpnorm(Mpflt *a);
|
2008-08-09 18:29:26 -06:00
|
|
|
void mpmovefltflt(Mpflt *a, Mpflt *b);
|
|
|
|
void mpmovecflt(Mpflt *a, double f);
|
|
|
|
int mptestflt(Mpflt *a);
|
|
|
|
void mpaddfltflt(Mpflt *a, Mpflt *b);
|
|
|
|
void mpmulfltflt(Mpflt *a, Mpflt *b);
|
|
|
|
void mpdivfltflt(Mpflt *a, Mpflt *b);
|
|
|
|
void mpnegflt(Mpflt *a);
|
|
|
|
double mpgetflt(Mpflt *a);
|
2008-12-01 18:22:05 -07:00
|
|
|
int Fconv(Fmt*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* subr.c
|
|
|
|
*/
|
2008-08-03 18:25:15 -06:00
|
|
|
void* mal(int32);
|
|
|
|
void* remal(void*, int32, int32);
|
2008-06-04 15:37:38 -06:00
|
|
|
void errorexit(void);
|
2008-08-03 18:25:15 -06:00
|
|
|
uint32 stringhash(char*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* lookup(char*);
|
|
|
|
Sym* pkglookup(char*, char*);
|
2009-07-14 00:38:39 -06:00
|
|
|
Sym* restrictlookup(char*, char*);
|
2009-05-08 16:40:31 -06:00
|
|
|
void importdot(Sym*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void yyerror(char*, ...);
|
|
|
|
void warn(char*, ...);
|
|
|
|
void fatal(char*, ...);
|
2009-04-08 23:45:33 -06:00
|
|
|
void linehist(char*, int32, int);
|
2008-08-03 18:25:15 -06:00
|
|
|
int32 setlineno(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* nod(int, Node*, Node*);
|
2009-03-12 20:04:38 -06:00
|
|
|
Node* nodlit(Val);
|
2008-06-04 15:37:38 -06:00
|
|
|
Type* typ(int);
|
|
|
|
Dcl* dcl(void);
|
2008-09-28 21:22:31 -06:00
|
|
|
int algtype(Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void dodump(Node*, int);
|
|
|
|
void dump(char*, Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
void dumplist(char*, NodeList*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Type* aindex(Node*, Type*);
|
|
|
|
int isnil(Node*);
|
|
|
|
int isptrto(Type*, int);
|
2009-01-09 12:13:39 -07:00
|
|
|
int istype(Type*, int);
|
2009-01-09 16:21:41 -07:00
|
|
|
int isfixedarray(Type*);
|
|
|
|
int isslice(Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int isinter(Type*);
|
2008-10-15 18:08:10 -06:00
|
|
|
int isnilinter(Type*);
|
2008-11-01 17:36:46 -06:00
|
|
|
int isddd(Type*);
|
2009-03-04 18:38:37 -07:00
|
|
|
Type* maptype(Type*, Type*);
|
2008-10-22 19:18:08 -06:00
|
|
|
Type* methtype(Type*);
|
2009-07-07 12:03:04 -06:00
|
|
|
Node* typename(Type*);
|
2009-05-08 15:40:38 -06:00
|
|
|
int eqtype(Type*, Type*);
|
2009-05-08 16:40:31 -06:00
|
|
|
int cvttype(Type*, Type*);
|
2009-02-05 16:22:49 -07:00
|
|
|
int eqtypenoname(Type*, Type*);
|
2008-06-15 21:24:30 -06:00
|
|
|
void argtype(Node*, Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int eqargs(Type*, Type*);
|
2009-03-17 14:58:38 -06:00
|
|
|
uint32 typehash(Type*, int, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
void frame(int);
|
|
|
|
Node* dobad(void);
|
2009-03-12 20:04:38 -06:00
|
|
|
Node* nodintconst(int64);
|
2009-03-30 18:52:21 -06:00
|
|
|
void nodconst(Node*, Type*, int64);
|
2009-03-12 20:04:38 -06:00
|
|
|
Node* nodnil(void);
|
|
|
|
Node* nodbool(int);
|
2008-06-04 15:37:38 -06:00
|
|
|
void ullmancalc(Node*);
|
|
|
|
void badtype(int, Type*, Type*);
|
|
|
|
Type* ptrto(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* cleanidlist(NodeList*);
|
2008-06-15 21:24:30 -06:00
|
|
|
Node* syslook(char*, int);
|
2008-07-03 17:41:32 -06:00
|
|
|
Node* treecopy(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* listtreecopy(NodeList*);
|
2008-10-03 17:23:02 -06:00
|
|
|
int isselect(Node*);
|
|
|
|
void tempname(Node*, Type*);
|
2009-05-18 23:11:22 -06:00
|
|
|
Node* staticname(Type*);
|
2008-10-16 16:59:31 -06:00
|
|
|
int iscomposite(Type*);
|
2009-01-29 18:38:58 -07:00
|
|
|
Node* callnew(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* saferef(Node*, NodeList**);
|
2009-06-03 00:21:58 -06:00
|
|
|
int is64(Type*);
|
|
|
|
int noconv(Type*, Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* list1(Node*);
|
|
|
|
NodeList* list(NodeList*, Node*);
|
|
|
|
NodeList* concat(NodeList*, NodeList*);
|
|
|
|
int count(NodeList*);
|
|
|
|
Node* liststmt(NodeList*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
Type** getthis(Type*);
|
|
|
|
Type** getoutarg(Type*);
|
|
|
|
Type** getinarg(Type*);
|
|
|
|
|
|
|
|
Type* getthisx(Type*);
|
|
|
|
Type* getoutargx(Type*);
|
|
|
|
Type* getinargx(Type*);
|
|
|
|
|
|
|
|
Type* structfirst(Iter*, Type**);
|
|
|
|
Type* structnext(Iter*);
|
|
|
|
Type* funcfirst(Iter*, Type*);
|
|
|
|
Type* funcnext(Iter*);
|
|
|
|
|
2009-03-30 18:52:21 -06:00
|
|
|
int brcom(int);
|
|
|
|
int brrev(int);
|
|
|
|
void setmaxarg(Type*);
|
|
|
|
int dotoffset(Node*, int*, Node**);
|
|
|
|
void tempname(Node*, Type*);
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
int Econv(Fmt*);
|
|
|
|
int Jconv(Fmt*);
|
2008-06-13 19:16:23 -06:00
|
|
|
int Lconv(Fmt*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int Oconv(Fmt*);
|
|
|
|
int Sconv(Fmt*);
|
|
|
|
int Tconv(Fmt*);
|
|
|
|
int Nconv(Fmt*);
|
2008-10-16 16:59:31 -06:00
|
|
|
int Wconv(Fmt*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int Zconv(Fmt*);
|
|
|
|
|
2009-01-08 15:30:00 -07:00
|
|
|
int lookdot0(Sym*, Type*, Type**);
|
2009-01-08 19:06:06 -07:00
|
|
|
Type* lookdot1(Sym*, Type*, Type*);
|
2009-01-08 15:30:00 -07:00
|
|
|
int adddot1(Sym*, Type*, int, Type**);
|
2008-10-24 21:14:28 -06:00
|
|
|
Node* adddot(Node*);
|
|
|
|
void expandmeth(Sym*, Type*);
|
2009-05-06 18:05:35 -06:00
|
|
|
void genwrapper(Type*, Type*, Sym*);
|
2008-10-24 21:14:28 -06:00
|
|
|
|
2009-05-28 00:55:14 -06:00
|
|
|
int simsimtype(Type*);
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
/*
|
|
|
|
* dcl.c
|
|
|
|
*/
|
2009-07-17 02:00:44 -06:00
|
|
|
void dodclvar(Node*, Type*, NodeList**);
|
2008-10-06 17:44:17 -06:00
|
|
|
Type* dodcltype(Type*);
|
|
|
|
void updatetype(Type*, Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void dodclconst(Node*, Node*);
|
2009-07-17 14:38:16 -06:00
|
|
|
void defaultlit(Node**, Type*);
|
|
|
|
void defaultlit2(Node**, Node**);
|
2009-05-07 11:30:22 -06:00
|
|
|
int structcount(Type*);
|
2008-09-14 17:57:55 -06:00
|
|
|
void addmethod(Node*, Type*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* methodname(Node*, Type*);
|
2008-11-03 16:36:08 -07:00
|
|
|
Sym* methodsym(Sym*, Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Type* functype(Node*, NodeList*, NodeList*);
|
2008-06-04 15:37:38 -06:00
|
|
|
char* thistypenam(Node*);
|
|
|
|
void funcnam(Type*, char*);
|
2008-07-19 19:39:12 -06:00
|
|
|
Node* renameinit(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void funchdr(Node*);
|
|
|
|
void funcargs(Type*);
|
|
|
|
void funcbody(Node*);
|
2009-06-06 13:46:38 -06:00
|
|
|
Node* typenod(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Type* dostruct(NodeList*, int);
|
|
|
|
Type** stotype(NodeList*, int, Type**);
|
2008-06-04 15:37:38 -06:00
|
|
|
Type* sortinter(Type*);
|
2008-07-05 13:49:25 -06:00
|
|
|
void markdcl(void);
|
|
|
|
void popdcl(void);
|
2008-06-04 15:37:38 -06:00
|
|
|
void poptodcl(void);
|
2008-07-16 18:22:54 -06:00
|
|
|
void dumpdcl(char*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void markdclstack(void);
|
|
|
|
void testdclstack(void);
|
|
|
|
Sym* pushdcl(Sym*);
|
|
|
|
void addvar(Node*, Type*, int);
|
2008-10-06 17:44:17 -06:00
|
|
|
void addtyp(Type*, int);
|
|
|
|
void addconst(Node*, Node*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* fakethis(void);
|
2009-05-07 14:42:47 -06:00
|
|
|
int isifacemethod(Type*);
|
2009-07-17 14:38:16 -06:00
|
|
|
Node* dclname(Sym*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* newname(Sym*);
|
|
|
|
Node* oldname(Sym*);
|
|
|
|
Type* newtype(Sym*);
|
|
|
|
Type* oldtype(Sym*);
|
2009-07-17 02:00:44 -06:00
|
|
|
void fninit(NodeList*);
|
fix up arg list parsing to handle any names:
type t1 int;
type t2 int;
type t3 int;
func f1(t1, t2, t3);
func f2(t1, t2, t3 bool);
func f3(t1, t2, x t3);
func f4(*t2, x t3); // error: cannot mix
func f5(t1, *t3);
func (x *t1) f6(y *[]t2) (t1, *t3);
func f7() (int, *string);
func f8(t1, *t2, x t3); // error: cannot mix
func f9() (x int, *string);
func f10(*t2, t3);
R=ken
OCL=16202
CL=16210
2008-09-30 13:53:11 -06:00
|
|
|
Node* nametodcl(Node*, Type*);
|
|
|
|
Node* anondcl(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* checkarglist(NodeList*);
|
2008-10-06 17:44:17 -06:00
|
|
|
void checkwidth(Type*);
|
|
|
|
void defercheckwidth(void);
|
|
|
|
void resumecheckwidth(void);
|
2008-10-21 21:55:40 -06:00
|
|
|
Node* embedded(Sym*);
|
2009-07-17 15:42:14 -06:00
|
|
|
NodeList* variter(NodeList*, Node*, NodeList*);
|
2009-07-17 14:38:16 -06:00
|
|
|
NodeList* constiter(NodeList*, Node*, NodeList*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2009-07-17 14:38:16 -06:00
|
|
|
Node* funclit0(Node*);
|
|
|
|
Node* funclit1(Node*, NodeList*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* unsafenmagic(Node*, NodeList*);
|
2009-02-06 14:47:10 -07:00
|
|
|
|
2009-05-21 14:46:07 -06:00
|
|
|
/*
|
|
|
|
* sinit.c
|
|
|
|
*/
|
|
|
|
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* initfix(NodeList*);
|
2009-05-21 14:46:07 -06:00
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
/*
|
|
|
|
* export.c
|
|
|
|
*/
|
2009-05-08 16:40:31 -06:00
|
|
|
void renameimports(void);
|
2009-01-15 17:16:52 -07:00
|
|
|
void autoexport(Sym*);
|
2009-01-16 16:25:52 -07:00
|
|
|
int exportname(char*);
|
2008-08-03 19:47:02 -06:00
|
|
|
void exportsym(Sym*);
|
2008-11-14 17:35:08 -07:00
|
|
|
void packagesym(Sym*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void dumpe(Sym*);
|
|
|
|
void dumpexport(void);
|
|
|
|
void dumpexporttype(Sym*);
|
|
|
|
void dumpexportvar(Sym*);
|
|
|
|
void dumpexportconst(Sym*);
|
|
|
|
void doimportv1(Node*, Node*);
|
|
|
|
void doimportc1(Node*, Val*);
|
|
|
|
void doimportc2(Node*, Node*, Val*);
|
|
|
|
void doimport1(Node*, Node*, Node*);
|
|
|
|
void doimport2(Node*, Val*, Node*);
|
|
|
|
void doimport3(Node*, Node*);
|
|
|
|
void doimport4(Node*, Node*);
|
|
|
|
void doimport5(Node*, Val*);
|
|
|
|
void doimport6(Node*, Node*);
|
|
|
|
void doimport7(Node*, Node*);
|
2008-07-12 14:08:53 -06:00
|
|
|
void doimport8(Node*, Val*, Node*);
|
2008-09-14 17:57:55 -06:00
|
|
|
void doimport9(Sym*, Node*);
|
2009-06-06 13:46:38 -06:00
|
|
|
void importconst(Sym *s, Type *t, Node *v);
|
2008-10-03 17:15:55 -06:00
|
|
|
void importmethod(Sym *s, Type *t);
|
2009-06-06 13:46:38 -06:00
|
|
|
void importtype(Sym *s, Type *t);
|
|
|
|
void importvar(Sym *s, Type *t, int ctxt);
|
2008-10-03 17:15:55 -06:00
|
|
|
void checkimports(void);
|
2009-06-06 13:46:38 -06:00
|
|
|
Type* pkgtype(Sym*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* walk.c
|
|
|
|
*/
|
2009-07-17 02:00:44 -06:00
|
|
|
void gettype(Node*, NodeList**);
|
2008-06-04 15:37:38 -06:00
|
|
|
void walk(Node*);
|
2009-07-10 17:29:26 -06:00
|
|
|
void walkstmt(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
void walkstmtlist(NodeList*);
|
|
|
|
void walkexpr(Node*, int, NodeList**);
|
|
|
|
void walkexprlist(NodeList*, int, NodeList**);
|
|
|
|
void walkconv(Node*, NodeList**);
|
|
|
|
void walkdottype(Node*, NodeList**);
|
2008-09-04 13:21:10 -06:00
|
|
|
void walkas(Node*);
|
2009-07-17 14:38:16 -06:00
|
|
|
void walkbool(Node**);
|
2009-03-05 16:49:34 -07:00
|
|
|
void walkswitch(Node*);
|
2008-07-24 16:57:30 -06:00
|
|
|
void walkselect(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
void walkdot(Node*, NodeList**);
|
|
|
|
Node* ascompatee1(int, Node*, Node*, NodeList**);
|
|
|
|
NodeList* ascompatee(int, NodeList*, NodeList*, NodeList**);
|
|
|
|
NodeList* ascompatet(int, NodeList*, Type**, int, NodeList**);
|
|
|
|
NodeList* ascompatte(int, Type**, NodeList*, int, NodeList**);
|
2008-06-04 15:37:38 -06:00
|
|
|
int ascompat(Type*, Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* prcompat(NodeList*, int, int);
|
2008-08-03 18:25:15 -06:00
|
|
|
Node* nodpanic(int32);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* newcompat(Node*);
|
2009-01-06 15:52:26 -07:00
|
|
|
Node* makecompat(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* stringop(Node*, int, NodeList**);
|
2008-07-24 16:57:30 -06:00
|
|
|
Type* fixmap(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* mapop(Node*, int, NodeList**);
|
2008-07-24 16:57:30 -06:00
|
|
|
Type* fixchan(Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* chanop(Node*, int, NodeList**);
|
2008-08-27 18:28:30 -06:00
|
|
|
Node* arrayop(Node*, int);
|
2009-05-20 16:09:50 -06:00
|
|
|
Node* ifacecvt(Type*, Node*, int);
|
|
|
|
Node* ifaceop(Node*);
|
2009-02-11 18:57:29 -07:00
|
|
|
int ifaceas(Type*, Type*, int);
|
|
|
|
int ifaceas1(Type*, Type*, int);
|
|
|
|
void ifacecheck(Type*, Type*, int, int);
|
2009-01-08 19:06:06 -07:00
|
|
|
void runifacechecks(void);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* convas(Node*, NodeList**);
|
2008-06-08 13:48:37 -06:00
|
|
|
void arrayconv(Type*, Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
Node* colas(NodeList*, NodeList*);
|
2008-12-06 14:40:30 -07:00
|
|
|
Node* dorange(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* reorder1(NodeList*);
|
|
|
|
NodeList* reorder3(NodeList*);
|
|
|
|
NodeList* reorder4(NodeList*);
|
|
|
|
Node* structlit(Node*, Node*, NodeList**);
|
|
|
|
Node* arraylit(Node*, Node*, NodeList**);
|
|
|
|
Node* maplit(Node*, Node*, NodeList**);
|
|
|
|
Node* selectas(Node*, Node*, NodeList**);
|
|
|
|
Node* old2new(Node*, Type*, NodeList**);
|
2009-01-29 18:38:58 -07:00
|
|
|
void addrescapes(Node*);
|
|
|
|
void heapmoves(void);
|
2009-07-17 14:38:16 -06:00
|
|
|
void walkdeflist(NodeList*);
|
|
|
|
void walkdef(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* const.c
|
|
|
|
*/
|
2009-07-17 14:38:16 -06:00
|
|
|
void convlit1(Node**, Type*, int);
|
|
|
|
void convlit(Node**, Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void evconst(Node*);
|
|
|
|
int cmpslit(Node *l, Node *r);
|
2008-12-14 19:45:00 -07:00
|
|
|
int smallintconst(Node*);
|
2009-05-21 14:46:07 -06:00
|
|
|
long nonnegconst(Node*);
|
2009-03-12 20:04:38 -06:00
|
|
|
int consttype(Node*);
|
|
|
|
int isconst(Node*, int);
|
2009-05-28 00:55:14 -06:00
|
|
|
Mpflt* truncfltlit(Mpflt*, Type*);
|
|
|
|
void convconst(Node*, Type*, Val*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
2009-03-30 17:13:11 -06:00
|
|
|
/*
|
2009-03-30 18:09:28 -06:00
|
|
|
* align.c
|
|
|
|
*/
|
|
|
|
uint32 rnd(uint32, uint32);
|
|
|
|
void dowidth(Type*);
|
2009-03-30 20:15:07 -06:00
|
|
|
int argsize(Type*);
|
2009-03-30 18:09:28 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* bits.c
|
2009-03-30 17:13:11 -06:00
|
|
|
*/
|
|
|
|
Bits bor(Bits, Bits);
|
|
|
|
Bits band(Bits, Bits);
|
|
|
|
Bits bnot(Bits);
|
|
|
|
int bany(Bits*);
|
|
|
|
int bnum(Bits);
|
|
|
|
Bits blsh(uint);
|
|
|
|
int beq(Bits, Bits);
|
|
|
|
int bset(Bits, uint);
|
|
|
|
int Qconv(Fmt *fp);
|
|
|
|
int bitno(int32);
|
2009-03-30 18:09:28 -06:00
|
|
|
|
2009-03-30 20:15:07 -06:00
|
|
|
/*
|
|
|
|
* gen.c
|
|
|
|
*/
|
|
|
|
typedef struct Prog Prog;
|
|
|
|
#define P ((Prog*)0)
|
|
|
|
|
|
|
|
typedef struct Label Label;
|
|
|
|
struct Label
|
|
|
|
{
|
|
|
|
uchar op; // OGOTO/OLABEL
|
|
|
|
Sym* sym;
|
|
|
|
Prog* label; // pointer to code
|
|
|
|
Prog* breakpc; // pointer to code
|
|
|
|
Prog* continpc; // pointer to code
|
|
|
|
Label* link;
|
|
|
|
};
|
|
|
|
#define L ((Label*)0)
|
|
|
|
|
|
|
|
EXTERN Label* labellist;
|
|
|
|
EXTERN Label* findlab(Sym*);
|
|
|
|
|
2009-03-30 22:31:29 -06:00
|
|
|
typedef struct Plist Plist;
|
|
|
|
struct Plist
|
|
|
|
{
|
|
|
|
Node* name;
|
|
|
|
Dcl* locals;
|
|
|
|
Prog* firstpc;
|
|
|
|
int recur;
|
|
|
|
Plist* link;
|
|
|
|
};
|
|
|
|
|
|
|
|
EXTERN Plist* plist;
|
|
|
|
EXTERN Plist* plast;
|
|
|
|
|
2009-03-30 20:15:07 -06:00
|
|
|
EXTERN Prog* continpc;
|
|
|
|
EXTERN Prog* breakpc;
|
|
|
|
EXTERN Prog* pc;
|
|
|
|
EXTERN Prog* firstpc;
|
|
|
|
|
2009-06-06 20:27:48 -06:00
|
|
|
EXTERN int yylast;
|
|
|
|
EXTERN int yynext;
|
|
|
|
EXTERN int yysemi;
|
|
|
|
|
2009-03-30 20:15:07 -06:00
|
|
|
void allocparams(void);
|
|
|
|
void cgen_as(Node *nl, Node *nr);
|
|
|
|
void cgen_callmeth(Node *n, int proc);
|
|
|
|
void cgen_dcl(Node *n);
|
|
|
|
void cgen_proc(Node *n, int proc);
|
|
|
|
void checklabels(void);
|
|
|
|
Label* findlab(Sym *s);
|
|
|
|
void gen(Node *n);
|
2009-07-17 02:00:44 -06:00
|
|
|
void genlist(NodeList *l);
|
2009-03-30 20:15:07 -06:00
|
|
|
void newlab(int op, Sym *s);
|
|
|
|
Node* sysfunc(char *name);
|
2009-03-30 22:31:29 -06:00
|
|
|
Plist* newplist(void);
|
2009-03-30 20:15:07 -06:00
|
|
|
|
2009-03-30 22:31:29 -06:00
|
|
|
/*
|
|
|
|
* obj.c
|
|
|
|
*/
|
|
|
|
void Bputdot(Biobuf *b);
|
|
|
|
void dumpglobls(void);
|
|
|
|
void dumpobj(void);
|
|
|
|
void ieeedtod(uint64 *ieee, double native);
|
|
|
|
void outhist(Biobuf *b);
|
2009-03-30 20:15:07 -06:00
|
|
|
|
|
|
|
/*
|
2009-03-30 22:31:29 -06:00
|
|
|
* arch-specific gen.c/gsubr.c/obj.c
|
2009-03-30 20:15:07 -06:00
|
|
|
*/
|
|
|
|
void betypeinit(void);
|
|
|
|
vlong convvtox(vlong, int);
|
|
|
|
void compile(Node*);
|
|
|
|
void proglist(void);
|
|
|
|
int optopop(int);
|
|
|
|
void dumpobj(void);
|
|
|
|
void dowidth(Type*);
|
|
|
|
void argspace(int32);
|
|
|
|
Node* nodarg(Type*, int);
|
|
|
|
Type* deep(Type*);
|
|
|
|
Type* shallow(Type*);
|
|
|
|
Prog* gjmp(Prog*);
|
|
|
|
void patch(Prog*, Prog*);
|
|
|
|
void bgen(Node *n, int true, Prog *to);
|
|
|
|
void cgen_asop(Node *n);
|
|
|
|
void cgen_call(Node *n, int proc);
|
|
|
|
void cgen_callinter(Node *n, Node *res, int proc);
|
|
|
|
void cgen_ret(Node *n);
|
|
|
|
int isfat(Type*);
|
|
|
|
void clearfat(Node *n);
|
|
|
|
void cgen(Node*, Node*);
|
|
|
|
void gused(Node*);
|
2009-07-07 12:03:04 -06:00
|
|
|
void dumptypestructs(void);
|
2009-03-30 22:31:29 -06:00
|
|
|
void dumpfuncs(void);
|
2009-05-06 14:47:40 -06:00
|
|
|
void dumpdata(void);
|
2009-03-30 22:31:29 -06:00
|
|
|
void ggloblnod(Node *nam, int32 width);
|
|
|
|
void ggloblsym(Sym *s, int32 width, int dupok);
|
|
|
|
void zfile(Biobuf *b, char *p, int n);
|
|
|
|
void zhist(Biobuf *b, int line, vlong offset);
|
|
|
|
void zname(Biobuf *b, Sym *s, int t);
|
|
|
|
void nopout(Prog*);
|
|
|
|
int dstringptr(Sym *s, int off, char *str);
|
2009-07-06 23:31:20 -06:00
|
|
|
int dgostringptr(Sym*, int off, char *str);
|
|
|
|
int dgostrlitptr(Sym*, int off, Strlit*);
|
|
|
|
int dsymptr(Sym *s, int off, Sym *x, int xoff);
|
|
|
|
int duint8(Sym *s, int off, uint8 v);
|
|
|
|
int duint16(Sym *s, int off, uint16 v);
|
2009-03-30 22:31:29 -06:00
|
|
|
int duint32(Sym *s, int off, uint32 v);
|
2009-07-06 23:31:20 -06:00
|
|
|
int duint64(Sym *s, int off, uint64 v);
|
|
|
|
int duintptr(Sym *s, int off, uint64 v);
|
2009-03-30 22:31:29 -06:00
|
|
|
int duintxx(Sym *s, int off, uint64 v, int wid);
|
2009-07-06 23:31:20 -06:00
|
|
|
void genembedtramp(Type*, Type*, Sym*);
|
2009-05-20 16:09:50 -06:00
|
|
|
int gen_as_init(Node*, Node*);
|
|
|
|
|