summaryrefslogtreecommitdiff
path: root/ir.h
diff options
context:
space:
mode:
authorWormHeamer2025-08-08 04:43:37 -0400
committerWormHeamer2025-08-08 04:43:37 -0400
commit73bd0a21ab9b5073ea7d17fb85b3469d110dc06d (patch)
tree274d5203fec0fafd09e7aed7d247f22775c0678b /ir.h
parent374caf13f412f5062888bc2c49b011bec884e531 (diff)
rework some stuff, maybe bugfix, loosen associative typechecking
Diffstat (limited to 'ir.h')
-rw-r--r--ir.h88
1 files changed, 72 insertions, 16 deletions
diff --git a/ir.h b/ir.h
index cba0bcc..54c56e2 100644
--- a/ir.h
+++ b/ir.h
@@ -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 {