eliminate watch view fill kind; extend rtti & eval type system with 'external' pointers, for e.g. meta-space vaddr u64s pointing into an address space; begin sketching out paths for mutational rows in watch collections, use to add 'add target' fastpath in targets collection evaluations

This commit is contained in:
Ryan Fleury
2024-09-23 10:57:43 -07:00
parent ebaad35813
commit f728614e0b
13 changed files with 873 additions and 819 deletions
+18 -4
View File
@@ -44,7 +44,8 @@ typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr)
switch(t->type->kind) switch(t->type->kind)
{ {
default:{}break; default:{}break;
case TypeKind_Ptr: case TypeKind_Ptr:
if(!t->type->is_external)
{ {
*(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr)); *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr));
}break; }break;
@@ -106,7 +107,7 @@ serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerialize
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count)); str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
}break; }break;
//- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise skip //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise just write as plain data
case TypeKind_Ptr: case TypeKind_Ptr:
{ {
// rjf: unpack info about this pointer // rjf: unpack info about this pointer
@@ -172,7 +173,13 @@ serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerialize
task->containing_type = t->containing_type; task->containing_type = t->containing_type;
task->containing_ptr = t->containing_ptr; task->containing_ptr = t->containing_ptr;
SLLQueuePush(first_task, last_task, task); SLLQueuePush(first_task, last_task, task);
} }
// rjf: catch-all: write pointer value
else
{
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
}
}break; }break;
//- rjf: arrays -> descend to underlying type, + count //- rjf: arrays -> descend to underlying type, + count
@@ -338,7 +345,14 @@ deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSeriali
task->containing_type = t->containing_type; task->containing_type = t->containing_type;
task->containing_ptr = t->containing_ptr; task->containing_ptr = t->containing_ptr;
SLLQueuePush(first_task, last_task, task); SLLQueuePush(first_task, last_task, task);
} }
// rjf: catch-all: read pointer value
else
{
MemoryCopy(t->dst, t_src, t->type->size*t->count);
read_off += t->type->size*t->count;
}
}break; }break;
//- rjf: arrays -> descend to underlying type, + count //- rjf: arrays -> descend to underlying type, + count
+2 -1
View File
@@ -100,7 +100,7 @@ TypeKind;
typedef U32 MemberFlags; typedef U32 MemberFlags;
enum enum
{ {
MemberFlag_DoNotSerialize = (1<<0), MemberFlag_DoNotSerialize = (1<<0),
}; };
typedef struct Type Type; typedef struct Type Type;
@@ -123,6 +123,7 @@ struct Type
String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N] String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N]
U64 count; U64 count;
Member *members; Member *members;
B32 is_external;
}; };
//////////////////////////////// ////////////////////////////////
+2 -1
View File
@@ -21,9 +21,10 @@ struct CTRL_MetaEvalFrame
{ {
U64 vaddr; U64 vaddr;
}; };
ptr_type(CTRL_MetaEvalFrame__vaddr_type, type(void), .is_external = 1, .size = sizeof(U64));
struct_members(CTRL_MetaEvalFrame) struct_members(CTRL_MetaEvalFrame)
{ {
member_lit_comp(CTRL_MetaEvalFrame, type(U64), vaddr), member_lit_comp(CTRL_MetaEvalFrame, &CTRL_MetaEvalFrame__vaddr_type, vaddr),
}; };
struct_type(CTRL_MetaEvalFrame); struct_type(CTRL_MetaEvalFrame);
typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray; typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray;
+2 -2
View File
@@ -61,7 +61,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
if(string_idx == 0) { string_idx = gvar->name_string_idx; } if(string_idx == 0) { string_idx = gvar->name_string_idx; }
if(string_idx != 0) if(string_idx != 0)
{ {
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void)); eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0);
} }
} }
return eval; return eval;
@@ -127,7 +127,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx); RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx); RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx); E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key); E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0);
eval.type_key = ptr_to_derived_type_key; eval.type_key = ptr_to_derived_type_key;
} }
} }
+2 -2
View File
@@ -711,7 +711,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
// rjf: generate // rjf: generate
result.root = r_tree.root; result.root = r_tree.root;
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped); result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0);
result.mode = E_Mode_Value; result.mode = E_Mode_Value;
result.space = r_tree.space; result.space = r_tree.space;
}break; }break;
@@ -1064,7 +1064,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
E_TypeKey ptr_type = ptr_tree->type_key; E_TypeKey ptr_type = ptr_tree->type_key;
if(ptr_is_decay) if(ptr_is_decay)
{ {
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type); ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 0);
} }
E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root); E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root);
result.root = new_root; result.root = new_root;
+2 -2
View File
@@ -942,7 +942,7 @@ e_type_from_expr(E_Expr *expr)
case E_ExprKind_Ptr: case E_ExprKind_Ptr:
{ {
E_TypeKey direct_type_key = e_type_from_expr(expr->first); E_TypeKey direct_type_key = e_type_from_expr(expr->first);
result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key); result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 0);
}break; }break;
case E_ExprKind_Array: case E_ExprKind_Array:
{ {
@@ -1251,7 +1251,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
else else
{ {
E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64)); type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 0);
E_Expr *casted = atom; E_Expr *casted = atom;
E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str);
e_expr_push_child(cast, type); e_expr_push_child(cast, type);
+10 -3
View File
@@ -329,6 +329,7 @@ internal B32
e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r) e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r)
{ {
B32 result = (l->kind == r->kind && B32 result = (l->kind == r->kind &&
l->flags == r->flags &&
str8_match(l->name, r->name, 0) && str8_match(l->name, r->name, 0) &&
e_type_key_match(l->direct_key, r->direct_key) && e_type_key_match(l->direct_key, r->direct_key) &&
l->count == r->count); l->count == r->count);
@@ -430,9 +431,9 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
} }
internal E_TypeKey internal E_TypeKey
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key) e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags)
{ {
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .direct_key = element_type_key); E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key);
return key; return key;
} }
@@ -451,7 +452,12 @@ e_type_key_cons_base(Type *type)
case TypeKind_Ptr: case TypeKind_Ptr:
{ {
E_TypeKey direct_type = e_type_key_cons_base(type->direct); E_TypeKey direct_type = e_type_key_cons_base(type->direct);
result = e_type_key_cons_ptr(arch_from_context(), direct_type); E_TypeFlags flags = 0;
if(type->is_external)
{
flags |= E_TypeFlag_External;
}
result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags);
}break; }break;
case TypeKind_Array: case TypeKind_Array:
{ {
@@ -591,6 +597,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
{ {
type = push_array(arena, E_Type, 1); type = push_array(arena, E_Type, 1);
type->kind = e_type_kind_from_key(node->key); type->kind = e_type_kind_from_key(node->key);
type->flags = node->params.flags;
type->name = push_str8_copy(arena, node->params.name); type->name = push_str8_copy(arena, node->params.name);
type->direct_type_key = node->params.direct_key; type->direct_type_key = node->params.direct_key;
type->count = node->params.count; type->count = node->params.count;
+3 -1
View File
@@ -68,6 +68,7 @@ enum
{ {
E_TypeFlag_Const = (1<<0), E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1), E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_External = (1<<2),
}; };
typedef struct E_Member E_Member; typedef struct E_Member E_Member;
@@ -140,6 +141,7 @@ struct E_ConsTypeParams
{ {
Arch arch; Arch arch;
E_TypeKind kind; E_TypeKind kind;
E_TypeFlags flags;
String8 name; String8 name;
E_TypeKey direct_key; E_TypeKey direct_key;
U64 count; U64 count;
@@ -242,7 +244,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
//- rjf: constructed type construction helpers //- rjf: constructed type construction helpers
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count); internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key); internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_base(Type *type); internal E_TypeKey e_type_key_cons_base(Type *type);
//- rjf: basic type key functions //- rjf: basic type key functions
@@ -292,7 +292,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array)
E_Value count = ev_value_from_params(params); E_Value count = ev_value_from_params(params);
E_TypeKey element_type_key = e_type_ptee_from_key(type_key); E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count.u64); E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count.u64);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key); E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
expr = e_expr_ref_cast(arena, ptr_type_key, expr); expr = e_expr_ref_cast(arena, ptr_type_key, expr);
} }
scratch_end(scratch); scratch_end(scratch);
@@ -351,7 +351,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice)
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key); E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key);
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count); E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count);
E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key); E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
E_MemberList slice_type_members = {0}; E_MemberList slice_type_members = {0};
e_member_list_push(scratch.arena, &slice_type_members, count_member); e_member_list_push(scratch.arena, &slice_type_members, count_member);
e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .off = base_ptr_member->off}); e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .off = base_ptr_member->off});
@@ -367,7 +367,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice)
if(base_ptr_member != 0 && count_member != 0) if(base_ptr_member != 0 && count_member != 0)
{ {
expr = e_expr_ref_addr(arena, expr); expr = e_expr_ref_addr(arena, expr);
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key), expr); expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key, 0), expr);
expr = e_expr_ref_deref(arena, expr); expr = e_expr_ref_deref(arena, expr);
} }
} }
@@ -426,7 +426,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only)
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
expr = e_expr_ref_addr(arena, expr); expr = e_expr_ref_addr(arena, expr);
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type), expr); expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
expr = e_expr_ref_deref(arena, expr); expr = e_expr_ref_deref(arena, expr);
} }
scratch_end(scratch); scratch_end(scratch);
@@ -465,7 +465,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit)
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key); String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count); E_TypeKey new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
expr = e_expr_ref_addr(arena, expr); expr = e_expr_ref_addr(arena, expr);
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type), expr); expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
expr = e_expr_ref_deref(arena, expr); expr = e_expr_ref_deref(arena, expr);
} }
scratch_end(scratch); scratch_end(scratch);
+17 -1
View File
@@ -7902,6 +7902,10 @@ EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(rd_collection_block_prod)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
RD_EntityList targets = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target); RD_EntityList targets = rd_query_cached_entity_list_with_kind(RD_EntityKind_Target);
EV_ViewRuleList top_level_view_rules = {0}; EV_ViewRuleList top_level_view_rules = {0};
EV_Key addnew_key = ev_key_make(ev_hash_from_key(key), 1);
EV_Block *addnew_block = ev_block_begin(arena, EV_BlockKind_Canvas, key, addnew_key, depth);
addnew_block->visual_idx_range = addnew_block->semantic_idx_range = r1u64(0, 1);
ev_block_end(out, addnew_block);
for(RD_EntityNode *n = targets.first; n != 0; n = n->next) for(RD_EntityNode *n = targets.first; n != 0; n = n->next)
{ {
RD_Entity *target = n->entity; RD_Entity *target = n->entity;
@@ -8255,7 +8259,19 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul
if(eval.space.kind == RD_EvalSpaceKind_MetaEntity || if(eval.space.kind == RD_EvalSpaceKind_MetaEntity ||
eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity) eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)
{ {
no_addr = 1; E_TypeKind kind = e_type_kind_from_key(eval.type_key);
if(kind != E_TypeKind_Ptr)
{
no_addr = 1;
}
else
{
E_Type *type = e_type_from_key(scratch.arena, eval.type_key);
if(!(type->flags & E_TypeFlag_External))
{
no_addr = 1;
}
}
} }
//- rjf: member evaluations -> display member info //- rjf: member evaluations -> display member info
+2 -5
View File
@@ -158,11 +158,6 @@ struct RD_SettingVal
S32 s32; S32 s32;
}; };
////////////////////////////////
//~ rjf: View Hook Function Types
typedef struct RD_View RD_View;
//////////////////////////////// ////////////////////////////////
//~ rjf: View Rule Info Types //~ rjf: View Rule Info Types
@@ -186,6 +181,8 @@ typedef RD_VIEW_RULE_UI_FUNCTION_SIG(RD_ViewRuleUIFunctionType);
//////////////////////////////// ////////////////////////////////
//~ rjf: View Types //~ rjf: View Types
typedef struct RD_View RD_View;
typedef struct RD_ArenaExt RD_ArenaExt; typedef struct RD_ArenaExt RD_ArenaExt;
struct RD_ArenaExt struct RD_ArenaExt
{ {
+807 -772
View File
File diff suppressed because it is too large Load Diff
+1 -20
View File
@@ -81,22 +81,6 @@ struct RD_WatchViewColumn
B32 dequote_string; B32 dequote_string;
}; };
typedef enum RD_WatchViewFillKind
{
RD_WatchViewFillKind_Watch,
RD_WatchViewFillKind_Breakpoints,
RD_WatchViewFillKind_WatchPins,
RD_WatchViewFillKind_CallStack,
RD_WatchViewFillKind_Registers,
RD_WatchViewFillKind_Locals,
RD_WatchViewFillKind_Globals,
RD_WatchViewFillKind_ThreadLocals,
RD_WatchViewFillKind_Types,
RD_WatchViewFillKind_Procedures,
RD_WatchViewFillKind_COUNT
}
RD_WatchViewFillKind;
typedef struct RD_WatchViewPoint RD_WatchViewPoint; typedef struct RD_WatchViewPoint RD_WatchViewPoint;
struct RD_WatchViewPoint struct RD_WatchViewPoint
{ {
@@ -123,9 +107,6 @@ struct RD_WatchViewState
{ {
B32 initialized; B32 initialized;
// rjf: fill kinds (way that the contents of the watch view are computed)
RD_WatchViewFillKind fill_kind;
// rjf: column state // rjf: column state
Arena *column_arena; Arena *column_arena;
RD_WatchViewColumn *first_column; RD_WatchViewColumn *first_column;
@@ -176,7 +157,7 @@ internal RD_WatchViewColumn *rd_watch_view_column_alloc_(RD_WatchViewState *wv,
internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col); internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col);
//- rjf: watch view main hooks //- rjf: watch view main hooks
internal void rd_watch_view_init(RD_WatchViewState *ewv, RD_WatchViewFillKind fill_kind); internal void rd_watch_view_init(RD_WatchViewState *ewv);
internal void rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect); internal void rd_watch_view_build(RD_WatchViewState *ewv, String8 root_expr, String8 root_view_rule, B32 modifiable, U32 default_radix, Rng2F32 rect);
#endif // RADDBG_VIEWS_H #endif // RADDBG_VIEWS_H