summaryrefslogtreecommitdiff
path: root/includes/compiler/enode.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/compiler/enode.h')
-rw-r--r--includes/compiler/enode.h264
1 files changed, 264 insertions, 0 deletions
diff --git a/includes/compiler/enode.h b/includes/compiler/enode.h
new file mode 100644
index 0000000..6e0ab2c
--- /dev/null
+++ b/includes/compiler/enode.h
@@ -0,0 +1,264 @@
+#ifndef COMPILER_ENODE_H
+#define COMPILER_ENODE_H
+
+#include "compiler/common.h"
+
+#ifdef __MWERKS__
+#pragma options align=mac68k
+#endif
+
+typedef enum ENodeType {
+ EPOSTINC,
+ EPOSTDEC,
+ EPREINC,
+ EPREDEC,
+ EINDIRECT,
+ EMONMIN,
+ EBINNOT,
+ ELOGNOT,
+ EFORCELOAD,
+ EMUL,
+ EMULV,
+ EDIV,
+ EMODULO,
+ EADDV,
+ ESUBV,
+ EADD,
+ ESUB,
+ ESHL,
+ ESHR,
+ ELESS,
+ EGREATER,
+ ELESSEQU,
+ EGREATEREQU,
+ EEQU,
+ ENOTEQU,
+ EAND,
+ EXOR,
+ EOR,
+ ELAND,
+ ELOR,
+ EASS,
+ EMULASS,
+ EDIVASS,
+ EMODASS,
+ EADDASS,
+ ESUBASS,
+ ESHLASS,
+ ESHRASS,
+ EANDASS,
+ EXORASS,
+ EORASS,
+ ECOMMA,
+ EPMODULO,
+ EROTL,
+ EROTR,
+ EBCLR,
+ EBTST,
+ EBSET,
+ ETYPCON,
+ EBITFIELD,
+ EINTCONST,
+ EFLOATCONST,
+ ESTRINGCONST,
+ ECOND,
+ EFUNCCALL,
+ EFUNCCALLP,
+ EOBJREF,
+ EMFPOINTER,
+ ENULLCHECK,
+ EPRECOMP,
+ ETEMP,
+ EARGOBJ,
+ ELOCOBJ,
+ ELABEL,
+ ESETCONST,
+ ENEWEXCEPTION,
+ ENEWEXCEPTIONARRAY,
+ EOBJLIST,
+ EMEMBER,
+ ETEMPLDEP,
+ EINSTRUCTION,
+ EDEFINE,
+ EREUSE,
+ EASSBLK,
+ EVECTOR128CONST,
+ ECONDASS,
+ MAXEXPR
+} ENodeType;
+
+
+struct ENodeList {
+ ENodeList *next;
+ ENode *node;
+};
+
+
+typedef union ENodeUnion {
+ CInt64 intval;
+ Float floatval;
+ SInt32 longval;
+ ENode *monadic;
+ Object *objref;
+ CLabel *label;
+ MWVector128 vector128val;
+ struct {
+ ENode *left;
+ ENode *right;
+ } diadic;
+ struct {
+ ENode *cond;
+ ENode *expr1;
+ ENode *expr2;
+ } cond;
+ struct {
+ ENode *funcref;
+ ENodeList *args;
+ TypeFunc *functype;
+ } funccall;
+ ObjAccess objaccess;
+ struct {
+ ENode *accessnode;
+ ENode *mfpointer;
+ } mfpointer;
+ struct {
+ ENode *nullcheckexpr;
+ ENode *condexpr;
+ SInt32 precompid;
+ } nullcheck;
+ SInt32 precompid;
+ struct {
+ Type *type;
+ SInt32 uniqueid;
+ Boolean needs_dtor;
+ } temp;
+ struct {
+ SInt32 size;
+ char *data;
+ SInt32 segnum;
+ char ispascal;
+ char ispacked;
+ } string;
+ struct {
+ SInt32 size;
+ char *data;
+ } set;
+ struct {
+ ENode *initexpr;
+ ENode *tryexpr;
+ Object *pointertemp;
+ Object *deletefunc;
+ } newexception;
+ struct {
+ ENode *initexpr;
+ ENode *tryexpr;
+ ENode *catchexpr;
+ ENode *result;
+ } itc;
+ struct {
+ Object *objref;
+ SInt32 offset;
+ } addr;
+ void *inst;
+ MemInitializer *ctorinit;
+ Statement *stmt;
+ struct {
+ union {
+ TemplParamID pid;
+ struct {
+ union {
+ Type *type;
+ ENode *expr;
+ } u;
+ TEFuncSel sel;
+ Boolean is_expr;
+ } typeexpr;
+ struct {
+ ENodeList *args;
+ Type *type;
+ UInt32 qual;
+ } cast;
+ struct {
+ TypeTemplDep *type;
+ HashNameNode *name;
+ } qual;
+ struct {
+ TypeTemplDep *type;
+ HashNameNode *name;
+ TemplArg *args;
+ } qualtempl;
+ ObjAccess objaccess;
+ struct {
+ ENode *expr;
+ TStreamElement *token;
+ } sourceref;
+ ENode *monadic;
+ struct {
+ ENode *expr;
+ ENodeList *args;
+ } funccall;
+ struct {
+ Type *type;
+ UInt32 qual;
+ ENode *arraydim;
+ ENodeList *placement;
+ ENodeList *initlist;
+ Boolean is_global;
+ Boolean has_init;
+ } nw;
+ struct {
+ ENode *expr;
+ Boolean is_global;
+ Boolean is_array;
+ } del;
+ struct {
+ ENode *left;
+ ENode *right;
+ } dyadic;
+ struct {
+ ENode *expr;
+ Type *type;
+ UInt32 qual;
+ } newcast;
+ struct {
+ ENode *expr;
+ DepName *dname;
+ Boolean is_pointer;
+ } member;
+ struct {
+ Object *object;
+ Object *info;
+ } exinit;
+ struct {
+ Object *obj;
+ Initializer *init;
+ } varinit;
+ Object *obj;
+ } u;
+ TemplDepSubType subtype;
+ } templdep;
+} ENodeUnion;
+
+struct ENode {
+ ENodeType type;
+ UInt8 cost;
+ UInt16 flags; // &1, &2 correspond to quals
+ Boolean ignored;
+ Boolean hascall;
+ // void *loc; - might not be in pro7?
+ Type *rtype;
+ PointsToFunction *pointsTo;
+ ENodeUnion data;
+};
+
+enum {
+ ENODE_FLAG_CONST = Q_CONST,
+ ENODE_FLAG_VOLATILE = Q_VOLATILE,
+ ENODE_FLAG_QUALS = Q_CONST | Q_VOLATILE
+};
+
+#ifdef __MWERKS__
+#pragma options align=reset
+#endif
+
+#endif