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.
|
|
|
|
|
|
|
|
/*
|
|
|
|
todo:
|
|
|
|
1. dyn arrays
|
|
|
|
2. multi
|
|
|
|
3. block 0
|
|
|
|
tothinkabout:
|
|
|
|
2. argument in import
|
|
|
|
*/
|
|
|
|
|
|
|
|
#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
|
|
|
|
#define EXTERN extern
|
|
|
|
#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,
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* note this is the representation
|
|
|
|
* of the compilers string literals,
|
|
|
|
* it happens to also be the runtime
|
|
|
|
* representation, ignoring sizes and
|
|
|
|
* alignment, but that may change.
|
|
|
|
*/
|
|
|
|
typedef struct String String;
|
|
|
|
struct String
|
|
|
|
{
|
|
|
|
long len;
|
|
|
|
char s[3]; // variable
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Val Val;
|
|
|
|
struct Val
|
|
|
|
{
|
|
|
|
int ctype;
|
|
|
|
double dval;
|
|
|
|
vlong vval;
|
|
|
|
String* sval;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct Sym Sym;
|
|
|
|
typedef struct Node Node;
|
|
|
|
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-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-06-04 15:37:38 -06:00
|
|
|
Sym* sym;
|
|
|
|
long vargen; // unique name for OTYPE/ONAME
|
|
|
|
|
|
|
|
// most nodes
|
|
|
|
Type* type;
|
|
|
|
vlong width; // offset in TFIELD, width in all others
|
|
|
|
|
|
|
|
// TFIELD
|
|
|
|
Type* down; // also used in TMAP
|
|
|
|
|
|
|
|
// TPTR
|
|
|
|
Type* nforw;
|
|
|
|
|
|
|
|
// TFUNCT
|
|
|
|
Node* nname;
|
2008-07-12 18:16:22 -06:00
|
|
|
vlong argwid;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// TARRAY
|
|
|
|
long bound;
|
|
|
|
};
|
|
|
|
#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
|
|
|
|
uchar class; // PPARAM, PAUTO, PEXTERN, PSTATIC
|
|
|
|
uchar method; // OCALLMETH name
|
2008-07-03 17:41:32 -06:00
|
|
|
uchar iota; // OLITERAL made from iota
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
// most nodes
|
|
|
|
Node* left;
|
|
|
|
Node* right;
|
|
|
|
Type* type;
|
|
|
|
|
|
|
|
// for-body
|
|
|
|
Node* ninit;
|
|
|
|
Node* ntest;
|
|
|
|
Node* nincr;
|
|
|
|
Node* nbody;
|
|
|
|
|
|
|
|
// if-body
|
|
|
|
Node* nelse;
|
|
|
|
|
|
|
|
// cases
|
|
|
|
Node* ncase;
|
|
|
|
|
|
|
|
// func
|
|
|
|
Node* nname;
|
|
|
|
|
|
|
|
// OLITERAL
|
|
|
|
Val val;
|
|
|
|
|
|
|
|
Sym* osym; // import
|
|
|
|
Sym* fsym; // import
|
|
|
|
Sym* psym; // import
|
|
|
|
Sym* sym; // various
|
|
|
|
long vargen; // unique name for OTYPE/ONAME
|
2008-07-05 13:49:25 -06:00
|
|
|
long lineno;
|
2008-06-04 15:37:38 -06:00
|
|
|
vlong xoffset;
|
|
|
|
};
|
|
|
|
#define N ((Node*)0)
|
|
|
|
|
|
|
|
struct Sym
|
|
|
|
{
|
2008-06-21 16:11:29 -06:00
|
|
|
ushort tblock;
|
|
|
|
ushort vblock;
|
|
|
|
|
|
|
|
uchar undef; // a diagnostic has been generated
|
|
|
|
uchar export; // marked as export
|
|
|
|
uchar exported; // has been exported
|
|
|
|
uchar sym; // huffman encoding in object file
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
char* opackage; // original package name
|
|
|
|
char* package; // package name
|
|
|
|
char* name; // variable name
|
|
|
|
Node* oname; // ONAME node if a var
|
|
|
|
Type* otype; // TYPE node if a type
|
|
|
|
Node* oconst; // OLITERAL node if a const
|
2008-06-27 11:29:02 -06:00
|
|
|
Type* forwtype; // TPTR iff forward declared
|
2008-06-04 15:37:38 -06:00
|
|
|
void* label; // pointer to Prog* of label
|
|
|
|
vlong offset; // stack location if automatic
|
|
|
|
long lexical;
|
|
|
|
long vargen; // unique variable number
|
|
|
|
Sym* link;
|
|
|
|
};
|
|
|
|
#define S ((Sym*)0)
|
|
|
|
|
|
|
|
typedef struct Dcl Dcl;
|
|
|
|
struct Dcl
|
|
|
|
{
|
2008-06-21 16:11:29 -06:00
|
|
|
uchar op;
|
2008-06-04 15:37:38 -06:00
|
|
|
Sym* dsym; // for printing only
|
|
|
|
Node* dnode; // oname
|
|
|
|
Type* dtype; // otype
|
|
|
|
long lineno;
|
|
|
|
|
|
|
|
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;
|
|
|
|
long line;
|
|
|
|
long offset;
|
|
|
|
};
|
|
|
|
#define H ((Hist*)0)
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
OXXX,
|
|
|
|
|
|
|
|
OTYPE, OCONST, OVAR, OEXPORT, OIMPORT,
|
|
|
|
|
2008-06-21 16:11:29 -06:00
|
|
|
ONAME, ONONAME,
|
2008-06-04 15:37:38 -06:00
|
|
|
ODOT, ODOTPTR, ODOTMETH, ODOTINTER,
|
|
|
|
ODCLFUNC, ODCLFIELD, ODCLARG,
|
|
|
|
OLIST, OCMP,
|
|
|
|
OPTR, OARRAY,
|
|
|
|
ORETURN, OFOR, OIF, OSWITCH, OI2S, OS2I, OI2I,
|
|
|
|
OAS, OASOP, OCASE, OXCASE, OFALL, OXFALL,
|
|
|
|
OGOTO, OPROC, ONEW, OPANIC, OPRINT, OEMPTY,
|
|
|
|
|
|
|
|
OOROR,
|
|
|
|
OANDAND,
|
|
|
|
OEQ, ONE, OLT, OLE, OGE, OGT,
|
|
|
|
OADD, OSUB, OOR, OXOR,
|
|
|
|
OMUL, ODIV, OMOD, OLSH, ORSH, OAND,
|
|
|
|
OLEN,
|
|
|
|
OFUNC,
|
|
|
|
OLABEL,
|
|
|
|
OBREAK,
|
|
|
|
OCONTINUE,
|
|
|
|
OADDR,
|
|
|
|
OIND,
|
|
|
|
OCALL, OCALLMETH, OCALLINTER,
|
|
|
|
OINDEX, OINDEXPTR, OSLICE,
|
|
|
|
ONOT, OCOM, OPLUS, OMINUS, OSEND, ORECV,
|
|
|
|
OLITERAL, OREGISTER, OINDREG,
|
|
|
|
OCONV,
|
|
|
|
OBAD,
|
|
|
|
|
|
|
|
OEND,
|
|
|
|
};
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
Txxx, // 0
|
|
|
|
|
|
|
|
TINT8, TUINT8, // 1
|
|
|
|
TINT16, TUINT16,
|
|
|
|
TINT32, TUINT32,
|
|
|
|
TINT64, TUINT64,
|
|
|
|
|
|
|
|
TFLOAT32, // 9
|
|
|
|
TFLOAT64,
|
|
|
|
TFLOAT80,
|
|
|
|
|
|
|
|
TBOOL, // 12
|
|
|
|
|
|
|
|
TPTR32, TPTR64, // 13
|
|
|
|
|
|
|
|
TFUNC,
|
|
|
|
TARRAY,
|
|
|
|
TDARRAY,
|
|
|
|
TSTRUCT,
|
|
|
|
TCHAN,
|
|
|
|
TMAP,
|
|
|
|
TINTER,
|
|
|
|
TFORW,
|
|
|
|
TFIELD,
|
|
|
|
TANY,
|
|
|
|
TSTRING,
|
|
|
|
|
|
|
|
NTYPE, // 26
|
|
|
|
};
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
CTxxx,
|
|
|
|
|
|
|
|
CTINT,
|
|
|
|
CTSINT,
|
|
|
|
CTUINT,
|
|
|
|
CTFLT,
|
|
|
|
|
|
|
|
CTSTR,
|
|
|
|
CTBOOL,
|
|
|
|
CTNIL,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
/* indications for whatis() */
|
|
|
|
Wnil = 0,
|
|
|
|
Wtnil,
|
|
|
|
|
|
|
|
Wtfloat,
|
|
|
|
Wtint,
|
|
|
|
Wtbool,
|
|
|
|
Wtstr,
|
|
|
|
|
|
|
|
Wlitfloat,
|
|
|
|
Wlitint,
|
|
|
|
Wlitbool,
|
|
|
|
Wlitstr,
|
2008-06-17 18:59:06 -06:00
|
|
|
Wlitnil,
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
Wtunkn,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
/* types of channel */
|
|
|
|
Cxxx,
|
|
|
|
Cboth,
|
|
|
|
Crecv,
|
|
|
|
Csend,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
Pxxx,
|
|
|
|
|
|
|
|
PEXTERN, // declaration context
|
|
|
|
PAUTO,
|
|
|
|
PPARAM,
|
|
|
|
PSTATIC,
|
|
|
|
};
|
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
typedef struct Io Io;
|
|
|
|
struct Io
|
|
|
|
{
|
|
|
|
char* infile;
|
|
|
|
Biobuf* bin;
|
2008-06-13 19:16:23 -06:00
|
|
|
long ilineno;
|
2008-06-04 15:37:38 -06:00
|
|
|
int peekc;
|
|
|
|
char* cp; // used for content when bin==nil
|
|
|
|
};
|
|
|
|
|
|
|
|
EXTERN Io curio;
|
|
|
|
EXTERN Io pushedio;
|
2008-06-13 19:16:23 -06:00
|
|
|
EXTERN long lineno;
|
|
|
|
EXTERN char* pathname;
|
|
|
|
EXTERN Hist* hist;
|
|
|
|
EXTERN Hist* ehist;
|
|
|
|
|
2008-06-04 15:37:38 -06:00
|
|
|
|
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;
|
|
|
|
EXTERN char namebuf[NSYMB];
|
|
|
|
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-07-08 18:19:17 -06:00
|
|
|
EXTERN char* filename; // name to uniqify names
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Type* types[NTYPE];
|
|
|
|
EXTERN uchar isptr[NTYPE];
|
|
|
|
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];
|
|
|
|
EXTERN double minfloatval[NTYPE];
|
|
|
|
EXTERN double maxfloatval[NTYPE];
|
|
|
|
EXTERN vlong minintval[NTYPE];
|
|
|
|
EXTERN vlong maxintval[NTYPE];
|
|
|
|
|
|
|
|
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;
|
|
|
|
EXTERN int dclcontext; // PEXTERN/PAUTO
|
|
|
|
EXTERN int importflag;
|
2008-06-11 22:06:26 -06:00
|
|
|
EXTERN int inimportsys;
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Node* booltrue;
|
|
|
|
EXTERN Node* boolfalse;
|
|
|
|
EXTERN ulong iota;
|
2008-07-03 17:41:32 -06:00
|
|
|
EXTERN Node* lastconst;
|
2008-06-04 15:37:38 -06:00
|
|
|
EXTERN long vargen;
|
|
|
|
EXTERN long exportgen;
|
2008-06-11 22:06:26 -06:00
|
|
|
EXTERN long maxarg;
|
|
|
|
EXTERN long stksize;
|
2008-06-21 16:11:29 -06:00
|
|
|
EXTERN ushort blockgen; // max block number
|
|
|
|
EXTERN ushort block; // current block number
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
EXTERN Node* retnil;
|
|
|
|
EXTERN Node* fskel;
|
|
|
|
|
|
|
|
EXTERN char* context;
|
|
|
|
EXTERN int thechar;
|
|
|
|
EXTERN char* thestring;
|
|
|
|
EXTERN char* hunk;
|
|
|
|
EXTERN long nhunk;
|
|
|
|
EXTERN long thunk;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* y.tab.c
|
|
|
|
*/
|
|
|
|
int yyparse(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* lex.c
|
|
|
|
*/
|
2008-06-04 16:33:59 -06:00
|
|
|
int mainlex(int, char*[]);
|
2008-07-08 18:19:17 -06:00
|
|
|
void setfilename(char*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void importfile(Val*);
|
|
|
|
void cannedimports(void);
|
|
|
|
void unimportfile();
|
|
|
|
long yylex(void);
|
|
|
|
void lexinit(void);
|
|
|
|
char* lexname(int);
|
|
|
|
long getr(void);
|
|
|
|
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*);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* mpatof.c
|
|
|
|
*/
|
|
|
|
int mpatof(char*, double*);
|
|
|
|
int mpatov(char*, vlong*);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* subr.c
|
|
|
|
*/
|
|
|
|
void myexit(int);
|
|
|
|
void* mal(long);
|
|
|
|
void* remal(void*, long, long);
|
|
|
|
void errorexit(void);
|
|
|
|
ulong stringhash(char*);
|
|
|
|
Sym* lookup(char*);
|
|
|
|
Sym* pkglookup(char*, char*);
|
|
|
|
void yyerror(char*, ...);
|
|
|
|
void warn(char*, ...);
|
|
|
|
void fatal(char*, ...);
|
2008-06-13 19:16:23 -06:00
|
|
|
void linehist(char*, long);
|
2008-06-26 18:54:44 -06:00
|
|
|
long setlineno(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* nod(int, Node*, Node*);
|
2008-06-17 23:33:32 -06:00
|
|
|
Node* list(Node*, Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
Type* typ(int);
|
|
|
|
Dcl* dcl(void);
|
|
|
|
Node* rev(Node*);
|
|
|
|
Node* unrev(Node*);
|
|
|
|
void dodump(Node*, int);
|
|
|
|
void dump(char*, Node*);
|
|
|
|
Type* aindex(Node*, Type*);
|
|
|
|
int isnil(Node*);
|
|
|
|
int isptrto(Type*, int);
|
|
|
|
int isinter(Type*);
|
|
|
|
int isbytearray(Type*);
|
|
|
|
int eqtype(Type*, Type*, int);
|
2008-06-15 21:24:30 -06:00
|
|
|
void argtype(Node*, Type*);
|
2008-06-04 15:37:38 -06:00
|
|
|
int eqargs(Type*, Type*);
|
|
|
|
ulong typehash(Type*, int);
|
|
|
|
void frame(int);
|
|
|
|
Node* literal(long);
|
|
|
|
Node* dobad(void);
|
|
|
|
Node* nodintconst(long);
|
|
|
|
void ullmancalc(Node*);
|
|
|
|
void badtype(int, Type*, Type*);
|
|
|
|
Type* ptrto(Type*);
|
|
|
|
Node* cleanidlist(Node*);
|
2008-06-15 21:24:30 -06:00
|
|
|
Node* syslook(char*, int);
|
2008-07-03 17:41:32 -06:00
|
|
|
Node* treecopy(Node*);
|
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*);
|
|
|
|
|
|
|
|
Node* listfirst(Iter*, Node**);
|
|
|
|
Node* listnext(Iter*);
|
|
|
|
Type* structfirst(Iter*, Type**);
|
|
|
|
Type* structnext(Iter*);
|
|
|
|
Type* funcfirst(Iter*, Type*);
|
|
|
|
Type* funcnext(Iter*);
|
|
|
|
|
|
|
|
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*);
|
|
|
|
int Zconv(Fmt*);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* dcl.c
|
|
|
|
*/
|
|
|
|
void dodclvar(Node*, Type*);
|
|
|
|
void dodcltype(Type*, Type*);
|
|
|
|
void dodclconst(Node*, Node*);
|
|
|
|
void defaultlit(Node*);
|
|
|
|
int listcount(Node*);
|
|
|
|
Node* methodname(Node*, Type*);
|
|
|
|
Type* functype(Node*, Node*, Node*);
|
|
|
|
char* thistypenam(Node*);
|
|
|
|
void funcnam(Type*, char*);
|
|
|
|
void funchdr(Node*);
|
|
|
|
void funcargs(Type*);
|
|
|
|
void funcbody(Node*);
|
|
|
|
Type* dostruct(Node*, int);
|
|
|
|
Type** stotype(Node*, Type**);
|
|
|
|
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);
|
|
|
|
void addtyp(Type*, Type*, int);
|
|
|
|
Node* fakethis(void);
|
|
|
|
Node* newname(Sym*);
|
|
|
|
Node* oldname(Sym*);
|
|
|
|
Type* newtype(Sym*);
|
|
|
|
Type* oldtype(Sym*);
|
|
|
|
Type* forwdcl(Sym*);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* export.c
|
|
|
|
*/
|
2008-06-12 22:48:56 -06:00
|
|
|
void renamepkg(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
void markexport(Node*);
|
|
|
|
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-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* walk.c
|
|
|
|
*/
|
|
|
|
void walk(Node*);
|
|
|
|
void walktype(Node*, int);
|
2008-07-05 13:49:25 -06:00
|
|
|
void walkbool(Node*);
|
2008-06-15 21:24:30 -06:00
|
|
|
Type* walkswitch(Node*, Type*(*)(Node*, Type*));
|
2008-06-04 15:37:38 -06:00
|
|
|
int casebody(Node*);
|
|
|
|
int whatis(Node*);
|
2008-06-15 21:24:30 -06:00
|
|
|
void walkdot(Node*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* ascompatee(int, Node**, Node**);
|
|
|
|
Node* ascompatet(int, Node**, Type**, int);
|
|
|
|
Node* ascompatte(int, Type**, Node**, int);
|
|
|
|
int ascompat(Type*, Type*);
|
|
|
|
Node* prcompat(Node*);
|
|
|
|
Node* nodpanic(long);
|
|
|
|
Node* newcompat(Node*);
|
2008-06-15 21:24:30 -06:00
|
|
|
Node* stringop(Node*, int);
|
|
|
|
Node* mapop(Node*, int);
|
2008-07-12 14:08:53 -06:00
|
|
|
Node* chanop(Node*, int);
|
2008-06-04 15:37:38 -06:00
|
|
|
Node* convas(Node*);
|
2008-06-08 13:48:37 -06:00
|
|
|
void arrayconv(Type*, Node*);
|
2008-06-21 16:11:29 -06:00
|
|
|
Node* colas(Node*, Node*);
|
2008-06-10 22:29:57 -06:00
|
|
|
Node* reorder1(Node*);
|
|
|
|
Node* reorder2(Node*);
|
|
|
|
Node* reorder3(Node*);
|
|
|
|
Node* reorder4(Node*);
|
2008-06-04 15:37:38 -06:00
|
|
|
|
|
|
|
/*
|
|
|
|
* const.c
|
|
|
|
*/
|
|
|
|
void convlit(Node*, Type*);
|
|
|
|
void evconst(Node*);
|
|
|
|
int cmpslit(Node *l, Node *r);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* gen.c/gsubr.c/obj.c
|
|
|
|
*/
|
|
|
|
void belexinit(int);
|
|
|
|
void besetptr(void);
|
|
|
|
vlong convvtox(vlong, int);
|
|
|
|
void compile(Node*);
|
|
|
|
void proglist(void);
|
|
|
|
int optopop(int);
|
|
|
|
void dumpobj(void);
|
|
|
|
void dowidth(Type*);
|
|
|
|
void argspace(long);
|
|
|
|
Node* nodarg(Type*, int);
|