/** set to 1 if a is TOS when evaluting a op b. */ typedef struct { char sub; char lsh; char rsh; char mod; char div; char lt; char le; char gt; char ge; } rhs_first; typedef struct { unsigned char max_unaligned_load; /* Stack specific functions */ int depth; Node (*recalcNode)(Node temp, Node cse); int (*makeVirtual)(Symbol p); void* reserved2; /* The following functions are used by LBURG code-generator */ void (*_label)(Node); int (*_rule)(void*, int); short **_nts; void (*_kids)(Node, int, Node*); char **_string; char **_templates; char *_isinstruction; char **_ntname; void (*emit2)(Node); /* Swap nodes for various binary ops. rhs.xx == 1 means rhs of xx is evaluated first. */ rhs_first rhs; } Xinterface; typedef struct { int offset; unsigned freemask[2]; } Env; #define LBURG_MAX SHRT_MAX enum { VREG =(44<<4) }; enum { STACK =(45<<4) }; //enum { TUCK =(46<<4) }; enum { COPY =(47<<4) }; enum { NOOP =(48<<4) }; typedef struct { unsigned listed:1; unsigned registered:1; unsigned emitted:1; unsigned copy:1; unsigned duplicate:1; unsigned defn:1; unsigned mayrecalc:1; unsigned dead:1; void *state; short inst; int e_depth; int l_depth; /** For root nodes this links all roots within a basic block. * For leaf register nodes this links all usages and definitions within a basic block. */ Node prev, next; /** Points to the next use of the same variable within the same basic block */ Node nextUse; /** Availble for use within optimisation stages */ int scratch; } Xnode; typedef struct { char *name; /** Memory frame offset for the local variable represented by this Symbol */ int offset; /** Corresponds to the index of this Symbol in the global list local_variable_list */ int uniqueID; /** Availble for use within optimisation stages */ int scratch; // unsigned spilled:1; // unsigned allocated:1; unsigned branchTemp:1; } Xsymbol; extern int offset; extern int maxoffset; extern int framesize; /** The number of variables allocated within this function, useful upper limit for set sizes */ extern int local_variable_count; extern int getEDepth(Node n); extern int getLDepth(Node n); extern int getDelve(Node n); extern void setDelve(Node n, int delve); extern void printTree(Node n, FILE* file); extern void stackemit(Node forest); extern void prettytree(Node n); extern void backendflags(int argc, char** argv); extern void write_log(char* format, ...); extern FILE* logfile; extern void makeTemporary(Symbol p); extern Symbol localVariableSymbol(int n); extern void verify(char* name); extern Node stackParameters(Symbol caller[], Symbol callee[]); extern void mkauto(Symbol p); extern int range(Node p, int lo, int hi); extern int getEDepth(Node n); extern int getTotalDepth(Node n); extern int getDelve(Node n); extern void setDelve(Node n, int delve); extern void optimise(void); #define getTempIndex(n) (n->syms[0]->x.uniqueID) #define LOG(x) if (logfile) write_log x