diff options
Diffstat (limited to 'ir.h')
| -rw-r--r-- | ir.h | 88 |
1 files changed, 72 insertions, 16 deletions
@@ -22,11 +22,11 @@ typedef enum { T_BOOL, T_INT, T_PTR -} BaseType; +} TypeKind; typedef struct Type { TypeLevel lvl; - BaseType t; + TypeKind t; struct Type *next; } Type; @@ -49,21 +49,49 @@ void type_err(struct Node *n, Lexer *l); /* nodes */ +#define NODE_TYPE_LIST\ + X(NONE, "invalid node")\ + X(START, "start")\ + X(IF_ELSE, "if-else")\ + X(REGION, "region")\ + X(PHI, "phi")\ + X(STOP, "stop")\ + X(PROJ, "projection")\ + X(RETURN, "return")\ + X(KEEPALIVE, "keepalive")\ + X(LIT, "literal")\ + X(OP_ADD, "add")\ + X(OP_SUB, "sub")\ + X(OP_MUL, "mul")\ + X(OP_DIV, "div")\ + X(OP_AND, "and")\ + X(OP_OR, "or")\ + X(OP_XOR, "xor")\ + X(OP_SHL, "shl")\ + X(OP_SHR, "shr")\ + X(OP_NEG, "neg")\ + X(OP_NOT, "not")\ + X(CMP_EQL, "equal")\ + X(CMP_NEQ, "not-equal")\ + X(CMP_LES, "less-than")\ + X(CMP_GTR, "greater-than")\ + X(CMP_LTE, "less-or-equal")\ + X(CMP_GTE, "greater-or-equal") + typedef enum { - N_NONE, - N_START, N_IF_ELSE, N_REGION, N_PHI, N_STOP, - N_PROJ, - N_RETURN, - N_KEEPALIVE, - N_LIT, - N_OP_ADD, N_OP_SUB, N_OP_MUL, N_OP_DIV, - N_OP_AND, N_OP_OR, N_OP_XOR, - N_OP_SHL, N_OP_SHR, - N_OP_NEG, N_OP_NOT, - N_CMP_EQL, N_CMP_NEQ, N_CMP_LES, N_CMP_GTR, N_CMP_LTE, N_CMP_GTE, - N_VALUE +#define X(n, name) N_##n, + NODE_TYPE_LIST +#undef X + N_MAX } NodeType; +#define NMASK(n) (1L << n) +typedef enum { +#define X(n, name) NM_##n = NMASK(N_##n), + NODE_TYPE_LIST +#undef X +} NodeMask; + const char *node_type_name(NodeType t); typedef DYNARR(struct Node *) NodeList; @@ -75,15 +103,43 @@ typedef struct Node { struct Node *prev_free; struct { int walked; - NodeType type; + NodeType op; LexSpan src_pos; NodeInputs in; /* note: index 0 used for control flow */ NodeOutputs out; - Value val; + union { + Type type; + Value val; + }; }; }; } Node; +/* convenience macros (lisp-inspired lol) */ + +#define IN(n, i) ((n)->in.data[i]) +#define OUT(n, i) ((n)->out.data[i]) + +#define CTRL(n) IN(n, 0) +#define CAR(n) IN(n, 1) +#define CDR(n) IN(n, 2) +#define CAAR(n) CAR(CAR(n)) +#define CADR(n) CDR(CAR(n)) +#define CDAR(n) CAR(CDR(n)) +#define CDDR(n) CDR(CDR(n)) +#define CAAAR(n) CAR(CAAR(n)) +#define CAADR(n) CDR(CAAR(n)) +#define CADAR(n) CAR(CADR(n)) +#define CADDR(n) CDR(CADR(n)) +#define CDAAR(n) CAR(CDAR(n)) +#define CDADR(n) CDR(CDAR(n)) +#define CDDAR(n) CAR(CDDR(n)) +#define CDDDR(n) CDR(CDDR(n)) +#define T(a,b) ((a)->op == b) +#define T2(a,b,t) ((a)->op == t && (b)->op == t) + + + /* procedure graph */ typedef struct NameBinding { |
