From 0705ba0a961ed210eab42d9b8839beef235b99eb Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 3 Apr 2025 16:36:59 -0700 Subject: [PATCH] begin plugging in view rules as formal call part of expression language --- src/eval/eval.mdesk | 4 +- src/eval/eval_bundles.c | 1 + src/eval/eval_bundles.h | 1 + src/eval/eval_core.h | 2 +- src/eval/eval_ir.c | 143 +++++++------ src/eval/generated/eval.meta.c | 8 +- src/eval/generated/eval.meta.h | 7 +- .../eval_visualization_core.c | 2 +- src/mule/mule_main.cpp | 6 +- src/raddbg/raddbg_core.c | 188 ++++++------------ src/raddbg/raddbg_main.c | 6 + src/raddbg/raddbg_views.c | 20 +- src/scratch/eval_scratch.c | 2 +- 13 files changed, 158 insertions(+), 232 deletions(-) diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 976f691b..ce6ce9a0 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -71,7 +71,7 @@ E_TypeKindTable: {IncompleteEnum "enum" 0 } {Bitfield "bitfield" 0 } {Variadic "variadic" 0 } - {Set "set" 0 } + {Stub "stub" 0 } } @table(name op_kind precedence op_pre op_sep op_pos) @@ -134,8 +134,6 @@ E_ExprKindTable: { Func Null 0 "" "" "" } { Define Binary 13 "" "=" "" } - - { Tag Null 0 "=>" "," "" } } @table(name display_string) diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index e14531e9..945a1b89 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -27,6 +27,7 @@ e_eval_from_exprs(Arena *arena, E_ExprChain exprs) .space = interp.space, .exprs = exprs, .irtree = irtree, + .bytecode = bytecode, .lookup_rule_tag = lookup, .code = interp.code, }; diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index 311a752e..f2ad6c85 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -14,6 +14,7 @@ struct E_Eval E_Space space; E_ExprChain exprs; E_IRTreeAndType irtree; + String8 bytecode; E_LookupRuleTagPair lookup_rule_tag; E_InterpretationCode code; E_MsgList msgs; diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index edbb5702..083b0435 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -535,7 +535,7 @@ struct E_LookupRuleTagPair //////////////////////////////// //~ 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_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr) #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); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 7f34255a..f93e27ad 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -69,11 +69,12 @@ e_select_ir_ctx(E_IRCtx *ctx) e_ir_state->arena_eval_start_pos = arena_pos(arena); } arena_pop_to(e_ir_state->arena, e_ir_state->arena_eval_start_pos); - if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; } - if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; } - if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; } - if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; } - if(ctx->macro_map == 0) {ctx->macro_map = &e_string2expr_map_nil;} + if(ctx->primary_module == 0) { ctx->primary_module = &e_module_nil; } + if(ctx->regs_map == 0) { ctx->regs_map = &e_string2num_map_nil; } + if(ctx->reg_alias_map == 0) { ctx->reg_alias_map = &e_string2num_map_nil; } + if(ctx->locals_map == 0) { ctx->locals_map = &e_string2num_map_nil; } + if(ctx->member_map == 0) { ctx->member_map = &e_string2num_map_nil; } + if(ctx->macro_map == 0) { ctx->macro_map = push_array(e_ir_state->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_ir_state->arena, 512); } e_ir_state->ctx = ctx; e_ir_state->thread_ip_procedure = rdi_procedure_from_voff(ctx->primary_module->rdi, ctx->thread_ip_voff); e_ir_state->used_tag_map = push_array(e_ir_state->arena, E_UsedTagMap, 1); @@ -88,6 +89,18 @@ e_select_ir_ctx(E_IRCtx *ctx) e_ir_state->string_id_map->id_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->id_slots_count); e_ir_state->string_id_map->hash_slots_count = 1024; e_ir_state->string_id_map->hash_slots = push_array(e_ir_state->arena, E_StringIDSlot, e_ir_state->string_id_map->hash_slots_count); + String8 builtin_view_rule_names[] = + { + str8_lit_comp("bswap"), + str8_lit_comp("array"), + }; + for EachElement(idx, builtin_view_rule_names) + { + E_Expr *expr = e_push_expr(e_ir_state->arena, E_ExprKind_LeafOffset, 0); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("view_rule")); + expr->value.u64 = e_id_from_string(builtin_view_rule_names[idx]); + e_string2expr_map_insert(e_ir_state->arena, ctx->macro_map, builtin_view_rule_names[idx], expr); + } } //////////////////////////////// @@ -179,7 +192,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(folder) String8 folder_name = accel->folders.v[idx - 0]; String8 folder_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", folder_name); expr = e_push_expr(arena, E_ExprKind_LeafValue, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder")); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("folder")); expr->space = e_space_make(E_SpaceKind_FileSystem); expr->value.u64 = e_id_from_string(folder_path); expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, folder_name)); @@ -189,7 +202,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(folder) String8 file_name = accel->files.v[idx - accel->folders.count]; String8 file_path = push_str8f(scratch.arena, "%S%s%S", accel->folder_path, accel->folder_path.size != 0 ? "/" : "", file_name); expr = e_push_expr(arena, E_ExprKind_LeafValue, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file")); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("file")); expr->space = e_space_make(E_SpaceKind_FileSystem); expr->value.u64 = e_id_from_string(file_path); expr_string = push_str8f(arena, "\"%S\"", escaped_from_raw_str8(scratch.arena, file_name)); @@ -866,7 +879,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) enum_type_key = lhs_type_key; do_enum_range = 1; } - else if(lhs_type_kind == E_TypeKind_Set) + else if(lhs_type_kind == E_TypeKind_Stub) { do_index_range = 1; } @@ -1177,15 +1190,6 @@ e_lookup_rule_from_string(String8 string) //////////////////////////////// //~ rjf: IR Gen Rules -E_IRGEN_FUNCTION_DEF(cast) -{ - E_Expr *type_expr = tag->first->next; - E_TypeKey type_key = e_type_from_expr(type_expr); - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); - E_IRTreeAndType result = {irtree.root, type_key, irtree.member, irtree.mode, irtree.msgs}; - return result; -} - E_IRGEN_FUNCTION_DEF(bswap) { E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); @@ -1197,60 +1201,20 @@ E_IRGEN_FUNCTION_DEF(bswap) E_IRGEN_FUNCTION_DEF(array) { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr); - E_TypeKey type_key = irtree.type_key; - E_TypeKind type_kind = e_type_kind_from_key(type_key); - if(e_type_kind_is_pointer_or_ref(type_kind)) - { - E_Value count_value = e_value_from_expr(tag->first->next); - E_TypeKey element_type_key = e_type_ptee_from_key(type_key); - E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0); - irtree.type_key = ptr_type_key; - } - return irtree; + E_Expr *ptr_expr = expr->first->next; + E_Expr *count_expr = ptr_expr->next; + E_IRTreeAndType result = e_irtree_and_type_from_expr(arena, ptr_expr); + E_TypeKey element_type_key = e_type_ptee_from_key(result.type_key); + E_Value count_value = e_value_from_expr(count_expr); + result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0); + return result; } -E_IRGEN_FUNCTION_DEF(wrap) +E_IRGEN_FUNCTION_DEF(view_rule_noop) { - Temp scratch = scratch_begin(&arena, 1); - E_Expr *expr_to_irify = expr; - E_Expr *wrap_expr_src = tag->first->next; - if(wrap_expr_src != &e_expr_nil) - { - expr_to_irify = e_expr_copy(scratch.arena, wrap_expr_src); - typedef struct Task Task; - struct Task - { - Task *next; - E_Expr *parent; - E_Expr *expr; - }; - Task start_task = {0, &e_expr_nil, expr_to_irify}; - Task *first_task = &start_task; - Task *last_task = first_task; - for(Task *t = first_task; t != 0; t = t->next) - { - if(t->expr->kind == E_ExprKind_LeafIdentifier && str8_match(t->expr->string, str8_lit("$expr"), 0)) - { - E_Expr *original_expr_ref = e_expr_ref(arena, expr); - if(t->parent != &e_expr_nil) - { - e_expr_insert_child(t->parent, t->expr, original_expr_ref); - e_expr_remove_child(t->parent, t->expr); - } - } - else for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next) - { - Task *task = push_array(scratch.arena, Task, 1); - SLLQueuePush(first_task, last_task, task); - task->parent = t->expr; - task->expr = child; - } - } - } - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr_to_irify); - scratch_end(scratch); - return irtree; + E_Expr *expr_arg = expr->first->next; + E_IRTreeAndType result = e_irtree_and_type_from_expr(arena, expr_arg); + return result; } internal E_IRGenRuleMap @@ -1260,10 +1224,8 @@ e_irgen_rule_map_make(Arena *arena, U64 slots_count) map.slots_count = slots_count; map.slots = push_array(arena, E_IRGenRuleSlot, map.slots_count); e_irgen_rule_map_insert_new(arena, &map, str8_lit("default"), .irgen = E_IRGEN_FUNCTION_NAME(default)); - e_irgen_rule_map_insert_new(arena, &map, str8_lit("cast"), .irgen = E_IRGEN_FUNCTION_NAME(cast)); e_irgen_rule_map_insert_new(arena, &map, str8_lit("bswap"), .irgen = E_IRGEN_FUNCTION_NAME(bswap)); e_irgen_rule_map_insert_new(arena, &map, str8_lit("array"), .irgen = E_IRGEN_FUNCTION_NAME(array)); - e_irgen_rule_map_insert_new(arena, &map, str8_lit("wrap"), .irgen = E_IRGEN_FUNCTION_NAME(wrap)); return map; } @@ -2458,6 +2420,37 @@ E_IRGEN_FUNCTION_DEF(default) } }break; + //- rjf: call + case E_ExprKind_Call: + { + E_Expr *lhs = expr->first; + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); + if(lhs_type->kind == E_TypeKind_Stub) + { + Temp scratch = scratch_begin(&arena, 1); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs_irtree.root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + E_Interpretation interp = e_interpret(bytecode); + String8 name = e_string_from_id(interp.value.u64); + E_IRGenRule *irgen_rule = e_irgen_rule_from_string(name); + if(irgen_rule != &e_irgen_rule__default) + { + result = irgen_rule->irgen(arena, expr); + } + else + { + e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "There is no rule named `%S`.", name); + } + scratch_end(scratch); + } + else + { + e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "Calling this type is not currently supported."); + } + }break; + //- rjf: leaf bytecode case E_ExprKind_LeafBytecode: { @@ -2970,7 +2963,7 @@ E_IRGEN_FUNCTION_DEF(default) { E_Space space = e_space_make(E_SpaceKind_FileSystem); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(file_path))); - result.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("file")); + result.type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("file")); result.mode = E_Mode_Value; } else @@ -2981,7 +2974,7 @@ E_IRGEN_FUNCTION_DEF(default) { E_Space space = e_space_make(E_SpaceKind_FileSystem); result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(folder_path))); - result.type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("folder")); + result.type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("folder")); result.mode = E_Mode_Value; } } @@ -3074,10 +3067,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: do this rule's generation ProfScope("irgen rule '%.*s'", str8_varg(t->rule->name)) { - result = t->rule->irgen(arena, expr, t->tag); + result = t->rule->irgen(arena, expr); if(result.root == &e_irnode_nil && t->rule != &e_irgen_rule__default) { - result = e_irgen_rule__default.irgen(arena, expr, &e_expr_nil); + result = e_irgen_rule__default.irgen(arena, expr); } } @@ -3419,7 +3412,7 @@ e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree) if(!default_is_forced && result.rule == &e_lookup_rule__default) { E_TypeKind type_kind = e_type_kind_from_key(irtree->type_key); - if(type_kind == E_TypeKind_Set) + if(type_kind == E_TypeKind_Stub) { E_Type *type = e_type_from_key__cached(irtree->type_key); String8 name = type->name; diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 14af0ad1..851d9687 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -71,7 +71,7 @@ str8_lit_comp("class"), str8_lit_comp("enum"), str8_lit_comp("bitfield"), str8_lit_comp("variadic"), -str8_lit_comp("set"), +str8_lit_comp("stub"), }; U8 e_type_kind_basic_byte_size_table[56] = @@ -134,7 +134,7 @@ U8 e_type_kind_basic_byte_size_table[56] = 0, }; -String8 e_expr_kind_strings[49] = +String8 e_expr_kind_strings[48] = { str8_lit_comp("Nil"), str8_lit_comp("Ref"), @@ -184,10 +184,9 @@ str8_lit_comp("Ptr"), str8_lit_comp("Array"), str8_lit_comp("Func"), str8_lit_comp("Define"), -str8_lit_comp("Tag"), }; -E_OpInfo e_expr_kind_op_info_table[49] = +E_OpInfo e_expr_kind_op_info_table[48] = { { E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, @@ -237,7 +236,6 @@ E_OpInfo e_expr_kind_op_info_table[49] = { E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") }, -{ E_OpKind_Null, 0, str8_lit_comp("=>"), str8_lit_comp(","), str8_lit_comp("") }, }; String8 e_interpretation_code_display_strings[11] = diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 5ccfe7e1..fb48f62d 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -74,7 +74,7 @@ E_TypeKind_IncompleteClass, E_TypeKind_IncompleteEnum, E_TypeKind_Bitfield, E_TypeKind_Variadic, -E_TypeKind_Set, +E_TypeKind_Stub, E_TypeKind_COUNT, E_TypeKind_FirstBasic = E_TypeKind_Void, E_TypeKind_LastBasic = E_TypeKind_ComplexF128, @@ -139,7 +139,6 @@ E_ExprKind_Ptr, E_ExprKind_Array, E_ExprKind_Func, E_ExprKind_Define, -E_ExprKind_Tag, E_ExprKind_COUNT, } E_ExprKindEnum; @@ -163,8 +162,8 @@ C_LINKAGE_BEGIN extern String8 e_token_kind_strings[6]; extern String8 e_type_kind_basic_string_table[56]; extern U8 e_type_kind_basic_byte_size_table[56]; -extern String8 e_expr_kind_strings[49]; -extern E_OpInfo e_expr_kind_op_info_table[49]; +extern String8 e_expr_kind_strings[48]; +extern E_OpInfo e_expr_kind_op_info_table[48]; extern String8 e_interpretation_code_display_strings[11]; C_LINKAGE_END diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 7ceb35c3..ae77d8de 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -94,7 +94,7 @@ ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode) kind == E_TypeKind_Union || kind == E_TypeKind_Class || kind == E_TypeKind_Array || - kind == E_TypeKind_Set || + kind == E_TypeKind_Stub || (kind == E_TypeKind_Enum && mode == E_Mode_Null)) { result = 1; diff --git a/src/mule/mule_main.cpp b/src/mule/mule_main.cpp index b7514dc4..3962a8db 100644 --- a/src/mule/mule_main.cpp +++ b/src/mule/mule_main.cpp @@ -106,7 +106,7 @@ void optimized_struct_parameters_eval_tests(void); #include #include -raddbg_auto_view_rule(std::vector, slice(_Mypair._Myval2)); +// raddbg_auto_view_rule(std::vector, slice(_Mypair._Myval2)); struct Basics{ char a; @@ -150,7 +150,7 @@ struct Dynamic_Array{ Pair *pairs; int count; }; -raddbg_auto_view_rule(Dynamic_Array, slice); +// raddbg_auto_view_rule(Dynamic_Array, slice); struct Struct_With_Embedded_Arrays{ int x; @@ -1620,7 +1620,7 @@ struct Bitmap int width; int height; }; -raddbg_auto_view_rule(Bitmap, bitmap(base, width, height)); +// raddbg_auto_view_rule(Bitmap, bitmap(base, width, height)); static unsigned int mule_bswap_u32(unsigned int x) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 158d288d..c84984e7 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -107,7 +107,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(watches) { E_Eval eval = e_eval_from_string(scratch.arena, expr); E_Type *type = e_type_from_key__cached(eval.irtree.type_key); - if(type->kind != E_TypeKind_Set) + if(type->kind != E_TypeKind_Stub) { passes_filter = 0; FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, expr); @@ -441,7 +441,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(schema) } else if(str8_match(child_schema->first->string, str8_lit("query"), 0)) { - child_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = child_schema->string); + child_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = child_schema->string); } //- rjf: evaluate @@ -4706,7 +4706,7 @@ rd_view_ui(Rng2F32 rect) E_IRTreeAndType block_irtree = e_irtree_and_type_from_expr(scratch.arena, selection_block->expr); E_TypeKey block_type_key = block_irtree.type_key; E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key); - if(block_type_kind == E_TypeKind_Set) + if(block_type_kind == E_TypeKind_Stub) { E_Type *block_type = e_type_from_key__cached(block_type_key); group_cfg_name = rd_singular_from_code_name_plural(block_type->name); @@ -10788,7 +10788,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f case E_TypeKind_IncompleteStruct: case E_TypeKind_IncompleteUnion: case E_TypeKind_IncompleteClass: - case E_TypeKind_Set: + case E_TypeKind_Stub: arrays_and_sets_and_structs: { // rjf: unpack @@ -13527,92 +13527,13 @@ rd_frame(void) ctx->auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1); ctx->auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512); - //- rjf: build special member types for evallable meta types - E_TypeKey bool_type_key = {0}; - E_TypeKey u64_type_key = {0}; - E_TypeKey vaddr_range_type_key = {0}; - E_TypeKey code_string_type_key = {0}; - E_TypeKey path_type_key = {0}; - E_TypeKey string_type_key = {0}; - E_TypeKey path_pt_type_key = {0}; - { - E_MemberList vaddr_range_members_list = {0}; - e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("min"), .off = 0); - e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("max"), .off = 8); - E_MemberArray vaddr_range_members = e_member_array_from_list(scratch.arena, &vaddr_range_members_list); - bool_type_key = e_type_key_basic(E_TypeKind_Bool); - u64_type_key = e_type_key_basic(E_TypeKind_U64); - vaddr_range_type_key = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit("vaddr_range"), .count = vaddr_range_members.count, .members = vaddr_range_members.v); - code_string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText); - path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText); - string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPlainText); - path_pt_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsPathText); - } - - //- rjf: build types for each evallable meta name - struct - { - String8 schema_type_name; - E_TypeKey type_key; - } - schema_type_name_key_map[] = - { - { str8_lit("bool"), bool_type_key }, - { str8_lit("u64"), u64_type_key }, - { str8_lit("vaddr_range"), vaddr_range_type_key }, - { str8_lit("code_string"), code_string_type_key }, - { str8_lit("path"), path_type_key }, - { str8_lit("string"), string_type_key }, - { str8_lit("path_pt"), path_pt_type_key }, - }; - E_TypeKey evallable_meta_types[ArrayCount(rd_name_schema_info_table)] = {0}; - for EachElement(idx, rd_name_schema_info_table) - { - String8 name = rd_name_schema_info_table[idx].name; - MD_Node *schema = rd_schema_from_name(name); - E_MemberList members_list = {0}; - U64 off = 0; - for MD_EachNode(child, schema->first) - { - if(str8_match(child->first->string, str8_lit("query"), 0)) - { - e_member_list_push_new(scratch.arena, &members_list, - .type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = child->string), - .name = child->string); - } - else - { - String8 member_name = child->string; - E_TypeKey member_type_key = zero_struct; - for EachElement(schema_type_name_idx, schema_type_name_key_map) - { - if(str8_match(child->first->string, schema_type_name_key_map[schema_type_name_idx].schema_type_name, 0)) - { - member_type_key = schema_type_name_key_map[schema_type_name_idx].type_key; - break; - } - } - e_member_list_push_new(scratch.arena, &members_list, - .type_key = member_type_key, - .name = member_name, - .off = off); - off += e_type_byte_size_from_key(member_type_key); - } - } - E_MemberArray members = e_member_array_from_list(scratch.arena, &members_list); - evallable_meta_types[idx] = e_type_key_cons(.name = name, - .kind = E_TypeKind_Set, - .members = members.v, - .count = members.count); - } - //- rjf: cache meta name -> type key correllation rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1); rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256); for EachElement(idx, rd_name_schema_info_table) { String8 name = rd_name_schema_info_table[idx].name; - E_TypeKey type_key = evallable_meta_types[idx]; + E_TypeKey type_key = e_type_key_cons(.name = name, .kind = E_TypeKind_Stub); e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key); e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name, .info = E_LOOKUP_INFO_FUNCTION_NAME(schema), @@ -13741,7 +13662,7 @@ rd_frame(void) { String8 collection_name = str8_lit("watches"); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .flags = E_TypeFlag_EditableChildren); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name, .flags = E_TypeFlag_EditableChildren); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, @@ -13783,7 +13704,7 @@ rd_frame(void) { String8 collection_name = collection_infos[idx].name; E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, .info = collection_infos[idx].lookup_info, @@ -13803,7 +13724,7 @@ rd_frame(void) { String8 name = debug_info_table_collection_names[idx]; E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = name); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name, @@ -13818,7 +13739,7 @@ rd_frame(void) { String8 cfg_name = evallable_cfg_names[cfg_name_idx]; String8 collection_name = rd_plural_from_code_name(cfg_name); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); @@ -13836,7 +13757,7 @@ rd_frame(void) { String8 kind_name = evallable_ctrl_names[ctrl_name_idx]; String8 collection_name = rd_plural_from_code_name(kind_name); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); @@ -13850,7 +13771,7 @@ rd_frame(void) //- rjf: add macro / lookup rules for unattached processes { String8 collection_name = str8_lit("unattached_processes"); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = collection_name); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity); @@ -13863,7 +13784,7 @@ rd_frame(void) //- rjf: add macro for commands { String8 name = str8_lit("commands"); - E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name); + E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = name); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); @@ -13950,6 +13871,53 @@ rd_frame(void) } e_select_ir_ctx(ir_ctx); + //////////////////////////// + //- rjf: generate macros for all view ui rules + // + { + //- rjf: choose set of view ui rules + // TODO(rjf): generate via metaprogram + struct + { + String8 name; + RD_ViewUIFunctionType *ui; + EV_ExpandRuleInfoHookFunctionType *expand; + } + view_ui_rule_table[] = + { + {str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)}, + {str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)}, + {str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)}, + {str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)}, + {str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox), 0}, + {str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)}, + {str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d), EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)}, + }; + + //- rjf: fill view ui rules in expand rule map, view ui rule map + EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1); + ev_select_expand_rule_table(expand_rule_table); + rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512); + { + for EachElement(idx, view_ui_rule_table) + { + e_irgen_rule_map_insert_new(scratch.arena, e_ir_state->ctx->irgen_rule_map, view_ui_rule_table[idx].name, E_IRGEN_FUNCTION_NAME(view_rule_noop)); + rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, view_ui_rule_table[idx].name, view_ui_rule_table[idx].ui); + if(view_ui_rule_table[idx].expand != 0) + { + ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, view_ui_rule_table[idx].name, view_ui_rule_table[idx].expand); + } + } + } + for EachElement(idx, view_ui_rule_table) + { + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Stub, .name = str8_lit("view_rule")); + expr->value.u64 = e_id_from_string(view_ui_rule_table[idx].name); + e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, view_ui_rule_table[idx].name, expr); + } + } + //////////////////////////// //- rjf: build eval interpretation context // @@ -13969,44 +13937,6 @@ rd_frame(void) } e_select_interpret_ctx(interpret_ctx, eval_modules_primary->rdi, rip_voff); - //////////////////////////// - //- rjf: build eval expand rule table - // - EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1); - ev_select_expand_rule_table(expand_rule_table); - - //////////////////////////// - //- rjf: build view ui rule map - // - rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512); - { - // TODO(rjf): generate via metaprogram - struct - { - String8 name; - RD_ViewUIFunctionType *ui; - EV_ExpandRuleInfoHookFunctionType *expand; - } - table[] = - { - {str8_lit("text"), RD_VIEW_UI_FUNCTION_NAME(text), EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)}, - {str8_lit("disasm"), RD_VIEW_UI_FUNCTION_NAME(disasm), EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)}, - {str8_lit("memory"), RD_VIEW_UI_FUNCTION_NAME(memory), EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)}, - {str8_lit("bitmap"), RD_VIEW_UI_FUNCTION_NAME(bitmap), EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)}, - {str8_lit("checkbox"), RD_VIEW_UI_FUNCTION_NAME(checkbox), 0}, - {str8_lit("color_rgba"), RD_VIEW_UI_FUNCTION_NAME(color_rgba), EV_EXPAND_RULE_INFO_FUNCTION_NAME(color_rgba)}, - {str8_lit("geo3d"), RD_VIEW_UI_FUNCTION_NAME(geo3d), EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)}, - }; - for EachElement(idx, table) - { - rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, table[idx].name, table[idx].ui); - if(table[idx].expand != 0) - { - ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, table[idx].name, table[idx].expand); - } - } - } - //////////////////////////// //- rjf: autosave if needed // diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index a127444a..48865106 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -89,6 +89,12 @@ //////////////////////////////// //~ rjf: feature cleanup, code dedup, code elimination pass: // +// [ ] 'view rules' need to be rephrased as "function" calls in the expression language +// [ ] need a formalization which takes unknown identifiers which are called, and tries +// to use that to apply a IR-generation rule, which is keyed by that unknown +// identifier +// [ ] *ALL* expressions in watch windows need to be editable. +// // [ ] config hot-reloading, using cfg wins // [ ] undo/redo, using cfg wins // [ ] back/forward, using cfg wins diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0b33bad5..1c2b2803 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1002,21 +1002,21 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } // rjf: determine ctrl entity - if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || - block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)) + if(block_type_kind == E_TypeKind_Stub && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || + block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)) { info.group_entity = rd_ctrl_entity_from_eval_space(info.eval.space); } // rjf: determine cfg group name / parent - if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || - block_eval.space.kind == RD_EvalSpaceKind_MetaCfg)) + if(block_type_kind == E_TypeKind_Stub && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery || + block_eval.space.kind == RD_EvalSpaceKind_MetaCfg)) { info.group_cfg_parent = rd_cfg_from_eval_space(block_eval.space); } // rjf: determine group cfg name - if(block_type_kind == E_TypeKind_Set) + if(block_type_kind == E_TypeKind_Stub) { String8 singular_name = rd_singular_from_code_name_plural(block_type->name); if(singular_name.size != 0) @@ -1070,7 +1070,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) else if(info.eval.space.kind == E_SpaceKind_FileSystem) { E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key); - if(type->kind == E_TypeKind_Set) + if(type->kind == E_TypeKind_Stub) { String8 file_path = e_string_from_id(info.eval.value.u64); DR_FStrList fstrs = rd_title_fstrs_from_file_path(arena, file_path); @@ -1226,7 +1226,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCmd) { E_Type *type = e_type_from_key__cached(info.eval.irtree.type_key); - if(type->kind == E_TypeKind_Set) + if(type->kind == E_TypeKind_Stub) { rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = 0, .pct = 1.f); } @@ -1282,7 +1282,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } // rjf: procedures collections get only expr/value/view-rule - else if(block_type->kind == E_TypeKind_Set && str8_match(block_type->name, str8_lit("procedures"), 0)) + else if(block_type->kind == E_TypeKind_Stub && str8_match(block_type->name, str8_lit("procedures"), 0)) { info.cell_style_key = str8_lit("expr_value_viewrule"); RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); @@ -1565,7 +1565,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla else if(result.eval.space.kind == E_SpaceKind_FileSystem) { E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key); - if(type->kind == E_TypeKind_Set) + if(type->kind == E_TypeKind_Stub) { String8 file_path = e_string_from_id(result.eval.value.u64); result.fstrs = rd_title_fstrs_from_file_path(arena, file_path); @@ -1633,7 +1633,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla else if(result.eval.space.kind == E_SpaceKind_FileSystem) { E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key); - if(type->kind == E_TypeKind_Set) + if(type->kind == E_TypeKind_Stub) { String8 file_path = e_string_from_id(result.eval.value.u64); result.fstrs = rd_title_fstrs_from_file_path(arena, file_path); diff --git a/src/scratch/eval_scratch.c b/src/scratch/eval_scratch.c index b83d0d1c..24246e6f 100644 --- a/src/scratch/eval_scratch.c +++ b/src/scratch/eval_scratch.c @@ -60,7 +60,7 @@ entry_point(CmdLine *cmdline) } //- rjf: parse - E_Parse parse = e_parse_expr_from_text_tokens(arena, expr_text, &tokens); + E_Parse parse = e_parse_expr_from_text_tokens(arena, expr_text, tokens); { typedef struct Task Task; struct Task