summaryrefslogtreecommitdiff
path: root/ir.h
diff options
context:
space:
mode:
Diffstat (limited to 'ir.h')
-rw-r--r--ir.h94
1 files changed, 22 insertions, 72 deletions
diff --git a/ir.h b/ir.h
index 0e30a06..d640f5a 100644
--- a/ir.h
+++ b/ir.h
@@ -141,98 +141,48 @@ typedef struct Node {
#define T(a,b) ((a)->op == b)
#define T2(a,b,t) ((a)->op == t && (b)->op == t)
-
-
-/* procedure graph */
-
-typedef struct NameBinding {
- struct NameBinding *prev;
- LexSpan src_pos;
- Str name;
- Node *node;
-} NameBinding;
-
-typedef struct ScopeFrame {
- struct ScopeFrame *prev;
- NameBinding *latest;
-} ScopeFrame;
-
-typedef struct {
- ScopeFrame *tail, *free_scope;
- NameBinding *free_bind;
-} Scope;
+/* node graph */
typedef struct {
- Str name;
- Node *node;
-} ScopeName;
-
-typedef DYNARR(ScopeName) ScopeNameList;
-
-/*
- * TODO: move to having
- typedef struct {
- Arena *arena;
- Node *start, *stop, *ctrl, *keepalive;
- Node *free_list;
- } Graph;
- typedef struct {
- Arena arena;
- Str name;
- Graph graph;
- Scope scope;
- } Proc;
- * so that scope handling can be separated from the rest of IR
- */
+ Arena *arena;
+ Node *free_list;
+} NodePool;
typedef struct {
- Arena perm, scratch;
- Str name;
+ /* pointer so that e.g. there can be one pool per worker thread,
+ * instead of one per procedure graph */
+ NodePool *pool;
Node *start, *stop, *ctrl, *keepalive;
- Node *free_list;
- Type ret_type;
- Scope scope;
-} Proc;
+} Graph;
#define NODE_KEEP(p, n, ...)\
do { Node *keep_node = n;\
node_add_out(p, keep_node, p->keepalive); __VA_ARGS__;\
node_del_out(keep_node, p->keepalive); } while(0)
-void node_kill(Node *n, Proc *p);
-void node_die(Node *n, Proc *p);
+void node_kill(Node *n, Graph *p);
+void node_die(Node *n, Graph *p);
void node_del_out(Node *n, Node *p);
void node_del_in(Node *n, Node *p);
-void node_kill(Node *n, Proc *p);
+void node_kill(Node *n, Graph *p);
-void node_add(Proc *p, Node *src, Node *dest);
-void node_add_out(Proc *p, Node *a, Node *b);
-void node_add_in(Proc *p, Node *a, Node *b);
-void node_set_in(Proc *p, Node *n, int idx, Node *to);
+void node_add(Graph *p, Node *src, Node *dest);
+void node_add_out(Graph *p, Node *a, Node *b);
+void node_add_in(Graph *p, Node *a, Node *b);
+void node_set_in(Graph *p, Node *n, int idx, Node *to);
-void node_remove(Proc *p, Node *src, Node *dest);
-Node *node_new_empty(Proc *p, NodeType t);
-Node *node_newv(Proc *p, NodeType t, Node *ctrl, ...);
-Node *node_dedup_lit(Proc *p, Value v);
+void node_remove(Graph *p, Node *src, Node *dest);
+Node *node_new_empty(Graph *p, NodeType t);
+Node *node_newv(Graph *p, NodeType t, Node *ctrl, ...);
+Node *node_dedup_lit(Graph *p, Value v);
-Node *node_new_lit(Proc *p, Value v);
-Node *node_new_lit_bool(Proc *p, int b);
-Node *node_new_lit_i64(Proc *p, int64_t i);
+Node *node_new_lit(Graph *p, Value v);
+Node *node_new_lit_bool(Graph *p, int b);
+Node *node_new_lit_i64(Graph *p, int64_t i);
int node_uninit(Node *n);
int node_maybe_uninit(Node *n);
#define node_new(...) node_newv(__VA_ARGS__, NULL)
-void proc_init(Proc *proc, Str name);
-void proc_free(Proc *proc);
-
-ScopeFrame *scope_push(Scope *scope, Proc *proc);
-ScopeFrame *scope_pop(Scope *scope, Proc *proc);
-NameBinding *scope_find(Scope *scope, Str name);
-NameBinding *scope_bind(Scope *scope, Str name, Node *value, LexSpan pos, Proc *proc);
-NameBinding *scope_update(NameBinding *b, Node *to, Proc *proc);
-void scope_collect(Scope *scope, Proc *proc, ScopeNameList *nl, Arena *arena);
-void scope_uncollect(Scope *scope, Proc *proc, ScopeNameList *nl);
-
#endif