diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk index abc3401d..98a97412 100644 --- a/src/ctrl/ctrl.mdesk +++ b/src/ctrl/ctrl.mdesk @@ -4,17 +4,17 @@ //////////////////////////////// //~ rjf: Entity Kinds -@table(name display_string) +@table(name code_name display_string) CTRL_EntityKindTable: { - {Root "Root" } - {Machine "Machine" } - {Process "Process" } - {Thread "Thread" } - {Module "Module" } - {EntryPoint "Entry Point" } - {DebugInfoPath "Debug Info Path" } - {PendingThreadName "Pending Thread Name" } + {Root root "Root" } + {Machine machine "Machine" } + {Process process "Process" } + {Thread thread "Thread" } + {Module module "Module" } + {EntryPoint entry_point "Entry Point" } + {DebugInfoPath debug_info_path "Debug Info Path" } + {PendingThreadName pending_thread_name "Pending Thread Name" } } @enum CTRL_EntityKind: @@ -24,6 +24,12 @@ CTRL_EntityKindTable: COUNT, } +@data(String8) ctrl_entity_kind_code_name_table: +{ + `{0}`, + @expand(CTRL_EntityKindTable a) `str8_lit_comp("$(a.code_name)")` +} + @data(String8) ctrl_entity_kind_display_string_table: { `{0}`, diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 41012033..4d285810 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -91,6 +91,21 @@ ctrl_string_from_msg_kind(CTRL_MsgKind kind) return result; } +internal CTRL_EntityKind +ctrl_entity_kind_from_string(String8 string) +{ + CTRL_EntityKind result = CTRL_EntityKind_Null; + for EachNonZeroEnumVal(CTRL_EntityKind, k) + { + if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0)) + { + result = k; + break; + } + } + return result; +} + //////////////////////////////// //~ rjf: Machine/Handle Pair Type Functions diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 3540e87f..73e0d3eb 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -951,6 +951,7 @@ internal U64 ctrl_hash_from_handle(CTRL_Handle handle); internal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind); internal String8 ctrl_string_from_event_kind(CTRL_EventKind kind); internal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind); +internal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string); //////////////////////////////// //~ rjf: Handle Type Functions diff --git a/src/ctrl/generated/ctrl.meta.c b/src/ctrl/generated/ctrl.meta.c index 019fde09..4b45ed27 100644 --- a/src/ctrl/generated/ctrl.meta.c +++ b/src/ctrl/generated/ctrl.meta.c @@ -4,6 +4,19 @@ //- GENERATED CODE C_LINKAGE_BEGIN +String8 ctrl_entity_kind_code_name_table[9] = +{ +{0}, +str8_lit_comp("root"), +str8_lit_comp("machine"), +str8_lit_comp("process"), +str8_lit_comp("thread"), +str8_lit_comp("module"), +str8_lit_comp("entry_point"), +str8_lit_comp("debug_info_path"), +str8_lit_comp("pending_thread_name"), +}; + String8 ctrl_entity_kind_display_string_table[9] = { {0}, diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h index 9192b4de..8c5e9a3a 100644 --- a/src/ctrl/generated/ctrl.meta.h +++ b/src/ctrl/generated/ctrl.meta.h @@ -64,6 +64,7 @@ CTRL_ExceptionCodeKind_COUNT, } CTRL_ExceptionCodeKind; C_LINKAGE_BEGIN +extern String8 ctrl_entity_kind_code_name_table[9]; extern String8 ctrl_entity_kind_display_string_table[9]; extern U32 ctrl_exception_code_kind_code_table[38]; extern String8 ctrl_exception_code_kind_display_string_table[38]; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 1e481db7..55610b1a 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -90,6 +90,11 @@ e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_LookupRule *rule) E_LookupRuleNode *n = push_array(arena, E_LookupRuleNode, 1); SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n); MemoryCopyStruct(&n->v, rule); + if(n->v.info == 0) { n->v.info = E_LOOKUP_INFO_FUNCTION_NAME(default); } + if(n->v.access == 0) { n->v.access = E_LOOKUP_ACCESS_FUNCTION_NAME(default); } + if(n->v.range == 0) { n->v.range = E_LOOKUP_RANGE_FUNCTION_NAME(default); } + if(n->v.id_from_num == 0){ n->v.id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default); } + if(n->v.num_from_id == 0){ n->v.num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(default); } n->v.name = push_str8_copy(arena, n->v.name); } @@ -155,9 +160,18 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) return lookup_info; } -E_LOOKUP_FUNCTION_DEF(default) +E_LOOKUP_ACCESS_FUNCTION_DEF(default) { - E_Lookup lookup = {{&e_irnode_nil}}; + // + // TODO(rjf): need to define what it means to access a set expression + // whose type *does not* define its IR generation rules, BUT it does + // define specific child expressions. so e.g. `watches`, does not + // define `watches[0]`, because it has defined that `watches[0]` + // maps to another expression, which is whatever the first watch + // expression is (e.g. `basics`). so, in that case, we can just use + // the lookup-range rule, grab the Nth expression, and IR-ify *that*. + // + E_LookupAccess result = {{&e_irnode_nil}}; switch(kind) { default:{}break; @@ -180,7 +194,7 @@ E_LOOKUP_FUNCTION_DEF(default) check_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_restype))); check_type_kind = e_type_kind_from_key(check_type_key); } - e_msg_list_concat_in_place(&lookup.irtree_and_type.msgs, &l.msgs); + e_msg_list_concat_in_place(&result.irtree_and_type.msgs, &l.msgs); // rjf: look up member B32 r_found = 0; @@ -234,12 +248,12 @@ E_LOOKUP_FUNCTION_DEF(default) } else if(exprr->kind != E_ExprKind_LeafMember) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Expected member name."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Expected member name."); break; } else if(!r_found) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named `%S`.", exprr->string); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named `%S`.", exprr->string); break; } else if(check_type_kind != E_TypeKind_Struct && @@ -247,7 +261,7 @@ E_LOOKUP_FUNCTION_DEF(default) check_type_kind != E_TypeKind_Union && check_type_kind != E_TypeKind_Enum) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); break; } @@ -275,9 +289,9 @@ E_LOOKUP_FUNCTION_DEF(default) } // rjf: fill - lookup.irtree_and_type.root = new_tree; - lookup.irtree_and_type.type_key = r_type; - lookup.irtree_and_type.mode = mode; + result.irtree_and_type.root = new_tree; + result.irtree_and_type.type_key = r_type; + result.irtree_and_type.mode = mode; } }break; @@ -302,8 +316,8 @@ E_LOOKUP_FUNCTION_DEF(default) direct_type = e_type_direct_from_key(direct_type); direct_type = e_type_unwrap(direct_type); U64 direct_type_size = e_type_byte_size_from_key(direct_type); - e_msg_list_concat_in_place(&lookup.irtree_and_type.msgs, &l.msgs); - e_msg_list_concat_in_place(&lookup.irtree_and_type.msgs, &r.msgs); + e_msg_list_concat_in_place(&result.irtree_and_type.msgs, &l.msgs); + e_msg_list_concat_in_place(&result.irtree_and_type.msgs, &r.msgs); // rjf: bad conditions? -> error if applicable, exit if(r.root->op == 0) @@ -312,22 +326,22 @@ E_LOOKUP_FUNCTION_DEF(default) } else if(l_restype_kind != E_TypeKind_Ptr && l_restype_kind != E_TypeKind_Array) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot index into this type."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot index into this type."); break; } else if(!e_type_kind_is_integer(r_restype_kind)) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index with this type."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index with this type."); break; } else if(l_restype_kind == E_TypeKind_Ptr && direct_type_size == 0) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); break; } else if(l_restype_kind == E_TypeKind_Array && direct_type_size == 0) { - e_msgf(arena, &lookup.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into arrays of zero-sized types."); + e_msgf(arena, &result.irtree_and_type.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into arrays of zero-sized types."); break; } @@ -381,12 +395,64 @@ E_LOOKUP_FUNCTION_DEF(default) } // rjf: fill - lookup.irtree_and_type.root = new_tree; - lookup.irtree_and_type.type_key = direct_type; - lookup.irtree_and_type.mode = l.mode; + result.irtree_and_type.root = new_tree; + result.irtree_and_type.type_key = direct_type; + result.irtree_and_type.mode = l.mode; }break; } - return lookup; + return result; +} + +E_LOOKUP_RANGE_FUNCTION_DEF(default) +{ + E_LookupRange result = {0}; + Temp scratch = scratch_begin(&arena, 1); + { + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key); + if(lhs_type_kind == E_TypeKind_Struct || + lhs_type_kind == E_TypeKind_Union || + lhs_type_kind == E_TypeKind_Class || + lhs_type_kind == E_TypeKind_Enum) + { + E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); + Rng1U64 legal_idx_range = r1u64(0, lhs_type->count); + Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); + U64 read_range_count = dim_1u64(read_range); + result.exprs_count = read_range_count; + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + for(U64 idx = 0; idx < result.exprs_count; idx += 1) + { + U64 member_idx = idx + read_range.min; + String8 member_name = (lhs_type->members ? lhs_type->members[member_idx].name : + lhs_type->enum_vals ? lhs_type->enum_vals[member_idx].name : str8_lit("")); + result.exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name); + } + } + else if(lhs_type_kind == E_TypeKind_Set) + { + result.exprs_count = dim_1u64(idx_range); + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + result.exprs_strings = push_array(arena, String8, result.exprs_count); + for(U64 idx = 0; idx < result.exprs_count; idx += 1) + { + result.exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx); + } + } + } + scratch_end(scratch); + return result; +} + +E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default) +{ + return num; +} + +E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(default) +{ + return id; } //////////////////////////////// @@ -716,9 +782,9 @@ e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr } E_Expr *rhs = lhs->next; E_LookupRule *lookup_rule = e_lookup_rule_from_string(lookup_rule_name); - E_LookupInfo lookup_info = lookup_rule->lookup_info(arena, lhs); - E_Lookup lookup = lookup_rule->lookup(arena, expr->kind, lhs, rhs, lookup_info.user_data); - result = lookup.irtree_and_type; + E_LookupInfo lookup_info = lookup_rule->info(arena, lhs, str8_zero()); + E_LookupAccess lookup_access = lookup_rule->access(arena, expr->kind, lhs, rhs, lookup_info.user_data); + result = lookup_access.irtree_and_type; scratch_end(scratch); }break; diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index dca8931c..eef75238 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -66,31 +66,60 @@ struct E_LookupInfo U64 idxed_expr_count; }; -typedef struct E_Lookup E_Lookup; -struct E_Lookup +typedef struct E_LookupAccess E_LookupAccess; +struct E_LookupAccess { E_IRTreeAndType irtree_and_type; }; -#define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_Expr *lhs) +typedef struct E_LookupRange E_LookupRange; +struct E_LookupRange +{ + U64 exprs_count; + E_Expr **exprs; + String8 *exprs_strings; +}; + +#define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_Expr *lhs, String8 filter) #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); -#define E_LOOKUP_FUNCTION_SIG(name) E_Lookup name(Arena *arena, E_ExprKind kind, E_Expr *lhs, E_Expr *rhs, void *user_data) -#define E_LOOKUP_FUNCTION_NAME(name) e_lookup_##name -#define E_LOOKUP_FUNCTION_DEF(name) internal E_LOOKUP_FUNCTION_SIG(E_LOOKUP_FUNCTION_NAME(name)) -typedef E_LOOKUP_FUNCTION_SIG(E_LookupFunctionType); +#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); + +#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); + +#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); + +#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_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; struct E_LookupRule { String8 name; - E_LookupInfoFunctionType *lookup_info; - E_LookupFunctionType *lookup; + E_LookupInfoFunctionType *info; + E_LookupAccessFunctionType *access; + E_LookupRangeFunctionType *range; + E_LookupIDFromNumFunctionType *id_from_num; + E_LookupNumFromIDFunctionType *num_from_id; }; typedef struct E_LookupRuleNode E_LookupRuleNode; @@ -131,7 +160,10 @@ local_persist read_only E_LookupRule e_lookup_rule__default = { str8_lit_comp("default"), E_LOOKUP_INFO_FUNCTION_NAME(default), - E_LOOKUP_FUNCTION_NAME(default), + E_LOOKUP_ACCESS_FUNCTION_NAME(default), + E_LOOKUP_RANGE_FUNCTION_NAME(default), + E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default), + E_LOOKUP_NUM_FROM_ID_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; @@ -153,11 +185,9 @@ internal void e_select_ir_ctx(E_IRCtx *ctx); internal E_LookupRuleMap e_lookup_rule_map_make(Arena *arena, U64 slots_count); internal void e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_LookupRule *rule); -#define e_lookup_rule_map_insert_new(arena, map, name_, lookup_info_, lookup_) e_lookup_rule_map_insert((arena), (map), &(E_LookupRule){.name = (name_), .lookup_info = (lookup_info_), .lookup = (lookup_)}) +#define e_lookup_rule_map_insert_new(arena, map, name_, ...) e_lookup_rule_map_insert((arena), (map), &(E_LookupRule){.name = (name_), __VA_ARGS__}) internal E_LookupRule *e_lookup_rule_from_string(String8 string); -E_LOOKUP_INFO_FUNCTION_DEF(default); -E_LOOKUP_FUNCTION_DEF(default); //////////////////////////////// //~ rjf: IR-ization Functions diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index ec47d860..981581ee 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1864,6 +1864,43 @@ e_type_key_list_copy(Arena *arena, E_TypeKeyList *src) return dst; } +internal E_String2TypeKeyMap +e_string2typekey_map_make(Arena *arena, U64 slots_count) +{ + E_String2TypeKeyMap map = {0}; + map.slots_count = slots_count; + map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count); + return map; +} + +internal void +e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key) +{ + E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1); + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n); + n->string = push_str8_copy(arena, string); + n->key = key; +} + +internal E_TypeKey +e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string) +{ + E_TypeKey key = zero_struct; + U64 hash = e_hash_from_string(5381, string); + U64 slot_idx = hash%map->slots_count; + for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next) + { + if(str8_match(n->string, string, 0)) + { + key = n->key; + break; + } + } + return key; +} + //////////////////////////////// //~ rjf: Cache Lookups diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index 9009c04c..a8cbd1b1 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -137,6 +137,31 @@ struct E_Type E_EnumVal *enum_vals; }; +//////////////////////////////// +//~ rjf: String -> Type Key Map Data Structure + +typedef struct E_String2TypeKeyNode E_String2TypeKeyNode; +struct E_String2TypeKeyNode +{ + E_String2TypeKeyNode *next; + String8 string; + E_TypeKey key; +}; + +typedef struct E_String2TypeKeySlot E_String2TypeKeySlot; +struct E_String2TypeKeySlot +{ + E_String2TypeKeyNode *first; + E_String2TypeKeyNode *last; +}; + +typedef struct E_String2TypeKeyMap E_String2TypeKeyMap; +struct E_String2TypeKeyMap +{ + U64 slots_count; + E_String2TypeKeySlot *slots; +}; + //////////////////////////////// //~ rjf: Evaluation Context @@ -323,6 +348,9 @@ internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key); //- rjf: type key data structures internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key); internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); +internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count); +internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key); +internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string); //////////////////////////////// //~ rjf: Cache Lookups diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 250ecd81..d05dea15 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -183,7 +183,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) { E_Type *type = e_type_from_key(scratch.arena, type_key); E_LookupRule *rule = e_lookup_rule_from_string(type->name); - E_LookupInfo lookup_info = rule->lookup_info(arena, expr); + E_LookupInfo lookup_info = rule->info(arena, expr, filter); total_row_count = Max(lookup_info.named_expr_count, lookup_info.idxed_expr_count); accel->lookup_rule = rule; accel->lookup_user_data = lookup_info.user_data; @@ -282,15 +282,15 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default) //- rjf: fill with lookups // else if(accel->lookup_rule != 0) - { - result.row_exprs_count = needed_row_count; - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); + { + E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data); + result.row_exprs_count = lookup_range.exprs_count; + result.row_exprs = lookup_range.exprs; + result.row_strings = lookup_range.exprs_strings; result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); + result.row_members = push_array(arena, E_Member *, result.row_exprs_count); for EachIndex(row_expr_idx, result.row_exprs_count) { - result.row_exprs[row_expr_idx] = e_expr_ref_array_index(arena, expr, idx_range.min + row_expr_idx); result.row_members[row_expr_idx] = &e_member_nil; } } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 04e89d6d..9b0ad608 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -28,7 +28,7 @@ RD_CmdKind_Null, RD_CmdKind_Null, }; -RD_VocabularyInfo rd_vocabulary_info_table[41] = +RD_VocabularyInfo rd_vocabulary_info_table[45] = { {str8_lit_comp("auto_view_rule"), str8_lit_comp("auto_view_rules"), str8_lit_comp("Auto View Rule"), str8_lit_comp("Auto View Rules"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -71,9 +71,13 @@ RD_VocabularyInfo rd_vocabulary_info_table[41] = {str8_lit_comp("vtx"), str8_lit_comp("vtxs"), str8_lit_comp("Vertex Buffer"), str8_lit_comp("Vertex Buffers"), RD_IconKind_Null}, {str8_lit_comp("vtx_size"), str8_lit_comp("vtx_sizes"), str8_lit_comp("Vertex Buffer Size"), str8_lit_comp("Vertex Buffer Sizes"), RD_IconKind_Null}, {str8_lit_comp("label"), str8_lit_comp("labels"), str8_lit_comp("Label"), str8_lit_comp("Labels"), RD_IconKind_Null}, +{str8_lit_comp("thread"), str8_lit_comp("threads"), str8_lit_comp("Thread"), str8_lit_comp("Threads"), RD_IconKind_Thread}, +{str8_lit_comp("process"), str8_lit_comp("processes"), str8_lit_comp("Process"), str8_lit_comp("Processes"), RD_IconKind_Threads}, +{str8_lit_comp("machine"), str8_lit_comp("machines"), str8_lit_comp("Machine"), str8_lit_comp("Machines"), RD_IconKind_Machine}, +{str8_lit_comp("module"), str8_lit_comp("modules"), str8_lit_comp("Module"), str8_lit_comp("Modules"), RD_IconKind_Module}, }; -RD_CfgNameSchemaPair rd_cfg_name_schema_pair_table[6] = +RD_NameSchemaInfo rd_name_schema_info_table[10] = { {str8_lit_comp("settings"), str8_lit_comp("x:\n{\n @default(1) 'hover_animations': bool,\n @default(1) 'press_animations': bool,\n @default(0) 'focus_animations': bool,\n @default(1) 'tooltip_animations': bool,\n @default(1) 'menu_animations': bool,\n @default(1) 'scrolling_animations': bool,\n @default(1) 'background_blur': bool,\n @default(1) 'thread_lines': bool,\n @default(1) 'breakpoint_lines': bool,\n @default(1) 'thread_glow': bool,\n @default(1) 'breakpoint_glow': bool,\n @default(0) 'opaque_backgrounds': bool,\n @default(1) 'smooth_main_text': bool,\n @default(0) 'smooth_code_text': bool,\n @default(1) 'hint_main_text': bool,\n @default(1) 'hint_code_text': bool,\n @default(2) 'tab_width': @range[1, 32] u64,\n @can_be_per_window 'main_font_size': @range[6, 72] u64,\n @can_be_per_window 'code_font_size': @range[1, 32] u64,\n}\n"), str8_lit_comp("")}, {str8_lit_comp("target"), str8_lit_comp("x:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': code_string,\n 'stdout_path': path,\n 'stderr_path': path,\n 'stdin_path': path,\n 'debug_subprocesses': bool,\n}\n"), str8_lit_comp("launch_and_run,launch_and_init,select_cfg,remove_cfg")}, @@ -81,6 +85,10 @@ RD_CfgNameSchemaPair rd_cfg_name_schema_pair_table[6] = {str8_lit_comp("watch_pin"), str8_lit_comp("x:\n{\n 'expression': code_string,\n 'view_rule': code_string,\n 'location': location,\n}\n"), str8_lit_comp("remove_cfg")}, {str8_lit_comp("file_path_map"), str8_lit_comp("x:{'source':path, 'dest':path}"), str8_lit_comp("remove_cfg")}, {str8_lit_comp("auto_view_rule"), str8_lit_comp("x:{'source':code_string, 'dest':code_string}"), str8_lit_comp("remove_cfg")}, +{str8_lit_comp("machine"), str8_lit_comp("x:{'frozen':bool, 'label':code_string}"), str8_lit_comp("")}, +{str8_lit_comp("process"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")}, +{str8_lit_comp("module"), str8_lit_comp("x:{'label':code_string, 'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}"), str8_lit_comp("")}, +{str8_lit_comp("thread"), str8_lit_comp("x:{'frozen':bool, 'label':code_string, 'id':u64}"), str8_lit_comp("")}, }; String8 d_entity_kind_display_string_table[27] = @@ -711,116 +719,46 @@ str8_lit_comp("5"), str8_lit_comp("c"), }; -String8 rd_collection_name_table[12] = +String8 rd_collection_name_table[2] = { -str8_lit_comp("machines"), -str8_lit_comp("processes"), -str8_lit_comp("threads"), -str8_lit_comp("modules"), str8_lit_comp("scheduler_machine"), str8_lit_comp("scheduler_process"), -str8_lit_comp("locals"), -str8_lit_comp("registers"), -str8_lit_comp("globals"), -str8_lit_comp("thread_locals"), -str8_lit_comp("types"), -str8_lit_comp("procedures"), }; -RD_EntityKind rd_collection_entity_kind_table[12] = +RD_EntityKind rd_collection_entity_kind_table[2] = { RD_EntityKind_Nil, RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, -RD_EntityKind_Nil, }; -CTRL_EntityKind rd_collection_ctrl_entity_kind_table[12] = +CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2] = { -CTRL_EntityKind_Machine, -CTRL_EntityKind_Process, -CTRL_EntityKind_Thread, -CTRL_EntityKind_Module, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, CTRL_EntityKind_Null, CTRL_EntityKind_Null, }; -EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[12] = +EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2] = { -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(machines), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(processes), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(threads), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(modules), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_machine), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(scheduler_process), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(locals), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(registers), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(globals), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(thread_locals), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(types), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[12] = +EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2] = { -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(machines), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(processes), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(threads), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(modules), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_machine), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(scheduler_process), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(locals), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(registers), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(globals), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(thread_locals), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(types), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[12] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2] = { -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(machines), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(processes), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(modules), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_machine), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(scheduler_process), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(globals), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(thread_locals), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(types), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[12] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2] = { -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(machines), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(processes), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(modules), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_machine), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(scheduler_process), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(globals), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(thread_locals), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(types), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(procedures), }; RD_ViewRuleInfo rd_view_rule_kind_info_table[28] = diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 71b1ae02..9e88a8d8 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -522,8 +522,8 @@ String8 display_name_plural; RD_IconKind icon_kind; }; -typedef struct RD_CfgNameSchemaPair RD_CfgNameSchemaPair; -struct RD_CfgNameSchemaPair +typedef struct RD_NameSchemaInfo RD_NameSchemaInfo; +struct RD_NameSchemaInfo { String8 name; String8 schema; @@ -651,50 +651,14 @@ RD_ViewRuleUIFunctionType *ui; .params_tree = rd_regs()->params_tree,\ .os_event = rd_regs()->os_event,\ -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(modules); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(locals); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(globals); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(thread_locals); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(types); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(procedures); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(modules); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_machine); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(globals); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(thread_locals); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(types); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_machine); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(globals); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_machine); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(globals); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(thread_locals); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(types); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(procedures); RD_VIEW_RULE_UI_FUNCTION_DEF(null); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(text); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(disasm); @@ -733,8 +697,8 @@ C_LINKAGE_BEGIN extern String8 rd_cfg_src_string_table[4]; extern RD_CmdKind rd_cfg_src_load_cmd_kind_table[4]; extern RD_CmdKind rd_cfg_src_write_cmd_kind_table[4]; -extern RD_VocabularyInfo rd_vocabulary_info_table[41]; -extern RD_CfgNameSchemaPair rd_cfg_name_schema_pair_table[6]; +extern RD_VocabularyInfo rd_vocabulary_info_table[45]; +extern RD_NameSchemaInfo rd_name_schema_info_table[10]; extern String8 d_entity_kind_display_string_table[27]; extern String8 d_entity_kind_name_lower_table[27]; extern String8 d_entity_kind_name_lower_plural_table[27]; @@ -745,13 +709,13 @@ extern RD_StringBindingPair rd_default_binding_table[111]; extern String8 rd_binding_version_remap_old_name_table[8]; extern String8 rd_binding_version_remap_new_name_table[8]; extern String8 rd_icon_kind_text_table[69]; -extern String8 rd_collection_name_table[12]; -extern RD_EntityKind rd_collection_entity_kind_table[12]; -extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[12]; -extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[12]; -extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[12]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[12]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[12]; +extern String8 rd_collection_name_table[2]; +extern RD_EntityKind rd_collection_entity_kind_table[2]; +extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[2]; +extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[2]; +extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[2]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[2]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[2]; extern RD_ViewRuleInfo rd_view_rule_kind_info_table[28]; extern RD_IconKind rd_entity_kind_icon_kind_table[27]; extern String8 rd_theme_preset_display_string_table[9]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 2d5b5c90..16859833 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -92,6 +92,10 @@ RD_VocabularyMap: {vtx _ "Vertex Buffer" _ Null } {vtx_size _ "Vertex Buffer Size" _ Null } {label _ "Label" _ Null } + {thread _ "Thread" _ Thread } + {process processes "Process" "Processes" Threads } + {machine _ "Machine" _ Machine } + {module _ "Module" _ Module } } @struct RD_VocabularyInfo: @@ -109,9 +113,9 @@ RD_VocabularyMap: } //////////////////////////////// -//~ rjf: Configuration Tree Schemas +//~ rjf: Schemas -@table(name schema cmd_names) RD_CfgSchemaTable: +@table(name schema cmd_names) RD_SchemaTable: { //- rjf: settings { @@ -201,18 +205,42 @@ RD_VocabularyMap: ```x:{'source':code_string, 'dest':code_string}```, `remove_cfg`, } + + //- rjf: machines + { + machine, + ```x:{'frozen':bool, 'label':code_string}```, + } + + //- rjf: processes + { + process, + ```x:{'frozen':bool, 'label':code_string, 'id':u64}```, + } + + //- rjf: modules + { + module, + ```x:{'label':code_string, 'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```, + } + + //- rjf: threads + { + thread, + ```x:{'frozen':bool, 'label':code_string, 'id':u64}```, + } } -@struct RD_CfgNameSchemaPair: +@struct RD_NameSchemaInfo: { `String8 name`; `String8 schema`; `String8 cmd_names`; } -@data(RD_CfgNameSchemaPair) rd_cfg_name_schema_pair_table: +@data(RD_NameSchemaInfo) rd_name_schema_info_table: { - @expand(RD_CfgSchemaTable a) `{str8_lit_comp("$(a.name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.cmd_names)")}` + @expand(RD_SchemaTable a) `{str8_lit_comp("$(a.name)"), str8_lit_comp("$(a.schema)"), str8_lit_comp("$(a.cmd_names)")}` } //////////////////////////////// @@ -1002,22 +1030,22 @@ RD_CollectionTable: //{auto_view_rules AutoViewRule Null x} //- rjf: control entity groups - {machines Nil Machine x} - {processes Nil Process x} - {threads Nil Thread x} - {modules Nil Module x} + //{machines Nil Machine x} + //{processes Nil Process x} + //{threads Nil Thread x} + //{modules Nil Module x} //- rjf: scheduling control entity hierarchies {scheduler_machine Nil Null x} {scheduler_process Nil Null x} //- rjf: debug info / architecture watch tables - {locals Nil Null -} - {registers Nil Null -} - {globals Nil Null x} - {thread_locals Nil Null x} - {types Nil Null x} - {procedures Nil Null x} + // {locals Nil Null -} + // {registers Nil Null -} + // {globals Nil Null x} + // {thread_locals Nil Null x} + // {types Nil Null x} + // {procedures Nil Null x} } @gen diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 02c80c50..b92cc98f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1497,11 +1497,11 @@ internal MD_Node * rd_schema_from_name(Arena *arena, String8 name) { String8 schema_string = {0}; - for EachElement(idx, rd_cfg_name_schema_pair_table) + for EachElement(idx, rd_name_schema_info_table) { - if(str8_match(name, rd_cfg_name_schema_pair_table[idx].name, 0)) + if(str8_match(name, rd_name_schema_info_table[idx].name, 0)) { - schema_string = rd_cfg_name_schema_pair_table[idx].schema; + schema_string = rd_name_schema_info_table[idx].schema; break; } } @@ -2446,26 +2446,8 @@ internal String8 rd_eval_blob_from_cfg(Arena *arena, RD_Cfg *cfg) { String8 result = {0}; - - // rjf: cfg name -> type String8 name = cfg->string; - E_TypeKey type_key = zero_struct; - { - U64 name_hash = d_hash_from_string(name); - U64 name_slot_idx = name_hash%rd_state->cfg_string2typekey_map->slots_count; - for(RD_String2TypeKeyNode *n = rd_state->cfg_string2typekey_map->slots[name_slot_idx].first; - n != 0; - n = n->next) - { - if(str8_match(n->string, name, 0)) - { - type_key = n->key; - break; - } - } - } - - // rjf: if this config has an eval type, build eval blob & cache + E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); if(!e_type_key_match(e_type_key_zero(), type_key)) { Temp scratch = scratch_begin(&arena, 1); @@ -2522,7 +2504,6 @@ rd_eval_blob_from_cfg(Arena *arena, RD_Cfg *cfg) str8_list_concat_in_place(&all_parts, &variable_width_parts); result = str8_list_join(arena, &all_parts, 0); } - return result; } @@ -2551,25 +2532,7 @@ rd_eval_blob_from_cfg__cached(RD_Cfg *cfg) // rjf: no node? -> try to build one if(node == 0) { - // rjf: cfg name -> type - String8 name = cfg->string; - E_TypeKey type_key = zero_struct; - { - U64 name_hash = d_hash_from_string(name); - U64 name_slot_idx = name_hash%rd_state->cfg_string2typekey_map->slots_count; - for(RD_String2TypeKeyNode *n = rd_state->cfg_string2typekey_map->slots[name_slot_idx].first; - n != 0; - n = n->next) - { - if(str8_match(n->string, name, 0)) - { - type_key = n->key; - break; - } - } - } - - // rjf: if this config has an eval type, build eval blob & cache + E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg->string); if(!e_type_key_match(e_type_key_zero(), type_key)) { node = push_array(rd_frame_arena(), RD_Cfg2EvalBlobNode, 1); @@ -2895,26 +2858,8 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) RD_Cfg *cfg = rd_cfg_from_eval_space(space); String8 eval_blob = rd_eval_blob_from_cfg__cached(cfg); MD_Node *schema = rd_schema_from_name(scratch.arena, cfg->string); - - // rjf: cfg name -> type key String8 name = cfg->string; - E_TypeKey type_key = zero_struct; - { - U64 name_hash = d_hash_from_string(name); - U64 name_slot_idx = name_hash%rd_state->cfg_string2typekey_map->slots_count; - for(RD_String2TypeKeyNode *n = rd_state->cfg_string2typekey_map->slots[name_slot_idx].first; - n != 0; - n = n->next) - { - if(str8_match(n->string, name, 0)) - { - type_key = n->key; - break; - } - } - } - - // rjf: key -> type + E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); E_Type *type = e_type_from_key(scratch.arena, type_key); // rjf: find member to which this write applies, reflect back in the cfg tree @@ -8803,52 +8748,6 @@ struct RD_CtrlEntityExpandAccel CTRL_EntityArray entities; }; -//- rjf: meta entities - -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Watch); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Watch, 0); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Watch, 0); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Watch, 0); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Target); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Target, 1); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Target, 1); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Target, 1); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_Breakpoint); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_Breakpoint, 1); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_Breakpoint, 1); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_Breakpoint, 1); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_WatchPin); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_WatchPin, 1); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_WatchPin, 1); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_WatchPin, 1); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_FilePathMap); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_FilePathMap, 1); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_FilePathMap, 1); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_FilePathMap, 1); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_AutoViewRule); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_AutoViewRule, 1); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_AutoViewRule, 1); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_AutoViewRule, 1); } - -//- rjf: control entity groups - -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, str8_zero(), expr, params, CTRL_EntityKind_Machine); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, str8_zero(), expr, params, idx_range, user_data, CTRL_EntityKind_Machine); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Machine); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Machine); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Process); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Process); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Process); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Process); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Thread); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Thread); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Thread); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Thread); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Module); } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Module); } -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Module); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Module); } - //- rjf: control entity hierarchies EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(scheduler_machine) @@ -9010,53 +8909,107 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process) return id; } -//- rjf: locals +//- rjf: debug info tables -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(locals) +E_LOOKUP_INFO_FUNCTION_DEF(watches) { + E_LookupInfo result = {0}; Temp scratch = scratch_begin(&arena, 1); - E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_ctx->locals_map); - e_string2num_map_node_array_sort__in_place(&nodes); - String8List exprs_filtered = {0}; - for EachIndex(idx, nodes.count) { - String8 local_expr_string = nodes.v[idx]->string; - FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, local_expr_string); - if(matches.count == matches.needle_part_count) + RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); + RD_CfgList cfgs_list__filtered = cfgs_list; + if(filter.size != 0) { - str8_list_push(scratch.arena, &exprs_filtered, local_expr_string); + MemoryZeroStruct(&cfgs_list__filtered); + for(RD_CfgNode *n = cfgs_list.first; n != 0; n = n->next) + { + String8 expr = rd_expr_from_cfg(n->v); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, expr); + if(matches.count == matches.needle_part_count) + { + rd_cfg_list_push(scratch.arena, &cfgs_list__filtered, n->v); + } + } } + RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1); + cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list__filtered); + result.user_data = cfgs; + result.idxed_expr_count = cfgs->count; } - String8Array *accel = push_array(arena, String8Array, 1); - *accel = str8_array_from_list(arena, &exprs_filtered); - EV_ExpandInfo info = {accel, accel->count}; scratch_end(scratch); - return info; + return result; } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(locals) +E_LOOKUP_RANGE_FUNCTION_DEF(watches) { - String8Array *accel = (String8Array *)user_data; - EV_ExpandRangeInfo result = {0}; + E_LookupRange result = {0}; { - U64 needed_row_count = dim_1u64(idx_range); - result.row_exprs_count = Min(needed_row_count, accel->count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) + RD_CfgArray *cfgs = (RD_CfgArray *)user_data; + Rng1U64 legal_idx_range = r1u64(0, cfgs->count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + result.exprs_count = read_range_count; + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + result.exprs_strings = push_array(arena, String8, result.exprs_count); + for(U64 idx = 0; idx < result.exprs_count; idx += 1) { - result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, accel->v[idx_range.min + row_expr_idx]); - result.row_members[row_expr_idx] = &e_member_nil; + U64 cfg_idx = read_range.min + idx; + String8 expr_string = rd_cfg_child_from_string(cfgs->v[idx], str8_lit("expression"))->first->string; + result.exprs[idx] = e_parse_expr_from_text(arena, expr_string); + result.exprs_strings[idx] = push_str8_copy(arena, expr_string); } } return result; } -//- rjf: registers +E_LOOKUP_INFO_FUNCTION_DEF(locals) +{ + E_LookupInfo result = {0}; + Temp scratch = scratch_begin(&arena, 1); + { + E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_parse_ctx->locals_map); + e_string2num_map_node_array_sort__in_place(&nodes); + String8List exprs_filtered = {0}; + for EachIndex(idx, nodes.count) + { + String8 local_expr_string = nodes.v[idx]->string; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, local_expr_string); + if(matches.count == matches.needle_part_count) + { + str8_list_push(scratch.arena, &exprs_filtered, local_expr_string); + } + } + String8Array *accel = push_array(arena, String8Array, 1); + *accel = str8_array_from_list(arena, &exprs_filtered); + result.user_data = accel; + result.idxed_expr_count = accel->count; + } + scratch_end(scratch); + return result; +} -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers) +E_LOOKUP_RANGE_FUNCTION_DEF(locals) +{ + E_LookupRange result = {0}; + { + String8Array *accel = (String8Array *)user_data; + Rng1U64 legal_idx_range = r1u64(0, accel->count); + Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range); + U64 read_range_count = dim_1u64(read_range); + result.exprs_count = read_range_count; + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + result.exprs_strings = push_array(arena, String8, result.exprs_count); + for(U64 idx = 0; idx < result.exprs_count; idx += 1) + { + String8 expr_string = accel->v[read_range.min + idx]; + result.exprs[idx] = e_parse_expr_from_text(arena, expr_string); + result.exprs_strings[idx] = push_str8_copy(arena, expr_string); + } + } + return result; +} + +E_LOOKUP_INFO_FUNCTION_DEF(registers) { Temp scratch = scratch_begin(&arena, 1); CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); @@ -9084,90 +9037,32 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(registers) } String8Array *accel = push_array(arena, String8Array, 1); *accel = str8_array_from_list(arena, &exprs_list); - EV_ExpandInfo info = {accel, accel->count}; + E_LookupInfo info = {accel, 0, accel->count}; scratch_end(scratch); return info; } -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(registers) +E_LOOKUP_RANGE_FUNCTION_DEF(registers) { String8Array *accel = (String8Array *)user_data; - EV_ExpandRangeInfo result = {0}; + E_LookupRange result = {0}; { - U64 needed_row_count = dim_1u64(idx_range); - result.row_exprs_count = Min(needed_row_count, accel->count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) + Rng1U64 legal_idx_range = r1u64(0, accel->count); + Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); + result.exprs_count = dim_1u64(read_range); + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + result.exprs_strings = push_array(arena, String8, result.exprs_count); + for(U64 idx = 0; idx < result.exprs_count; idx += 1) { - String8 string = push_str8f(arena, "reg:%S", accel->v[idx_range.min + row_expr_idx]); - result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, string); - result.row_members[row_expr_idx] = &e_member_nil; + String8 register_name = accel->v[read_range.min + idx]; + String8 register_expr = push_str8f(arena, "reg:%S", register_name); + result.exprs_strings[idx] = register_name; + result.exprs[idx] = e_parse_expr_from_text(arena, register_expr); } } return result; } -//- rjf: debug info tables - -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_GlobalVariables);} -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_GlobalVariables);} -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_GlobalVariables); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(globals) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_GlobalVariables); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_ThreadVariables);} -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_ThreadVariables);} -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_ThreadVariables); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(thread_locals) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_ThreadVariables); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_UDTs);} -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_UDTs);} -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_UDTs); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(types) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_UDTs); } -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_expand_info__debug_info_tables(arena, view, filter, expr, params, RDI_SectionKind_Procedures);} -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_expand_range_info__debug_info_tables(arena, view, filter, expr, params, idx_range, user_data, RDI_SectionKind_Procedures);} -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_id_from_num__debug_info_tables(num, user_data, RDI_SectionKind_Procedures); } -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(procedures) {return rd_ev_view_rule_expr_num_from_id__debug_info_tables(id, user_data, RDI_SectionKind_Procedures); } - -E_LOOKUP_INFO_FUNCTION_DEF(watch_group) -{ - E_LookupInfo result = {0}; - Temp scratch = scratch_begin(&arena, 1); - { - RD_CfgList cfgs_list = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); - RD_CfgArray *cfgs = push_array(arena, RD_CfgArray, 1); - cfgs[0] = rd_cfg_array_from_list(arena, &cfgs_list); - result.user_data = cfgs; - result.idxed_expr_count = cfgs_list.count; - } - scratch_end(scratch); - return result; -} - -E_LOOKUP_FUNCTION_DEF(watch_group) -{ - E_Lookup result = {{&e_irnode_nil}}; - if(kind == E_ExprKind_ArrayIndex) - { - Temp scratch = scratch_begin(&arena, 1); - RD_CfgArray *cfgs = (RD_CfgArray *)user_data; - E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs); - E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root); - String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); - E_Interpretation rhs_interp = e_interpret(rhs_bytecode); - E_Value rhs_value = rhs_interp.value; - if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count) - { - RD_Cfg *watch = cfgs->v[rhs_value.u64]; - String8 expr_string = rd_cfg_child_from_string(watch, str8_lit("expression"))->first->string; - E_Expr *expr = e_parse_expr_from_text(arena, expr_string); - result.irtree_and_type = e_irtree_and_type_from_expr(arena, expr); - } - scratch_end(scratch); - } - return result; -} - E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg) { E_LookupInfo result = {0}; @@ -9187,9 +9082,9 @@ E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg) return result; } -E_LOOKUP_FUNCTION_DEF(top_level_cfg) +E_LOOKUP_ACCESS_FUNCTION_DEF(top_level_cfg) { - E_Lookup result = {{&e_irnode_nil}}; + E_LookupAccess result = {{&e_irnode_nil}}; if(kind == E_ExprKind_ArrayIndex) { Temp scratch = scratch_begin(&arena, 1); @@ -9204,21 +9099,7 @@ E_LOOKUP_FUNCTION_DEF(top_level_cfg) RD_Cfg *cfg = cfgs->v[rhs_value.u64]; E_Space cfg_space = rd_eval_space_from_cfg(cfg); String8 cfg_name = cfg->string; - E_TypeKey cfg_type_key = {0}; - { - U64 hash = d_hash_from_string(cfg_name); - U64 slot_idx = hash%rd_state->cfg_string2typekey_map->slots_count; - for(RD_String2TypeKeyNode *n = rd_state->cfg_string2typekey_map->slots[slot_idx].first; - n != 0; - n = n->next) - { - if(str8_match(n->string, cfg_name, 0)) - { - cfg_type_key = n->key; - break; - } - } - } + E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name); result.irtree_and_type.root = e_irtree_set_space(arena, cfg_space, e_irtree_const_u(arena, 0)); result.irtree_and_type.type_key = cfg_type_key; result.irtree_and_type.mode = E_Mode_Offset; @@ -9228,6 +9109,253 @@ E_LOOKUP_FUNCTION_DEF(top_level_cfg) return result; } +E_LOOKUP_INFO_FUNCTION_DEF(ctrl_entities) +{ + E_LookupInfo result = {0}; + Temp scratch = scratch_begin(&arena, 1); + { + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); + String8 name = rd_singular_from_code_name_plural(lhs_type->name); + CTRL_EntityKind entity_kind = CTRL_EntityKind_Null; + for EachNonZeroEnumVal(CTRL_EntityKind, k) + { + if(str8_match(name, ctrl_entity_kind_code_name_table[k], 0)) + { + entity_kind = k; + break; + } + } + CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, entity_kind); + CTRL_EntityList list__filtered = list; + if(filter.size != 0) + { + MemoryZeroStruct(&list__filtered); + for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) + { + CTRL_Entity *entity = n->v; + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, entity->string); + if(matches.count == matches.needle_part_count) + { + ctrl_entity_list_push(scratch.arena, &list__filtered, entity); + } + } + } + CTRL_EntityArray *array = push_array(arena, CTRL_EntityArray, 1); + *array = ctrl_entity_array_from_list(arena, &list__filtered); + result.user_data = array; + result.idxed_expr_count = list.count; + } + scratch_end(scratch); + return result; +} + +E_LOOKUP_ACCESS_FUNCTION_DEF(ctrl_entities) +{ + E_LookupAccess result = {{&e_irnode_nil}}; + if(kind == E_ExprKind_ArrayIndex) + { + Temp scratch = scratch_begin(&arena, 1); + CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data; + E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs); + E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root); + String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); + E_Interpretation rhs_interp = e_interpret(rhs_bytecode); + E_Value rhs_value = rhs_interp.value; + if(0 <= rhs_value.u64 && rhs_value.u64 < entities->count) + { + CTRL_Entity *entity = entities->v[rhs_value.u64]; + E_Space entity_space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); + String8 entity_name = ctrl_entity_kind_code_name_table[entity->kind]; + E_TypeKey entity_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, entity_name); + result.irtree_and_type.root = e_irtree_set_space(arena, entity_space, e_irtree_const_u(arena, 0)); + result.irtree_and_type.type_key = entity_type_key; + result.irtree_and_type.mode = E_Mode_Offset; + } + scratch_end(scratch); + } + return result; +} + +typedef struct RD_DebugInfoTableLookupAccel RD_DebugInfoTableLookupAccel; +struct RD_DebugInfoTableLookupAccel +{ + RDI_SectionKind section; + U64 rdis_count; + RDI_Parsed **rdis; + DI_SearchItemArray items; +}; + +E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table) +{ + Temp scratch = scratch_begin(&arena, 1); + + // rjf: determine which debug info section we're dealing with + RDI_SectionKind section = RDI_SectionKind_NULL; + { + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key); + if(0){} + else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;} + else if(str8_match(lhs_type->name, str8_lit("globals"), 0)) {section = RDI_SectionKind_GlobalVariables;} + else if(str8_match(lhs_type->name, str8_lit("thread_locals"), 0)) {section = RDI_SectionKind_ThreadVariables;} + else if(str8_match(lhs_type->name, str8_lit("types"), 0)) {section = RDI_SectionKind_UDTs;} + } + + // rjf: gather debug info table items + RD_DebugInfoTableLookupAccel *accel = push_array(arena, RD_DebugInfoTableLookupAccel, 1); + if(section != RDI_SectionKind_NULL) + { + U64 endt_us = d_state->frame_eval_memread_endt_us; + + //- rjf: unpack context + DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(arena, RDI_Parsed *, rdis_count); + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + rdis[idx] = di_rdi_from_key(rd_state->frame_di_scope, &dbgi_keys.v[idx], endt_us); + } + + //- rjf: query all filtered items from dbgi searching system + U128 fuzzy_search_key = {d_hash_from_string(str8_struct(&rd_regs()->view)), (U64)section}; + B32 items_stale = 0; + DI_SearchParams params = {section, dbgi_keys}; + accel->section = section; + accel->rdis_count = rdis_count; + accel->rdis = rdis; + accel->items = di_search_items_from_key_params_query(rd_state->frame_di_scope, fuzzy_search_key, ¶ms, filter, endt_us, &items_stale); + if(items_stale) + { + rd_request_frame(); + } + } + E_LookupInfo info = {accel, 0, accel->items.count}; + scratch_end(scratch); + return info; +} + +E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) +{ + RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; + E_LookupRange result = {0}; + { + U64 needed_row_count = dim_1u64(idx_range); + result.exprs_count = Min(needed_row_count, accel->items.count); + result.exprs = push_array(arena, E_Expr *, result.exprs_count); + result.exprs_strings = push_array(arena, String8, result.exprs_count); + for EachIndex(idx, result.exprs_count) + { + // rjf: unpack row + DI_SearchItem *item = &accel->items.v[idx_range.min + idx]; + + // rjf: skip bad elements + if(item->dbgi_idx >= accel->rdis_count) + { + continue; + } + + // rjf: unpack row info + RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; + E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; + + // rjf: build expr + E_Expr *item_expr = &e_expr_nil; + { + U64 element_idx = item->idx; + switch(accel->section) + { + default:{}break; + case RDI_SectionKind_Procedures: + { + RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx); + RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx); + U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = procedure->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Value; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_GlobalVariables: + { + RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx); + U64 voff = gvar->voff; + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = gvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_ThreadVariables: + { + RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx); + E_OpList oplist = {0}; + e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off)); + String8 bytecode = e_bytecode_from_oplist(arena, &oplist); + U32 type_idx = tvar->type_idx; + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); + item_expr->mode = E_Mode_Offset; + item_expr->space = module->space; + item_expr->type_key = type_key; + item_expr->bytecode = bytecode; + item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size); + }break; + case RDI_SectionKind_UDTs: + { + RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); + RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); + E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules)); + item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); + item_expr->type_key = type_key; + }break; + } + } + + // rjf: fill + result.exprs[idx] = item_expr; + } + } + return result; +} + +E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table) +{ + RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; + U64 id = 0; + if(0 < num && num <= accel->items.count) + { + id = accel->items.v[num-1].idx+1; + } + return id; +} + +E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table) +{ + RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; + U64 num = di_search_item_num_from_array_element_idx__linear_search(&accel->items, id-1); + return num; +} + internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind) { @@ -9394,230 +9522,6 @@ rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(Arena *arena, EV_View *view return info; } -internal EV_ExpandRangeInfo -rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, CTRL_EntityKind kind) -{ - RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; - EV_ExpandRangeInfo result = {0}; - { - U64 needed_row_count = dim_1u64(idx_range); - result.row_exprs_count = Min(needed_row_count, accel->entities.count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - CTRL_Entity *entity = accel->entities.v[idx_range.min + row_expr_idx]; - String8 entity_expr_string = push_str8f(arena, "ctrl_entity:$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]); - result.row_exprs[row_expr_idx] = e_parse_expr_from_text(arena, entity_expr_string); - result.row_members[row_expr_idx] = &e_member_nil; - } - } - return result; -} - -internal U64 -rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind) -{ - RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; - U64 id = 0; - if(1 <= num && num <= accel->entities.count) - { - id = d_hash_from_string(str8_struct(&accel->entities.v[num-1]->handle)); - } - return id; -} - -internal U64 -rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind) -{ - RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data; - U64 num = 0; - if(id != 0) - { - for EachIndex(idx, accel->entities.count) - { - U64 idx_id = d_hash_from_string(str8_struct(&accel->entities.v[idx]->handle)); - if(idx_id == id) - { - num = idx+1; - break; - } - } - } - return num; -} - -typedef struct RD_DebugInfoTableExpandAccel RD_DebugInfoTableExpandAccel; -struct RD_DebugInfoTableExpandAccel -{ - U64 rdis_count; - RDI_Parsed **rdis; - DI_SearchItemArray items; -}; - -internal EV_ExpandInfo -rd_ev_view_rule_expr_expand_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RDI_SectionKind section) -{ - RD_DebugInfoTableExpandAccel *accel = push_array(arena, RD_DebugInfoTableExpandAccel, 1); - if(section != RDI_SectionKind_NULL) - { - Temp scratch = scratch_begin(&arena, 1); - U64 endt_us = os_now_microseconds()+200; - - //- rjf: unpack context - DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); - DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); - U64 rdis_count = dbgi_keys.count; - RDI_Parsed **rdis = push_array(arena, RDI_Parsed *, rdis_count); - for(U64 idx = 0; idx < rdis_count; idx += 1) - { - rdis[idx] = di_rdi_from_key(rd_state->frame_di_scope, &dbgi_keys.v[idx], endt_us); - } - - //- rjf: query all filtered items from dbgi searching system - U128 fuzzy_search_key = {(U64)view, (U64)section}; - B32 items_stale = 0; - DI_SearchParams params = {section, dbgi_keys}; - accel->rdis_count = rdis_count; - accel->rdis = rdis; - accel->items = di_search_items_from_key_params_query(rd_state->frame_di_scope, fuzzy_search_key, ¶ms, filter, endt_us, &items_stale); - if(items_stale) - { - rd_request_frame(); - } - - scratch_end(scratch); - } - EV_ExpandInfo info = {accel, accel->items.count}; - return info; -} - -internal EV_ExpandRangeInfo -rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RDI_SectionKind section) -{ - RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; - EV_ExpandRangeInfo result = {0}; - { - U64 needed_row_count = dim_1u64(idx_range); - result.row_exprs_count = Min(needed_row_count, accel->items.count); - result.row_exprs = push_array(arena, E_Expr *, result.row_exprs_count); - result.row_strings = push_array(arena, String8, result.row_exprs_count); - result.row_view_rules = push_array(arena, String8, result.row_exprs_count); - result.row_members = push_array(arena, E_Member *, result.row_exprs_count); - for EachIndex(row_expr_idx, result.row_exprs_count) - { - // rjf: unpack row - DI_SearchItem *item = &accel->items.v[idx_range.min + row_expr_idx]; - - // rjf: skip bad elements - if(item->dbgi_idx >= accel->rdis_count) - { - continue; - } - - // rjf: unpack row info - RDI_Parsed *rdi = accel->rdis[item->dbgi_idx]; - E_Module *module = &e_parse_ctx->modules[item->dbgi_idx]; - - // rjf: build expr - E_Expr *item_expr = &e_expr_nil; - { - U64 element_idx = item->idx; - switch(section) - { - default:{}break; - case RDI_SectionKind_Procedures: - { - RDI_Procedure *procedure = rdi_element_from_name_idx(module->rdi, Procedures, element_idx); - RDI_Scope *scope = rdi_element_from_name_idx(module->rdi, Scopes, procedure->root_scope_idx); - U64 voff = *rdi_element_from_name_idx(module->rdi, ScopeVOffData, scope->voff_range_first); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = procedure->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Value; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, procedure->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_GlobalVariables: - { - RDI_GlobalVariable *gvar = rdi_element_from_name_idx(module->rdi, GlobalVariables, element_idx); - U64 voff = gvar->voff; - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = gvar->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Offset; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, gvar->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_ThreadVariables: - { - RDI_ThreadVariable *tvar = rdi_element_from_name_idx(module->rdi, ThreadVariables, element_idx); - E_OpList oplist = {0}; - e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(tvar->tls_off)); - String8 bytecode = e_bytecode_from_oplist(arena, &oplist); - U32 type_idx = tvar->type_idx; - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_LeafBytecode, 0); - item_expr->mode = E_Mode_Offset; - item_expr->space = module->space; - item_expr->type_key = type_key; - item_expr->bytecode = bytecode; - item_expr->string.str = rdi_string_from_idx(module->rdi, tvar->name_string_idx, &item_expr->string.size); - }break; - case RDI_SectionKind_UDTs: - { - RDI_UDT *udt = rdi_element_from_name_idx(module->rdi, UDTs, element_idx); - RDI_TypeNode *type_node = rdi_element_from_name_idx(module->rdi, TypeNodes, udt->self_type_idx); - E_TypeKey type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, (U32)(module - e_parse_ctx->modules)); - item_expr = e_push_expr(arena, E_ExprKind_TypeIdent, 0); - item_expr->type_key = type_key; - }break; - } - } - - // rjf: fill - result.row_exprs[row_expr_idx] = item_expr; - result.row_members[row_expr_idx] = &e_member_nil; - } - } - return result; -} - -internal U64 -rd_ev_view_rule_expr_id_from_num__debug_info_tables(U64 num, void *user_data, RDI_SectionKind section) -{ - RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; - U64 id = 0; - if(0 < num && num <= accel->items.count) - { - id = accel->items.v[num-1].idx+1; - } - return id; -} - -internal U64 -rd_ev_view_rule_expr_num_from_id__debug_info_tables(U64 id, void *user_data, RDI_SectionKind section) -{ - RD_DebugInfoTableExpandAccel *accel = (RD_DebugInfoTableExpandAccel *)user_data; - U64 num = di_search_item_num_from_array_element_idx__linear_search(&accel->items, id-1); - return num; -} - internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out) { @@ -13161,6 +13065,7 @@ rd_frame(void) ctx->lookup_rule_map[0] = e_lookup_rule_map_make(scratch.arena, 512); //- rjf: add macros for collections +#if 0 // TODO(rjf): @cfg { for EachElement(idx, rd_collection_name_table) { @@ -13170,34 +13075,45 @@ rd_frame(void) e_string2expr_map_insert(scratch.arena, ctx->macro_map, rd_collection_name_table[idx], expr); } } +#endif - //- rjf: choose set of evallable config names - String8 evallable_cfg_names[] = + //- rjf: choose set of evallable meta names + String8 evallable_meta_names[] = { str8_lit("breakpoint"), str8_lit("watch_pin"), str8_lit("target"), str8_lit("file_path_map"), str8_lit("auto_view_rule"), + str8_lit("machine"), + str8_lit("process"), + str8_lit("thread"), + str8_lit("module"), }; - //- rjf: build special member types for evallable config types + //- 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 location_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")); + e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit("max")); + 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(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), E_TypeFlag_IsCodeText); path_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPathText); string_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText); location_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), E_TypeFlag_IsPlainText|E_TypeFlag_IsCodeText|E_TypeFlag_IsPathText); } - //- rjf: build types for each evallable config tree + //- rjf: build types for each evallable meta name struct { String8 schema_type_name; @@ -13207,15 +13123,16 @@ rd_frame(void) { { 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("location"), location_type_key }, }; - E_TypeKey evallable_cfg_types[ArrayCount(evallable_cfg_names)] = {0}; - for EachElement(idx, evallable_cfg_names) + E_TypeKey evallable_meta_types[ArrayCount(evallable_meta_names)] = {0}; + for EachElement(idx, evallable_meta_names) { - String8 name = evallable_cfg_names[idx]; + String8 name = evallable_meta_names[idx]; MD_Node *schema = rd_schema_from_name(scratch.arena, name); E_MemberList members_list = {0}; U64 off = 0; @@ -13240,29 +13157,31 @@ rd_frame(void) off += e_type_byte_size_from_key(member_type_key); } E_MemberArray members = e_member_array_from_list(scratch.arena, &members_list); - evallable_cfg_types[idx] = e_type_key_cons(.name = name, - .kind = E_TypeKind_Struct, - .members = members.v, - .count = members.count); + evallable_meta_types[idx] = e_type_key_cons(.name = name, + .kind = E_TypeKind_Struct, + .members = members.v, + .count = members.count); } - //- rjf: cache cfg name -> type key correllation - rd_state->cfg_string2typekey_map = push_array(rd_frame_arena(), RD_String2TypeKeyMap, 1); - rd_state->cfg_string2typekey_map->slots_count = 256; - rd_state->cfg_string2typekey_map->slots = push_array(rd_frame_arena(), RD_String2TypeKeySlot, rd_state->cfg_string2typekey_map->slots_count); - for EachElement(idx, evallable_cfg_names) + //- 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, evallable_meta_names) { - String8 name = evallable_cfg_names[idx]; - E_TypeKey type_key = evallable_cfg_types[idx]; - U64 hash = d_hash_from_string(name); - U64 slot_idx = hash%rd_state->cfg_string2typekey_map->slots_count; - RD_String2TypeKeyNode *node = push_array(rd_frame_arena(), RD_String2TypeKeyNode, 1); - node->string = push_str8_copy(rd_frame_arena(), name); - node->key = type_key; - SLLQueuePush(rd_state->cfg_string2typekey_map->slots[slot_idx].first, rd_state->cfg_string2typekey_map->slots[slot_idx].last, node); + String8 name = evallable_meta_names[idx]; + E_TypeKey type_key = evallable_meta_types[idx]; + e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key); } - //- rjf: add macros for each evallable config tree + //- rjf: add macros for evallable config trees + String8 evallable_cfg_names[] = + { + str8_lit("breakpoint"), + str8_lit("watch_pin"), + str8_lit("target"), + str8_lit("file_path_map"), + str8_lit("auto_view_rule"), + }; for EachElement(idx, evallable_cfg_names) { String8 name = evallable_cfg_names[idx]; @@ -13276,7 +13195,7 @@ rd_frame(void) E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->space = space; expr->mode = E_Mode_Offset; - expr->type_key = evallable_cfg_types[idx]; + expr->type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); if(exe.size != 0) { e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr); @@ -13285,70 +13204,98 @@ rd_frame(void) { e_string2expr_map_insert(scratch.arena, ctx->macro_map, label, expr); } - e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64x%I64x", (U64)cfg, cfg->gen), expr); } } - //- rjf: add macros for all evallable control entities + //- rjf: add macros for evallable control entities + String8 evallable_ctrl_names[] = { - CTRL_EntityKind evallable_kinds[] = + str8_lit("machine"), + str8_lit("process"), + str8_lit("thread"), + str8_lit("module"), + }; + for EachElement(idx, evallable_ctrl_names) + { + String8 name = evallable_ctrl_names[idx]; + CTRL_EntityKind kind = ctrl_entity_kind_from_string(name); + CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); + for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) { - CTRL_EntityKind_Machine, - CTRL_EntityKind_Process, - CTRL_EntityKind_Thread, - CTRL_EntityKind_Module, - }; - E_TypeKey evallable_kind_types[] = - { - e_type_key_cons_base(type(CTRL_MachineMetaEval)), - e_type_key_cons_base(type(CTRL_ProcessMetaEval)), - e_type_key_cons_base(type(CTRL_ThreadMetaEval)), - e_type_key_cons_base(type(CTRL_ModuleMetaEval)), - }; - for EachElement(idx, evallable_kinds) - { - CTRL_EntityKind kind = evallable_kinds[idx]; - CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); - for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) + CTRL_Entity *entity = n->v; + E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = type_key; + if(entity->string.size != 0) { - CTRL_Entity *entity = n->v; - E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->space = space; - expr->mode = E_Mode_Offset; - expr->type_key = evallable_kind_types[idx]; - e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$_%I64x_%I64x", entity->handle.machine_id, entity->handle.dmn_handle.u64[0]), expr); - if(entity->string.size != 0) - { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); - } - if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) - { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_thread"), expr); - } - if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) - { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_process"), expr); - } - if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) - { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_module"), expr); - } + e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); + } + if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_thread"), expr); + } + if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_process"), expr); + } + if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle)) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_lit("current_module"), expr); } } } - //- rjf: add macros for watch groups + //- rjf: add macro for collections with specific lookup rules + struct { - String8 collection_name = str8_lit("watches"); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + String8 name; + E_LookupInfoFunctionType *lookup_info; + E_LookupRangeFunctionType *lookup_range; + } + collection_infos[] = + { +#define Collection(name) {str8_lit_comp(#name), E_LOOKUP_INFO_FUNCTION_NAME(name), E_LOOKUP_RANGE_FUNCTION_NAME(name)} + Collection(watches), + Collection(locals), + Collection(registers), +#undef Collection + }; + for EachElement(idx, collection_infos) + { + String8 collection_name = collection_infos[idx].name; E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = collection_type_key; + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .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, E_LOOKUP_INFO_FUNCTION_NAME(watch_group), E_LOOKUP_FUNCTION_NAME(watch_group)); + e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, + .info = collection_infos[idx].lookup_info, + .range = collection_infos[idx].lookup_range); } - //- rjf: add macros for all cfg collections (new @cfg) + //- rjf: add macros for debug info table collections + String8 debug_info_table_collection_names[] = + { + str8_lit_comp("procedures"), + str8_lit_comp("thread_locals"), + str8_lit_comp("globals"), + str8_lit_comp("types"), + }; + for EachElement(idx, debug_info_table_collection_names) + { + 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); + e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); + e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name, + .info = E_LOOKUP_INFO_FUNCTION_NAME(debug_info_table), + .range = E_LOOKUP_RANGE_FUNCTION_NAME(debug_info_table), + .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(debug_info_table), + .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(debug_info_table)); + } + + //- rjf: add macros for all config collections for EachElement(cfg_name_idx, evallable_cfg_names) { String8 cfg_name = evallable_cfg_names[cfg_name_idx]; @@ -13357,7 +13304,23 @@ rd_frame(void) E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; 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, E_LOOKUP_INFO_FUNCTION_NAME(top_level_cfg), E_LOOKUP_FUNCTION_NAME(top_level_cfg)); + e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, + .info = E_LOOKUP_INFO_FUNCTION_NAME(top_level_cfg), + .access = E_LOOKUP_ACCESS_FUNCTION_NAME(top_level_cfg)); + } + + //- rjf: add macros for all ctrl entity collections + for EachElement(ctrl_name_idx, evallable_ctrl_names) + { + 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_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + expr->type_key = collection_type_key; + 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 = E_LOOKUP_INFO_FUNCTION_NAME(ctrl_entities), + .access = E_LOOKUP_ACCESS_FUNCTION_NAME(ctrl_entities)); } //- rjf: add macro for output log @@ -13846,7 +13809,7 @@ rd_frame(void) RD_Cfg *user = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user")); RD_Cfg *watch = rd_cfg_new(user, str8_lit("watch")); RD_Cfg *expr = rd_cfg_new(watch, str8_lit("expression")); - rd_cfg_new(expr, str8_lit("targets[0]")); + rd_cfg_new(expr, str8_lit("current_thread")); } }break; diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index cc99431e..1d2e38f4 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -745,31 +745,6 @@ struct RD_CtrlEntityMetaEvalCacheSlot RD_CtrlEntityMetaEvalCacheNode *last; }; -//////////////////////////////// -//~ rjf: String -> Type Key Map Helper Data Structure - -typedef struct RD_String2TypeKeyNode RD_String2TypeKeyNode; -struct RD_String2TypeKeyNode -{ - RD_String2TypeKeyNode *next; - String8 string; - E_TypeKey key; -}; - -typedef struct RD_String2TypeKeySlot RD_String2TypeKeySlot; -struct RD_String2TypeKeySlot -{ - RD_String2TypeKeyNode *first; - RD_String2TypeKeyNode *last; -}; - -typedef struct RD_String2TypeKeyMap RD_String2TypeKeyMap; -struct RD_String2TypeKeyMap -{ - U64 slots_count; - RD_String2TypeKeySlot *slots; -}; - //////////////////////////////// //~ rjf: Config -> Eval Blob Cache Types @@ -864,8 +839,8 @@ struct RD_State RD_Theme *theme; RD_Theme *theme_target; - // rjf: config name -> eval type key map (constructed from-scratch each frame) - RD_String2TypeKeyMap *cfg_string2typekey_map; + // rjf: meta name -> eval type key map (constructed from-scratch each frame) + E_String2TypeKeyMap *meta_name2type_map; // rjf: config -> eval blob map (lazily constructed from-scratch each frame) RD_Cfg2EvalBlobMap *cfg2evalblob_map; @@ -1328,9 +1303,6 @@ internal void rd_window_frame(void); //////////////////////////////// //~ rjf: Eval Visualization -E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg); -E_LOOKUP_FUNCTION_DEF(top_level_cfg); - internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RD_EntityKind kind); internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_entities(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RD_EntityKind kind, B32 add_new_at_top); internal U64 rd_ev_view_rule_expr_id_from_num__meta_entities(U64 num, void *user_data, RD_EntityKind kind, B32 add_new_at_top); @@ -1341,11 +1313,6 @@ internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__meta_ctrl_en internal U64 rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind); internal U64 rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind); -internal EV_ExpandInfo rd_ev_view_rule_expr_expand_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, RDI_SectionKind section); -internal EV_ExpandRangeInfo rd_ev_view_rule_expr_expand_range_info__debug_info_tables(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params, Rng1U64 idx_range, void *user_data, RDI_SectionKind section); -internal U64 rd_ev_view_rule_expr_id_from_num__debug_info_tables(U64 num, void *user_data, RDI_SectionKind section); -internal U64 rd_ev_view_rule_expr_num_from_id__debug_info_tables(U64 id, void *user_data, RDI_SectionKind section); - internal F32 rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules, String8List *out); internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, EV_ViewRuleList *view_rules); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index 35bf5d39..e13a55f7 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -27,6 +27,7 @@ // but only with commands that are directly // // [ ] r8 bitmap view rule seems incorrect? +// [ ] crash bug, release mode - filter globals view (try with debugging raddbg, typing `dev` in globals view) //////////////////////////////// //~ rjf: post-0.9.12 TODO notes