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>
|
|
|
|
|
2009-09-09 00:16:19 -06:00
|
|
|
// avoid <ctype.h>
|
|
|
|
#undef isblank
|
|
|
|
#define isblank goisblank
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
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
|
2009-08-07 13:50:26 -06:00
|
|
|
uchar deferwidth;
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2009-06-06 13:46:38 -06:00
|
|
|
Node* nod; // canonical OTYPE node
|
2009-08-19 18:27:08 -06:00
|
|
|
int lineno;
|
2009-06-06 13:46:38 -06:00
|
|
|
|
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
|
2009-08-07 14:14:01 -06:00
|
|
|
int32 embedlineno; // first use of TFORW as embedded type
|
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
|
2009-07-29 13:00:34 -06:00
|
|
|
uchar walkdef;
|
2009-07-29 13:47:51 -06:00
|
|
|
uchar typecheck;
|
2009-08-07 13:50:26 -06:00
|
|
|
uchar local;
|
2009-08-12 14:18:19 -06:00
|
|
|
uchar initorder;
|
2009-09-05 21:32:24 -06:00
|
|
|
uchar dodata; // compile literal assignment as data statement
|
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-08-07 13:50:26 -06:00
|
|
|
Node* shortname;
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* enter;
|
|
|
|
NodeList* exit;
|
|
|
|
NodeList* cvars; // closure params
|
2009-08-07 13:50:26 -06:00
|
|
|
NodeList* dcl; // autodcl for this func/closure
|
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-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-08-07 13:50:26 -06:00
|
|
|
struct NodeList
|
2009-07-17 02:00:44 -06:00
|
|
|
{
|
|
|
|
Node* n;
|
|
|
|
NodeList* next;
|
|
|
|
NodeList* end;
|
|
|
|
};
|
|
|
|
|
2009-08-04 23:59:23 -06:00
|
|
|
enum
|
2008-06-04 15:37:38 -06:00
|
|
|
{
|
2009-08-04 23:59:23 -06:00
|
|
|
SymExport = 1<<0,
|
|
|
|
SymPackage = 1<<1,
|
|
|
|
SymExported = 1<<2,
|
|
|
|
SymImported = 1<<3,
|
|
|
|
SymUniq = 1<<4,
|
|
|
|
SymSiggen = 1<<5,
|
|
|
|
};
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2009-08-04 23:59:23 -06:00
|
|
|
struct Sym
|
|
|
|
{
|
|
|
|
ushort lexical;
|
|
|
|
uchar flags;
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar sym; // huffman encoding in object file
|
2009-08-04 23:59:23 -06:00
|
|
|
Sym* link;
|
2008-06-21 16:11:29 -06:00
|
|
|
|
2009-08-04 23:59:23 -06:00
|
|
|
// saved and restored by dcopy
|
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
|
2009-08-04 23:59:23 -06:00
|
|
|
int32 block; // blocknumber to catch redeclaration
|
2008-12-09 19:31:31 -07:00
|
|
|
int32 lastlineno; // last declaration for diagnostic
|
2008-06-04 15:37:38 -06:00
|
|
|
};
|
|
|
|
#define S ((Sym*)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-07-31 10:29:28 -06:00
|
|
|
// names
|
|
|
|
ONAME,
|
|
|
|
ONONAME,
|
|
|
|
OTYPE,
|
|
|
|
OPACK,
|
|
|
|
OLITERAL,
|
|
|
|
|
|
|
|
// exprs
|
2009-08-03 12:58:52 -06:00
|
|
|
OADD, OSUB, OOR, OXOR, OADDSTR,
|
2009-07-31 10:29:28 -06:00
|
|
|
OADDR,
|
2008-06-04 15:37:38 -06:00
|
|
|
OANDAND,
|
2009-08-03 12:58:52 -06:00
|
|
|
OAPPENDSTR,
|
2009-07-31 10:29:28 -06:00
|
|
|
OARRAY,
|
2009-08-03 12:58:52 -06:00
|
|
|
OARRAYBYTESTR, OARRAYRUNESTR,
|
2009-08-04 11:26:29 -06:00
|
|
|
OAS, OAS2, OAS2MAPW, OAS2FUNC, OAS2RECV, OAS2MAPR, OAS2DOTTYPE, OASOP,
|
2009-07-31 10:29:28 -06:00
|
|
|
OBAD,
|
|
|
|
OCALL, OCALLFUNC, OCALLMETH, OCALLINTER,
|
|
|
|
OCAP,
|
|
|
|
OCLOSE,
|
|
|
|
OCLOSED,
|
2009-08-07 13:50:26 -06:00
|
|
|
OCLOSURE,
|
2009-08-03 12:58:52 -06:00
|
|
|
OCMPIFACE, OCMPSTR,
|
|
|
|
OCOMPLIT, OMAPLIT, OSTRUCTLIT, OARRAYLIT,
|
2009-08-24 14:41:47 -06:00
|
|
|
OCONV, OCONVNOP, OCONVIFACE, OCONVSLICE,
|
2009-08-07 13:50:26 -06:00
|
|
|
ODCL, ODCLFUNC, ODCLFIELD, ODCLCONST, ODCLTYPE,
|
2009-08-05 03:33:30 -06:00
|
|
|
ODOT, ODOTPTR, ODOTMETH, ODOTINTER, OXDOT,
|
2009-07-31 10:29:28 -06:00
|
|
|
ODOTTYPE,
|
2008-06-04 15:37:38 -06:00
|
|
|
OEQ, ONE, OLT, OLE, OGE, OGT,
|
|
|
|
OFUNC,
|
|
|
|
OIND,
|
2009-08-03 12:58:52 -06:00
|
|
|
OINDEX, OINDEXSTR, OINDEXMAP,
|
2009-02-13 15:48:16 -07:00
|
|
|
OKEY, OPARAM,
|
2009-07-31 10:29:28 -06:00
|
|
|
OLEN,
|
2009-08-03 12:58:52 -06:00
|
|
|
OMAKE, OMAKECHAN, OMAKEMAP, OMAKESLICE,
|
2009-08-09 16:16:06 -06:00
|
|
|
OHMUL, ORRC, OLRC, // high-mul and rotate-carry
|
|
|
|
OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT,
|
2009-07-31 10:29:28 -06:00
|
|
|
ONEW,
|
|
|
|
ONOT, OCOM, OPLUS, OMINUS,
|
|
|
|
OOROR,
|
|
|
|
OPANIC, OPANICN, OPRINT, OPRINTN,
|
2009-08-03 12:58:52 -06:00
|
|
|
OSEND, OSENDNB,
|
|
|
|
OSLICE, OSLICEARR, OSLICESTR,
|
2009-07-31 10:29:28 -06:00
|
|
|
ORECV,
|
2009-08-03 12:58:52 -06:00
|
|
|
ORUNESTR,
|
2009-08-04 13:57:48 -06:00
|
|
|
OSELRECV,
|
2009-07-14 00:38:39 -06:00
|
|
|
|
2009-07-31 10:29:28 -06:00
|
|
|
// stmts
|
|
|
|
OBLOCK,
|
|
|
|
OBREAK,
|
|
|
|
OCASE, OXCASE,
|
|
|
|
OCONTINUE,
|
|
|
|
ODEFER,
|
|
|
|
OEMPTY,
|
|
|
|
OFALL, OXFALL,
|
|
|
|
OFOR,
|
|
|
|
OGOTO,
|
|
|
|
OIF,
|
|
|
|
OLABEL,
|
|
|
|
OPROC,
|
|
|
|
ORANGE,
|
|
|
|
ORETURN,
|
|
|
|
OSELECT,
|
|
|
|
OSWITCH,
|
|
|
|
OTYPECASE,
|
|
|
|
OTYPESW,
|
|
|
|
|
|
|
|
// types
|
|
|
|
OTCHAN,
|
|
|
|
OTMAP,
|
|
|
|
OTSTRUCT,
|
|
|
|
OTINTER,
|
|
|
|
OTFUNC,
|
|
|
|
OTARRAY,
|
|
|
|
|
|
|
|
// for back ends
|
|
|
|
OCMP, ODEC, OEXTEND, OINC, OREGISTER, OINDREG,
|
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,
|
|
|
|
|
2009-03-12 20:04:38 -06:00
|
|
|
// pseudo-types for literals
|
|
|
|
TIDEAL,
|
|
|
|
TNIL,
|
2009-09-09 00:16:19 -06:00
|
|
|
TBLANK,
|
2009-03-12 20:04:38 -06:00
|
|
|
|
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
|
|
|
|
{
|
2009-07-29 13:47:51 -06:00
|
|
|
Etop = 1<<1, // evaluated at statement level
|
2009-08-03 12:58:52 -06:00
|
|
|
Erv = 1<<2, // evaluated in value context
|
|
|
|
Etype = 1<<3,
|
2009-08-05 01:42:44 -06:00
|
|
|
Ecall = 1<<4, // call-only expressions are ok
|
|
|
|
Efnstruct = 1<<5, // multivalue function returns are ok
|
2009-08-11 18:05:22 -06:00
|
|
|
Eiota = 1<<6, // iota is ok
|
2009-09-09 00:16:19 -06:00
|
|
|
Easgn = 1<<7, // assigning to expression
|
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-08-20 18:33:28 -06:00
|
|
|
Sym* gotype;
|
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-08-09 16:16:06 -06:00
|
|
|
/*
|
|
|
|
* argument passing to/from
|
|
|
|
* smagic and umagic
|
|
|
|
*/
|
|
|
|
typedef struct Magic Magic;
|
|
|
|
struct Magic
|
|
|
|
{
|
|
|
|
int w; // input for both - width
|
|
|
|
int s; // output for both - shift
|
|
|
|
int bad; // output for both - unexpected failure
|
|
|
|
|
|
|
|
// magic multiplier for signed literal divisors
|
|
|
|
int64 sd; // input - literal divisor
|
|
|
|
int64 sm; // output - multiplier
|
|
|
|
|
|
|
|
// magic multiplier for unsigned literal divisors
|
|
|
|
uint64 ud; // input - literal divisor
|
|
|
|
uint64 um; // output - multiplier
|
|
|
|
int ua; // output - adder
|
|
|
|
};
|
|
|
|
|
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;
|
2009-08-19 16:18:08 -06:00
|
|
|
EXTERN int32 lexlineno;
|
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* 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;
|
2009-03-10 21:03:31 -06:00
|
|
|
EXTERN Idir* idirs;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Type* types[NTYPE];
|
2009-07-29 13:47:51 -06:00
|
|
|
EXTERN Type* idealstring;
|
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];
|
2009-07-29 13:47:51 -06:00
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN uchar okforeq[NTYPE];
|
|
|
|
EXTERN uchar okforadd[NTYPE];
|
|
|
|
EXTERN uchar okforand[NTYPE];
|
2009-07-29 13:47:51 -06:00
|
|
|
EXTERN uchar okfornone[NTYPE];
|
|
|
|
EXTERN uchar okforcmp[NTYPE];
|
|
|
|
EXTERN uchar okforbool[NTYPE];
|
|
|
|
EXTERN uchar okforcap[NTYPE];
|
|
|
|
EXTERN uchar okforlen[NTYPE];
|
|
|
|
EXTERN uchar okforarith[NTYPE];
|
|
|
|
EXTERN uchar* okfor[OEND];
|
2009-07-30 17:53:08 -06:00
|
|
|
EXTERN uchar iscmp[OEND];
|
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
|
|
|
|
2009-08-12 14:18:19 -06:00
|
|
|
EXTERN NodeList* xtop;
|
2009-08-04 23:59:23 -06:00
|
|
|
EXTERN NodeList* externdcl;
|
2009-08-07 13:50:26 -06:00
|
|
|
EXTERN NodeList* closures;
|
2009-08-04 23:59:23 -06:00
|
|
|
EXTERN NodeList* exportlist;
|
|
|
|
EXTERN NodeList* typelist;
|
2009-05-18 23:11:22 -06:00
|
|
|
EXTERN int dclcontext; // PEXTERN/PAUTO
|
2008-06-11 22:06:26 -06:00
|
|
|
EXTERN int inimportsys;
|
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 maxarg;
|
2008-10-13 21:14:09 -06:00
|
|
|
EXTERN int32 stksize; // stack size for current frame
|
2009-08-04 23:59:23 -06:00
|
|
|
EXTERN int32 blockgen; // max block number
|
|
|
|
EXTERN int32 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-08-03 12:58:52 -06:00
|
|
|
EXTERN Node* curfn;
|
|
|
|
|
2009-03-30 18:09:28 -06:00
|
|
|
EXTERN int maxround;
|
|
|
|
EXTERN int widthptr;
|
|
|
|
|
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;
|
2009-08-07 13:50:26 -06:00
|
|
|
EXTERN int typecheckok;
|
2009-02-06 14:47:10 -07:00
|
|
|
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
/*
|
|
|
|
* y.tab.c
|
|
|
|
*/
|
|
|
|
int yyparse(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* lex.c
|
|
|
|
*/
|
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-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*, ...);
|
2009-08-19 16:18:08 -06:00
|
|
|
int parserline(void);
|
2008-06-04 15:37:38 -06:00
|
|
|
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);
|
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-08-27 12:16:34 -06:00
|
|
|
int isideal(Type*);
|
2009-09-09 00:16:19 -06:00
|
|
|
int isblank(Node*);
|
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-09-02 10:09:32 -06:00
|
|
|
uint32 typehash(Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void frame(int);
|
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*);
|
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*);
|
2009-07-29 12:51:34 -06:00
|
|
|
void exprfmt(Fmt*, Node*, int);
|
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**);
|
|
|
|
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*);
|
|
|
|
|
2009-08-09 16:16:06 -06:00
|
|
|
int powtwo(Node*);
|
|
|
|
Type* tounsigned(Type*);
|
|
|
|
void smagic(Magic*);
|
|
|
|
void umagic(Magic*);
|
|
|
|
|
2009-08-19 16:18:08 -06:00
|
|
|
void redeclare(Sym*, char*);
|
2009-08-20 18:33:28 -06:00
|
|
|
Sym* ngotype(Node*);
|
2009-08-19 16:18:08 -06:00
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
/*
|
|
|
|
* dcl.c
|
|
|
|
*/
|
2009-08-04 23:59:23 -06:00
|
|
|
void declare(Node*, int);
|
2008-10-06 17:44:17 -06:00
|
|
|
Type* dodcltype(Type*);
|
|
|
|
void updatetype(Type*, Type*);
|
2009-07-17 14:38:16 -06:00
|
|
|
void defaultlit(Node**, Type*);
|
2009-07-30 17:53:08 -06:00
|
|
|
void defaultlit2(Node**, Node**, int);
|
2009-05-07 11:30:22 -06:00
|
|
|
int structcount(Type*);
|
2009-08-07 13:50:26 -06:00
|
|
|
void addmethod(Sym*, Type*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* methodname(Node*, Type*);
|
2009-08-07 13:50:26 -06:00
|
|
|
Node* methodname1(Node*, Node*);
|
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 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*);
|
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 02:00:44 -06:00
|
|
|
Node* unsafenmagic(Node*, NodeList*);
|
2009-08-04 17:53:06 -06:00
|
|
|
void dclchecks(void);
|
2009-08-07 13:50:26 -06:00
|
|
|
void funccompile(Node*);
|
|
|
|
|
|
|
|
Node* typedcl0(Sym*);
|
|
|
|
Node* typedcl1(Node*, Node*, int);
|
|
|
|
void typedcl2(Type*, Type*);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* closure.c
|
|
|
|
*/
|
|
|
|
void closurehdr(Node*);
|
|
|
|
Node* closurebody(NodeList*);
|
|
|
|
void typecheckclosure(Node*);
|
|
|
|
Node* walkclosure(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-08-04 23:59:23 -06:00
|
|
|
void autoexport(Node*, int);
|
2009-01-16 16:25:52 -07:00
|
|
|
int exportname(char*);
|
2009-08-04 23:59:23 -06:00
|
|
|
void exportsym(Node*);
|
|
|
|
void packagesym(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void dumpe(Sym*);
|
|
|
|
void dumpexport(void);
|
|
|
|
void dumpexporttype(Sym*);
|
|
|
|
void dumpexportvar(Sym*);
|
|
|
|
void dumpexportconst(Sym*);
|
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-08-07 13:50:26 -06:00
|
|
|
void importtype(Type *s, Type *t);
|
2009-06-06 13:46:38 -06:00
|
|
|
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*);
|
2009-08-07 13:50:26 -06:00
|
|
|
Sym* importsym(Sym*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* walk.c
|
|
|
|
*/
|
|
|
|
void walk(Node*);
|
2009-07-29 13:00:34 -06:00
|
|
|
void walkstmt(Node**);
|
2009-07-17 02:00:44 -06:00
|
|
|
void walkstmtlist(NodeList*);
|
2009-07-31 10:29:28 -06:00
|
|
|
void walkexprlist(NodeList*, NodeList**);
|
2009-07-29 13:00:34 -06:00
|
|
|
void walkconv(Node**, NodeList**);
|
2009-07-17 02:00:44 -06:00
|
|
|
void walkdottype(Node*, NodeList**);
|
2008-09-04 13:21:10 -06:00
|
|
|
void walkas(Node*);
|
2009-03-05 16:49:34 -07:00
|
|
|
void walkswitch(Node*);
|
2009-08-05 03:33:30 -06:00
|
|
|
void walkrange(Node*);
|
2008-07-24 16:57:30 -06:00
|
|
|
void walkselect(Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
void walkdot(Node*, NodeList**);
|
2009-07-31 10:29:28 -06:00
|
|
|
void walkexpr(Node**, NodeList**);
|
2009-08-04 13:57:48 -06:00
|
|
|
Node* mkcall(char*, Type*, NodeList**, ...);
|
|
|
|
Node* mkcall1(Node*, Type*, NodeList**, ...);
|
|
|
|
Node* chanfn(char*, int, Type*);
|
2009-07-17 02:00:44 -06:00
|
|
|
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**);
|
2009-07-31 10:29:28 -06:00
|
|
|
Node* mapop(Node*, NodeList**);
|
2008-07-24 16:57:30 -06:00
|
|
|
Type* fixchan(Type*);
|
2009-08-03 12:58:52 -06:00
|
|
|
Node* ifacecvt(Type*, Node*, int, NodeList**);
|
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**);
|
|
|
|
Node* colas(NodeList*, NodeList*);
|
2009-08-05 03:33:30 -06:00
|
|
|
void colasdefn(NodeList*, Node*);
|
2009-07-17 02:00:44 -06:00
|
|
|
NodeList* reorder1(NodeList*);
|
|
|
|
NodeList* reorder3(NodeList*);
|
|
|
|
NodeList* reorder4(NodeList*);
|
2009-09-05 21:32:24 -06:00
|
|
|
void anylit(Node*, Node*, NodeList**);
|
2009-09-08 16:52:27 -06:00
|
|
|
int oaslit(Node*, NodeList**);
|
2009-01-29 18:38:58 -07:00
|
|
|
void heapmoves(void);
|
2009-07-17 14:38:16 -06:00
|
|
|
void walkdeflist(NodeList*);
|
|
|
|
void walkdef(Node*);
|
2009-07-29 13:47:51 -06:00
|
|
|
void typechecklist(NodeList*, int);
|
2009-08-04 11:26:29 -06:00
|
|
|
void typecheckswitch(Node*);
|
2009-08-04 13:57:48 -06:00
|
|
|
void typecheckselect(Node*);
|
2009-08-05 03:33:30 -06:00
|
|
|
void typecheckrange(Node*);
|
2009-08-03 12:58:52 -06:00
|
|
|
Node* typecheckconv(Node*, Node*, Type*, int);
|
2009-08-05 03:33:30 -06:00
|
|
|
int checkconv(Type*, Type*, int, int*, int*);
|
2009-07-29 13:47:51 -06:00
|
|
|
Node* typecheck(Node**, int);
|
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;
|
|
|
|
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-09-05 21:32:24 -06:00
|
|
|
int gen_as_init(Node*);
|
2009-05-20 16:09:50 -06:00
|
|
|
|