mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-04 21:08:40 +00:00
eval: specify formal way in which tags (view rules) can fit into expression language, both in parsing & in structure; introduce ir-generation hook step in eval pipeline, transfer most of the default non-vbisualization view rule features to that layer
This commit is contained in:
+84
-7
@@ -42,6 +42,7 @@ struct E_IRNode
|
||||
E_IRNode *last;
|
||||
E_IRNode *next;
|
||||
RDI_EvalOp op;
|
||||
E_Space space;
|
||||
String8 string;
|
||||
E_Value value;
|
||||
};
|
||||
@@ -84,31 +85,30 @@ struct E_LookupRange
|
||||
#define E_LOOKUP_INFO_FUNCTION_NAME(name) e_lookup_info_##name
|
||||
#define E_LOOKUP_INFO_FUNCTION_DEF(name) internal E_LOOKUP_INFO_FUNCTION_SIG(E_LOOKUP_INFO_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_INFO_FUNCTION_SIG(E_LookupInfoFunctionType);
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_ACCESS_FUNCTION_SIG(name) E_LookupAccess name(Arena *arena, E_ExprKind kind, E_Expr *lhs, E_Expr *rhs, void *user_data)
|
||||
#define E_LOOKUP_ACCESS_FUNCTION_NAME(name) e_lookup_access_##name
|
||||
#define E_LOOKUP_ACCESS_FUNCTION_DEF(name) internal E_LOOKUP_ACCESS_FUNCTION_SIG(E_LOOKUP_ACCESS_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) E_LookupRange name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, void *user_data)
|
||||
#define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name
|
||||
#define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(U64 num, void *user_data)
|
||||
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(name) e_lookup_id_from_num_##name
|
||||
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(name) internal E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(E_LookupIDFromNumFunctionType);
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default);
|
||||
|
||||
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(U64 id, void *user_data)
|
||||
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(name) e_lookup_num_from_id_##name
|
||||
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(name) internal E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(name))
|
||||
typedef E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(E_LookupNumFromIDFunctionType);
|
||||
|
||||
E_LOOKUP_INFO_FUNCTION_DEF(default);
|
||||
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
|
||||
E_LOOKUP_RANGE_FUNCTION_DEF(default);
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default);
|
||||
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(default);
|
||||
|
||||
typedef struct E_LookupRule E_LookupRule;
|
||||
@@ -143,6 +143,68 @@ struct E_LookupRuleMap
|
||||
U64 slots_count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Generation Hooks
|
||||
|
||||
#define E_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr, E_Expr *tag)
|
||||
#define E_IRGEN_FUNCTION_NAME(name) e_irgen_##name
|
||||
#define E_IRGEN_FUNCTION_DEF(name) internal E_IRGEN_FUNCTION_SIG(E_IRGEN_FUNCTION_NAME(name))
|
||||
typedef E_IRGEN_FUNCTION_SIG(E_IRGenFunctionType);
|
||||
E_IRGEN_FUNCTION_DEF(default);
|
||||
|
||||
typedef struct E_IRGenRule E_IRGenRule;
|
||||
struct E_IRGenRule
|
||||
{
|
||||
String8 name;
|
||||
E_IRGenFunctionType *irgen;
|
||||
};
|
||||
|
||||
typedef struct E_IRGenRuleNode E_IRGenRuleNode;
|
||||
struct E_IRGenRuleNode
|
||||
{
|
||||
E_IRGenRuleNode *next;
|
||||
E_IRGenRule v;
|
||||
};
|
||||
|
||||
typedef struct E_IRGenRuleSlot E_IRGenRuleSlot;
|
||||
struct E_IRGenRuleSlot
|
||||
{
|
||||
E_IRGenRuleNode *first;
|
||||
E_IRGenRuleNode *last;
|
||||
};
|
||||
|
||||
typedef struct E_IRGenRuleMap E_IRGenRuleMap;
|
||||
struct E_IRGenRuleMap
|
||||
{
|
||||
U64 slots_count;
|
||||
E_IRGenRuleSlot *slots;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Used Tag Map Data Structure
|
||||
|
||||
typedef struct E_UsedTagNode E_UsedTagNode;
|
||||
struct E_UsedTagNode
|
||||
{
|
||||
E_UsedTagNode *next;
|
||||
E_UsedTagNode *prev;
|
||||
E_Expr *tag;
|
||||
};
|
||||
|
||||
typedef struct E_UsedTagSlot E_UsedTagSlot;
|
||||
struct E_UsedTagSlot
|
||||
{
|
||||
E_UsedTagNode *first;
|
||||
E_UsedTagNode *last;
|
||||
};
|
||||
|
||||
typedef struct E_UsedTagMap E_UsedTagMap;
|
||||
struct E_UsedTagMap
|
||||
{
|
||||
U64 slots_count;
|
||||
E_UsedTagSlot *slots;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Parse Context
|
||||
|
||||
@@ -151,6 +213,8 @@ struct E_IRCtx
|
||||
{
|
||||
E_String2ExprMap *macro_map;
|
||||
E_LookupRuleMap *lookup_rule_map;
|
||||
E_IRGenRuleMap *irgen_rule_map;
|
||||
E_UsedTagMap *used_tag_map;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -165,6 +229,11 @@ local_persist read_only E_LookupRule e_lookup_rule__default =
|
||||
E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default),
|
||||
E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(default),
|
||||
};
|
||||
local_persist read_only E_IRGenRule e_irgen_rule__default =
|
||||
{
|
||||
str8_lit_comp("default"),
|
||||
E_IRGEN_FUNCTION_NAME(default),
|
||||
};
|
||||
global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
|
||||
thread_static E_IRCtx *e_ir_ctx = 0;
|
||||
|
||||
@@ -189,6 +258,15 @@ internal void e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_Loo
|
||||
|
||||
internal E_LookupRule *e_lookup_rule_from_string(String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IR Gen Rules
|
||||
|
||||
internal E_IRGenRuleMap e_irgen_rule_map_make(Arena *arena, U64 slots_count);
|
||||
internal void e_irgen_rule_map_insert(Arena *arena, E_IRGenRuleMap *map, E_IRGenRule *rule);
|
||||
#define e_irgen_rule_map_insert_new(arena, map, name_, ...) e_irgen_rule_map_insert((arena), (map), &(E_IRGenRule){.name = (name_), __VA_ARGS__})
|
||||
|
||||
internal E_IRGenRule *e_irgen_rule_from_string(String8 string);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: IR-ization Functions
|
||||
|
||||
@@ -221,11 +299,10 @@ internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out,
|
||||
internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key);
|
||||
|
||||
//- rjf: top-level irtree/type extraction
|
||||
internal E_IRTreeAndType e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr *expr);
|
||||
internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr);
|
||||
|
||||
//- rjf: irtree -> linear ops/bytecode
|
||||
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out);
|
||||
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out);
|
||||
internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root);
|
||||
internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user