diff options
Diffstat (limited to 'ir.h')
| -rw-r--r-- | ir.h | 94 |
1 files changed, 22 insertions, 72 deletions
@@ -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 |
