mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
eliminate ad-hoc meta eval info type tables; switch to base layer meta type info; do first pass of shifting serialization of meta evals to meta type info driven system
This commit is contained in:
+1
-1
@@ -46,7 +46,7 @@ load_paths =
|
||||
commands =
|
||||
{
|
||||
//- rjf: fkey command slots (change locally but do not commit)
|
||||
.f1 = { .win = "build ryan_scratch", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||
.f1 = { .win = "build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||
.f2 = { .win = "build rdi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||
.f3 = { .win = "pushd build && raddbg.exe --user:local_dev.raddbg_user --project:local_dev.raddbg_project --auto_step && popd",.linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },
|
||||
|
||||
|
||||
@@ -343,3 +343,13 @@ deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSeriali
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8 data_srlz = serialized_from_typed_data(scratch.arena, type, data, params);
|
||||
String8 data_copy = deserialized_from_typed_data(arena, type, data_srlz, params);
|
||||
scratch_end(scratch);
|
||||
return data_copy;
|
||||
}
|
||||
|
||||
+87
-42
@@ -63,12 +63,6 @@ struct EmbedInfoTable
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Info Types
|
||||
|
||||
typedef U32 TypeFlags;
|
||||
enum
|
||||
{
|
||||
TypeFlag_Indexified = (1<<0),
|
||||
};
|
||||
|
||||
typedef enum TypeKind
|
||||
{
|
||||
TypeKind_Null,
|
||||
@@ -123,7 +117,6 @@ typedef struct Type Type;
|
||||
struct Type
|
||||
{
|
||||
TypeKind kind;
|
||||
TypeFlags flags;
|
||||
U64 size;
|
||||
Type *direct;
|
||||
String8 name;
|
||||
@@ -156,46 +149,96 @@ struct TypeSerializeParams
|
||||
|
||||
#define type(T) &(T##__type)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Info Table Initializer Helpers
|
||||
|
||||
#define member_lit_comp(S, T, m, ...) {str8_lit_comp(#m), type(T), OffsetOf(S, m), __VA_ARGS__}
|
||||
#define struct_members(S) read_only global Member S##__members[] =
|
||||
#define struct_type(S) read_only global Type S##__type = {TypeKind_Struct, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members}
|
||||
#define ptr_type(name, t, ...) read_only global Type name = {TypeKind_Ptr, sizeof(void *), (t), __VA_ARGS__}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
|
||||
read_only global Type type_nil = {TypeKind_Null, 0, 0, &type_nil};
|
||||
read_only global Type void__type = {TypeKind_Void, 0, 0, &type_nil, str8_lit_comp("void")};
|
||||
read_only global Type U8__type = {TypeKind_U8, 0, sizeof(U8), &type_nil, str8_lit_comp("U8")};
|
||||
read_only global Type U16__type = {TypeKind_U16, 0, sizeof(U16), &type_nil, str8_lit_comp("U16")};
|
||||
read_only global Type U32__type = {TypeKind_U32, 0, sizeof(U32), &type_nil, str8_lit_comp("U32")};
|
||||
read_only global Type U64__type = {TypeKind_U64, 0, sizeof(U64), &type_nil, str8_lit_comp("U64")};
|
||||
read_only global Type S8__type = {TypeKind_S8, 0, sizeof(S8), &type_nil, str8_lit_comp("S8")};
|
||||
read_only global Type S16__type = {TypeKind_S16, 0, sizeof(S16), &type_nil, str8_lit_comp("S16")};
|
||||
read_only global Type S32__type = {TypeKind_S32, 0, sizeof(S32), &type_nil, str8_lit_comp("S32")};
|
||||
read_only global Type S64__type = {TypeKind_S64, 0, sizeof(S64), &type_nil, str8_lit_comp("S64")};
|
||||
read_only global Type B8__type = {TypeKind_B8, 0, sizeof(B8), &type_nil, str8_lit_comp("B8")};
|
||||
read_only global Type B16__type = {TypeKind_B16, 0, sizeof(B16), &type_nil, str8_lit_comp("B16")};
|
||||
read_only global Type B32__type = {TypeKind_B32, 0, sizeof(B32), &type_nil, str8_lit_comp("B32")};
|
||||
read_only global Type B64__type = {TypeKind_B64, 0, sizeof(B64), &type_nil, str8_lit_comp("B64")};
|
||||
read_only global Type F32__type = {TypeKind_F32, 0, sizeof(F32), &type_nil, str8_lit_comp("F32")};
|
||||
read_only global Type F64__type = {TypeKind_F64, 0, sizeof(F64), &type_nil, str8_lit_comp("F64")};
|
||||
read_only global Type *type_leaves[] =
|
||||
{
|
||||
&type_nil,
|
||||
type(void),
|
||||
type(U8),
|
||||
type(U16),
|
||||
type(U32),
|
||||
type(U64),
|
||||
type(S8),
|
||||
type(S16),
|
||||
type(S32),
|
||||
type(S64),
|
||||
type(B8),
|
||||
type(B16),
|
||||
type(B32),
|
||||
type(B64),
|
||||
type(F32),
|
||||
type(F64),
|
||||
};
|
||||
read_only global Type type_nil = {TypeKind_Null, 0, &type_nil};
|
||||
read_only global Member member_nil = {{0}, &type_nil};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Built-In Types
|
||||
|
||||
//- rjf: leaves
|
||||
read_only global Type void__type = {TypeKind_Void, 0, &type_nil, str8_lit_comp("void")};
|
||||
read_only global Type U8__type = {TypeKind_U8, sizeof(U8), &type_nil, str8_lit_comp("U8")};
|
||||
read_only global Type U16__type = {TypeKind_U16, sizeof(U16), &type_nil, str8_lit_comp("U16")};
|
||||
read_only global Type U32__type = {TypeKind_U32, sizeof(U32), &type_nil, str8_lit_comp("U32")};
|
||||
read_only global Type U64__type = {TypeKind_U64, sizeof(U64), &type_nil, str8_lit_comp("U64")};
|
||||
read_only global Type S8__type = {TypeKind_S8, sizeof(S8), &type_nil, str8_lit_comp("S8")};
|
||||
read_only global Type S16__type = {TypeKind_S16, sizeof(S16), &type_nil, str8_lit_comp("S16")};
|
||||
read_only global Type S32__type = {TypeKind_S32, sizeof(S32), &type_nil, str8_lit_comp("S32")};
|
||||
read_only global Type S64__type = {TypeKind_S64, sizeof(S64), &type_nil, str8_lit_comp("S64")};
|
||||
read_only global Type B8__type = {TypeKind_B8, sizeof(B8), &type_nil, str8_lit_comp("B8")};
|
||||
read_only global Type B16__type = {TypeKind_B16, sizeof(B16), &type_nil, str8_lit_comp("B16")};
|
||||
read_only global Type B32__type = {TypeKind_B32, sizeof(B32), &type_nil, str8_lit_comp("B32")};
|
||||
read_only global Type B64__type = {TypeKind_B64, sizeof(B64), &type_nil, str8_lit_comp("B64")};
|
||||
read_only global Type F32__type = {TypeKind_F32, sizeof(F32), &type_nil, str8_lit_comp("F32")};
|
||||
read_only global Type F64__type = {TypeKind_F64, sizeof(F64), &type_nil, str8_lit_comp("F64")};
|
||||
|
||||
//- rjf: String8
|
||||
Type String8__str_ptr_type = {TypeKind_Ptr, sizeof(void *), type(U8), {0}, str8_lit_comp("size")};
|
||||
Member String8__members[] =
|
||||
{
|
||||
{str8_lit_comp("str"), &String8__str_ptr_type, OffsetOf(String8, str)},
|
||||
{str8_lit_comp("size"), type(U64), OffsetOf(String8, size)},
|
||||
};
|
||||
Type String8__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
sizeof(String8),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8"),
|
||||
{0},
|
||||
ArrayCount(String8__members),
|
||||
String8__members,
|
||||
};
|
||||
|
||||
//- rjf: String8Node
|
||||
extern Type String8Node__type;
|
||||
Type String8Node__ptr_type = {TypeKind_Ptr, sizeof(void *), &String8Node__type};
|
||||
Member String8Node__members[] =
|
||||
{
|
||||
{str8_lit_comp("next"), &String8Node__ptr_type, OffsetOf(String8Node, next)},
|
||||
{str8_lit_comp("string"), type(String8), OffsetOf(String8Node, string)},
|
||||
};
|
||||
Type String8Node__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
sizeof(String8Node),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8Node"),
|
||||
{0},
|
||||
ArrayCount(String8Node__members),
|
||||
String8Node__members,
|
||||
};
|
||||
|
||||
//- rjf: String8List
|
||||
Member String8List__members[] =
|
||||
{
|
||||
{str8_lit_comp("first"), &String8Node__ptr_type, OffsetOf(String8List, first)},
|
||||
{str8_lit_comp("last"), &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize},
|
||||
{str8_lit_comp("node_count"), type(U64), OffsetOf(String8List, node_count)},
|
||||
{str8_lit_comp("total_size"), type(U64), OffsetOf(String8List, total_size)},
|
||||
};
|
||||
Type String8List__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
sizeof(String8List),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8List"),
|
||||
{0},
|
||||
ArrayCount(String8List__members),
|
||||
String8List__members,
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Info Lookups
|
||||
|
||||
@@ -206,7 +249,9 @@ internal Member *member_from_name(Type *type, String8 name);
|
||||
|
||||
internal String8 serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);
|
||||
internal String8 deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);
|
||||
internal String8 deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);
|
||||
#define serialized_from_struct(arena, T, ptr, ...) serialized_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__})
|
||||
#define struct_from_serialized(arena, T, string, ...) (T *)deserialized_from_typed_data((arena), type(T), (string), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str
|
||||
#define deep_copy_from_struct(arena, T, ptr, ...) (T *)deep_copy_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str
|
||||
|
||||
#endif // BASE_META_H
|
||||
|
||||
@@ -1,72 +1,6 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Type Information
|
||||
|
||||
@table(name info_type eval_type dynamic_kind)
|
||||
CTRL_MetaEvalMemberTable:
|
||||
{
|
||||
{enabled S32 S32 }
|
||||
{frozen S32 S32 }
|
||||
{hit_count U64 U64 }
|
||||
{id U64 U64 }
|
||||
{color U32 U32 }
|
||||
{label String8 U64 String8 }
|
||||
{location String8 U64 String8 }
|
||||
{condition String8 U64 String8 }
|
||||
{callstack CTRL_MetaEvalFrameArray U64 FrameArray }
|
||||
}
|
||||
|
||||
@struct CTRL_MetaEvalFrameArray:
|
||||
{
|
||||
`U64 *frames`;
|
||||
`U64 count`;
|
||||
}
|
||||
|
||||
@enum CTRL_MetaEvalDynamicKind:
|
||||
{
|
||||
Null,
|
||||
String8,
|
||||
FrameArray,
|
||||
COUNT
|
||||
}
|
||||
|
||||
@struct CTRL_MetaEvalInfo:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `$(a.info_type) $(a.name)`
|
||||
}
|
||||
|
||||
@struct CTRL_MetaEval:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `$(a.eval_type) $(a.name)`
|
||||
}
|
||||
|
||||
@data(String8) ctrl_meta_eval_member_name_table:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `str8_lit_comp("$(a.name)")`
|
||||
}
|
||||
|
||||
@data(Rng1U64) ctrl_meta_eval_info_member_range_table:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `{OffsetOf(CTRL_MetaEvalInfo, $(a.name)), OffsetOf(CTRL_MetaEvalInfo, $(a.name)) + sizeof($(a.info_type))}`
|
||||
}
|
||||
|
||||
@data(Rng1U64) ctrl_meta_eval_member_range_table:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `{OffsetOf(CTRL_MetaEval, $(a.name)), OffsetOf(CTRL_MetaEval, $(a.name)) + sizeof($(a.eval_type))}`
|
||||
}
|
||||
|
||||
@data(E_TypeKind) ctrl_meta_eval_member_type_kind_table:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `E_TypeKind_$(a.eval_type)`
|
||||
}
|
||||
|
||||
@data(CTRL_MetaEvalDynamicKind) ctrl_meta_eval_member_dynamic_kind_table:
|
||||
{
|
||||
@expand(CTRL_MetaEvalMemberTable a) `$(a.dynamic_kind != '' -> 'CTRL_MetaEvalDynamicKind_'..a.dynamic_kind)$(a.dynamic_kind == '' -> 'CTRL_MetaEvalDynamicKind_Null')`
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Entity Kinds
|
||||
|
||||
|
||||
+9
-96
@@ -185,68 +185,6 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src)
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Type Functions
|
||||
|
||||
internal CTRL_MetaEval *
|
||||
ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info)
|
||||
{
|
||||
CTRL_MetaEval *eval = push_array(arena, CTRL_MetaEval, 1);
|
||||
{
|
||||
for(U64 idx = 0; idx < ArrayCount(ctrl_meta_eval_info_member_range_table); idx += 1)
|
||||
{
|
||||
switch(ctrl_meta_eval_member_dynamic_kind_table[idx])
|
||||
{
|
||||
default:
|
||||
case CTRL_MetaEvalDynamicKind_Null:
|
||||
{
|
||||
MemoryCopy((U8 *)eval + ctrl_meta_eval_member_range_table[idx].min,
|
||||
(U8 *)info + ctrl_meta_eval_info_member_range_table[idx].min,
|
||||
dim_1u64(ctrl_meta_eval_member_range_table[idx]));
|
||||
}break;
|
||||
case CTRL_MetaEvalDynamicKind_String8:
|
||||
{
|
||||
String8 string = *(String8 *)((U8 *)info + ctrl_meta_eval_info_member_range_table[idx].min);
|
||||
String8 string_copy = push_str8_copy(arena, string);
|
||||
U64 off = (string_copy.str - (U8 *)eval);
|
||||
MemoryCopy((U8 *)eval + ctrl_meta_eval_member_range_table[idx].min, &off, sizeof(U64));
|
||||
}break;
|
||||
case CTRL_MetaEvalDynamicKind_FrameArray:
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal CTRL_MetaEvalInfoArray
|
||||
ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src)
|
||||
{
|
||||
CTRL_MetaEvalInfoArray dst = {0};
|
||||
dst.count = src->count;
|
||||
dst.v = push_array(arena, CTRL_MetaEvalInfo, dst.count);
|
||||
MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count);
|
||||
for(U64 idx = 0; idx < dst.count; idx += 1)
|
||||
{
|
||||
for(U64 member_idx = 0; member_idx < ArrayCount(ctrl_meta_eval_info_member_range_table); member_idx += 1)
|
||||
{
|
||||
switch(ctrl_meta_eval_member_dynamic_kind_table[member_idx])
|
||||
{
|
||||
default:{}break;
|
||||
case CTRL_MetaEvalDynamicKind_String8:
|
||||
{
|
||||
String8 string = *(String8 *)((U8 *)(&dst.v[idx]) + ctrl_meta_eval_info_member_range_table[member_idx].min);
|
||||
String8 string_copy = push_str8_copy(arena, string);
|
||||
MemoryCopy((U8 *)(&dst.v[idx]) + ctrl_meta_eval_info_member_range_table[member_idx].min, &string_copy, sizeof(String8));
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Message Type Functions
|
||||
|
||||
@@ -262,7 +200,7 @@ ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src)
|
||||
dst->env_string_list = str8_list_copy(arena, &src->env_string_list);
|
||||
dst->traps = ctrl_trap_list_copy(arena, &src->traps);
|
||||
dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps);
|
||||
dst->meta_eval_infos = ctrl_meta_eval_info_array_copy(arena, &src->meta_eval_infos);
|
||||
dst->meta_evals = *deep_copy_from_struct(arena, CTRL_MetaEvalArray, &src->meta_evals);
|
||||
}
|
||||
|
||||
//- rjf: list building
|
||||
@@ -386,6 +324,9 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)
|
||||
}
|
||||
|
||||
// rjf: write meta-eval-info array
|
||||
String8 meta_evals_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEvalArray, &msg->meta_evals);
|
||||
str8_serial_push_string(scratch.arena, &msgs_srlzed, meta_evals_srlzed);
|
||||
#if 0
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->meta_eval_infos.count);
|
||||
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
|
||||
{
|
||||
@@ -408,6 +349,7 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
String8 string = str8_serial_end(arena, &msgs_srlzed);
|
||||
@@ -521,6 +463,9 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string)
|
||||
}
|
||||
|
||||
// rjf: read meta-eval-info array
|
||||
String8 meta_evals_srlzed = str8_skip(string, read_off);
|
||||
msg->meta_evals = *struct_from_serialized(arena, CTRL_MetaEvalArray, meta_evals_srlzed);
|
||||
#if 0
|
||||
read_off += str8_deserial_read_struct(string, read_off, &msg->meta_eval_infos.count);
|
||||
msg->meta_eval_infos.v = push_array(arena, CTRL_MetaEvalInfo, msg->meta_eval_infos.count);
|
||||
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
|
||||
@@ -547,6 +492,7 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return msgs;
|
||||
@@ -1259,39 +1205,6 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list)
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta-Eval Functions
|
||||
|
||||
internal E_TypeKey
|
||||
ctrl_meta_eval_type_key(void)
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
E_MemberList members = {0};
|
||||
{
|
||||
for(U64 idx = 0; idx < ArrayCount(ctrl_meta_eval_member_range_table); idx += 1)
|
||||
{
|
||||
E_TypeKey member_type_key = e_type_key_basic(ctrl_meta_eval_member_type_kind_table[idx]);
|
||||
switch(ctrl_meta_eval_member_dynamic_kind_table[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case CTRL_MetaEvalDynamicKind_String8:
|
||||
{
|
||||
member_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8));
|
||||
}break;
|
||||
}
|
||||
e_member_list_push_new(scratch.arena, &members, .name = ctrl_meta_eval_member_name_table[idx], .off = ctrl_meta_eval_member_range_table[idx].min, .type_key = member_type_key);
|
||||
}
|
||||
}
|
||||
E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);
|
||||
E_TypeKey meta_eval_type_key = e_type_key_cons(.arch = arch_from_context(),
|
||||
.kind = E_TypeKind_Struct,
|
||||
.name = str8_lit("Meta"),
|
||||
.members = members_array.v,
|
||||
.count = members_array.count);
|
||||
scratch_end(scratch);
|
||||
return meta_eval_type_key;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Main Layer Initialization
|
||||
|
||||
|
||||
+44
-29
@@ -12,6 +12,49 @@ typedef U64 CTRL_MachineID;
|
||||
|
||||
#define CTRL_MachineID_Local (1)
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Types
|
||||
|
||||
//- rjf: meta evaluation instance
|
||||
typedef struct CTRL_MetaEval CTRL_MetaEval;
|
||||
struct CTRL_MetaEval
|
||||
{
|
||||
#define CTRL_MetaEval_MemberXList \
|
||||
X(B32, enabled)\
|
||||
X(B32, frozen)\
|
||||
X(U64, hit_count)\
|
||||
X(U64, id)\
|
||||
X(U32, color)\
|
||||
X(String8, label)\
|
||||
X(String8, location)\
|
||||
X(String8, condition)
|
||||
#define X(type, name) type name;
|
||||
CTRL_MetaEval_MemberXList
|
||||
#undef X
|
||||
};
|
||||
struct_members(CTRL_MetaEval)
|
||||
{
|
||||
#define X(type, name) member_lit_comp(CTRL_MetaEval, type, name),
|
||||
CTRL_MetaEval_MemberXList
|
||||
#undef X
|
||||
};
|
||||
struct_type(CTRL_MetaEval);
|
||||
|
||||
//- rjf: meta evaluation array
|
||||
typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray;
|
||||
struct CTRL_MetaEvalArray
|
||||
{
|
||||
CTRL_MetaEval *v;
|
||||
U64 count;
|
||||
};
|
||||
ptr_type(CTRL_MetaEvalArray__v_ptr_type, type(CTRL_MetaEval), .count_delimiter_name = str8_lit_comp("count"));
|
||||
struct_members(CTRL_MetaEvalArray)
|
||||
{
|
||||
{str8_lit_comp("v"), &CTRL_MetaEvalArray__v_ptr_type, OffsetOf(CTRL_MetaEvalArray, v)},
|
||||
member_lit_comp(CTRL_MetaEvalArray, U64, count),
|
||||
};
|
||||
struct_type(CTRL_MetaEvalArray);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Entity Handle Types
|
||||
|
||||
@@ -253,23 +296,6 @@ struct CTRL_UserBreakpointList
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Types
|
||||
|
||||
typedef struct CTRL_MetaEvalInfoArray CTRL_MetaEvalInfoArray;
|
||||
struct CTRL_MetaEvalInfoArray
|
||||
{
|
||||
CTRL_MetaEvalInfo *v;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray;
|
||||
struct CTRL_MetaEvalArray
|
||||
{
|
||||
CTRL_MetaEval *v;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Spaces
|
||||
|
||||
@@ -324,7 +350,7 @@ struct CTRL_Msg
|
||||
String8List env_string_list;
|
||||
CTRL_TrapList traps;
|
||||
CTRL_UserBreakpointList user_bps;
|
||||
CTRL_MetaEvalInfoArray meta_eval_infos;
|
||||
CTRL_MetaEvalArray meta_evals;
|
||||
};
|
||||
|
||||
typedef struct CTRL_MsgNode CTRL_MsgNode;
|
||||
@@ -709,12 +735,6 @@ internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src);
|
||||
internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp);
|
||||
internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Type Functions
|
||||
|
||||
internal CTRL_MetaEval *ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info);
|
||||
internal CTRL_MetaEvalInfoArray ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Message Type Functions
|
||||
|
||||
@@ -788,11 +808,6 @@ internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_En
|
||||
//- rjf: applying events to entity caches
|
||||
internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta-Eval Functions
|
||||
|
||||
internal E_TypeKey ctrl_meta_eval_type_key(void);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Main Layer Initialization
|
||||
|
||||
|
||||
@@ -4,71 +4,6 @@
|
||||
//- GENERATED CODE
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
String8 ctrl_meta_eval_member_name_table[9] =
|
||||
{
|
||||
str8_lit_comp("enabled"),
|
||||
str8_lit_comp("frozen"),
|
||||
str8_lit_comp("hit_count"),
|
||||
str8_lit_comp("id"),
|
||||
str8_lit_comp("color"),
|
||||
str8_lit_comp("label"),
|
||||
str8_lit_comp("location"),
|
||||
str8_lit_comp("condition"),
|
||||
str8_lit_comp("callstack"),
|
||||
};
|
||||
|
||||
Rng1U64 ctrl_meta_eval_info_member_range_table[9] =
|
||||
{
|
||||
{OffsetOf(CTRL_MetaEvalInfo, enabled), OffsetOf(CTRL_MetaEvalInfo, enabled) + sizeof(S32)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, frozen), OffsetOf(CTRL_MetaEvalInfo, frozen) + sizeof(S32)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, hit_count), OffsetOf(CTRL_MetaEvalInfo, hit_count) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, id), OffsetOf(CTRL_MetaEvalInfo, id) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, color), OffsetOf(CTRL_MetaEvalInfo, color) + sizeof(U32)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, label), OffsetOf(CTRL_MetaEvalInfo, label) + sizeof(String8)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, location), OffsetOf(CTRL_MetaEvalInfo, location) + sizeof(String8)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, condition), OffsetOf(CTRL_MetaEvalInfo, condition) + sizeof(String8)},
|
||||
{OffsetOf(CTRL_MetaEvalInfo, callstack), OffsetOf(CTRL_MetaEvalInfo, callstack) + sizeof(CTRL_MetaEvalFrameArray)},
|
||||
};
|
||||
|
||||
Rng1U64 ctrl_meta_eval_member_range_table[9] =
|
||||
{
|
||||
{OffsetOf(CTRL_MetaEval, enabled), OffsetOf(CTRL_MetaEval, enabled) + sizeof(S32)},
|
||||
{OffsetOf(CTRL_MetaEval, frozen), OffsetOf(CTRL_MetaEval, frozen) + sizeof(S32)},
|
||||
{OffsetOf(CTRL_MetaEval, hit_count), OffsetOf(CTRL_MetaEval, hit_count) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEval, id), OffsetOf(CTRL_MetaEval, id) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEval, color), OffsetOf(CTRL_MetaEval, color) + sizeof(U32)},
|
||||
{OffsetOf(CTRL_MetaEval, label), OffsetOf(CTRL_MetaEval, label) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEval, location), OffsetOf(CTRL_MetaEval, location) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEval, condition), OffsetOf(CTRL_MetaEval, condition) + sizeof(U64)},
|
||||
{OffsetOf(CTRL_MetaEval, callstack), OffsetOf(CTRL_MetaEval, callstack) + sizeof(U64)},
|
||||
};
|
||||
|
||||
E_TypeKind ctrl_meta_eval_member_type_kind_table[9] =
|
||||
{
|
||||
E_TypeKind_S32,
|
||||
E_TypeKind_S32,
|
||||
E_TypeKind_U64,
|
||||
E_TypeKind_U64,
|
||||
E_TypeKind_U32,
|
||||
E_TypeKind_U64,
|
||||
E_TypeKind_U64,
|
||||
E_TypeKind_U64,
|
||||
E_TypeKind_U64,
|
||||
};
|
||||
|
||||
CTRL_MetaEvalDynamicKind ctrl_meta_eval_member_dynamic_kind_table[9] =
|
||||
{
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_String8,
|
||||
CTRL_MetaEvalDynamicKind_String8,
|
||||
CTRL_MetaEvalDynamicKind_String8,
|
||||
CTRL_MetaEvalDynamicKind_FrameArray,
|
||||
};
|
||||
|
||||
String8 ctrl_entity_kind_display_string_table[8] =
|
||||
{
|
||||
{0},
|
||||
|
||||
@@ -6,14 +6,6 @@
|
||||
#ifndef CTRL_META_H
|
||||
#define CTRL_META_H
|
||||
|
||||
typedef enum CTRL_MetaEvalDynamicKind
|
||||
{
|
||||
CTRL_MetaEvalDynamicKind_Null,
|
||||
CTRL_MetaEvalDynamicKind_String8,
|
||||
CTRL_MetaEvalDynamicKind_FrameArray,
|
||||
CTRL_MetaEvalDynamicKind_COUNT,
|
||||
} CTRL_MetaEvalDynamicKind;
|
||||
|
||||
typedef enum CTRL_EntityKind
|
||||
{
|
||||
CTRL_EntityKind_Null,
|
||||
@@ -70,47 +62,7 @@ CTRL_ExceptionCodeKind_Win32DirectXDebugLayer,
|
||||
CTRL_ExceptionCodeKind_COUNT,
|
||||
} CTRL_ExceptionCodeKind;
|
||||
|
||||
typedef struct CTRL_MetaEvalFrameArray CTRL_MetaEvalFrameArray;
|
||||
struct CTRL_MetaEvalFrameArray
|
||||
{
|
||||
U64 *frames;
|
||||
U64 count;
|
||||
};
|
||||
|
||||
typedef struct CTRL_MetaEvalInfo CTRL_MetaEvalInfo;
|
||||
struct CTRL_MetaEvalInfo
|
||||
{
|
||||
S32 enabled;
|
||||
S32 frozen;
|
||||
U64 hit_count;
|
||||
U64 id;
|
||||
U32 color;
|
||||
String8 label;
|
||||
String8 location;
|
||||
String8 condition;
|
||||
CTRL_MetaEvalFrameArray callstack;
|
||||
};
|
||||
|
||||
typedef struct CTRL_MetaEval CTRL_MetaEval;
|
||||
struct CTRL_MetaEval
|
||||
{
|
||||
S32 enabled;
|
||||
S32 frozen;
|
||||
U64 hit_count;
|
||||
U64 id;
|
||||
U32 color;
|
||||
U64 label;
|
||||
U64 location;
|
||||
U64 condition;
|
||||
U64 callstack;
|
||||
};
|
||||
|
||||
C_LINKAGE_BEGIN
|
||||
extern String8 ctrl_meta_eval_member_name_table[9];
|
||||
extern Rng1U64 ctrl_meta_eval_info_member_range_table[9];
|
||||
extern Rng1U64 ctrl_meta_eval_member_range_table[9];
|
||||
extern E_TypeKind ctrl_meta_eval_member_type_kind_table[9];
|
||||
extern CTRL_MetaEvalDynamicKind ctrl_meta_eval_member_dynamic_kind_table[9];
|
||||
extern String8 ctrl_entity_kind_display_string_table[8];
|
||||
extern U32 ctrl_exception_code_kind_code_table[38];
|
||||
extern String8 ctrl_exception_code_kind_display_string_table[38];
|
||||
|
||||
@@ -1570,7 +1570,7 @@ d_init(void)
|
||||
}
|
||||
|
||||
internal D_EventList
|
||||
d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalInfoArray *meta_eval_infos)
|
||||
d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalArray *meta_evals)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -2125,7 +2125,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
msg->cmd_line_string_list = cmdln_strings;
|
||||
msg->env_inherit = 1;
|
||||
MemoryCopyArray(msg->exception_code_filters, exception_code_filters);
|
||||
MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos);
|
||||
MemoryCopyStruct(&msg->meta_evals, meta_evals);
|
||||
str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name);
|
||||
msg->env_string_list = env;
|
||||
}
|
||||
@@ -2165,7 +2165,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
msg->exit_code = 1;
|
||||
msg->entity = process->handle;
|
||||
MemoryCopyArray(msg->exception_code_filters, exception_code_filters);
|
||||
MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos);
|
||||
MemoryCopyStruct(&msg->meta_evals, meta_evals);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2192,7 +2192,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
msg->kind = CTRL_MsgKind_Detach;
|
||||
msg->entity = n->v->handle;
|
||||
MemoryCopyArray(msg->exception_code_filters, exception_code_filters);
|
||||
MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos);
|
||||
MemoryCopyStruct(&msg->meta_evals, meta_evals);
|
||||
}
|
||||
}break;
|
||||
case D_CmdKind_Continue:
|
||||
@@ -2469,7 +2469,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
msg->kind = CTRL_MsgKind_Attach;
|
||||
msg->entity_id = pid;
|
||||
MemoryCopyArray(msg->exception_code_filters, exception_code_filters);
|
||||
MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos);
|
||||
MemoryCopyStruct(&msg->meta_evals, meta_evals);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
@@ -2491,7 +2491,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
msg->entity = run_thread->handle;
|
||||
msg->parent = process->handle;
|
||||
MemoryCopyArray(msg->exception_code_filters, exception_code_filters);
|
||||
MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos);
|
||||
MemoryCopyStruct(&msg->meta_evals, meta_evals);
|
||||
MemoryCopyStruct(&msg->traps, &run_traps);
|
||||
D_BreakpointArray *bp_batches[] =
|
||||
{
|
||||
|
||||
@@ -523,6 +523,6 @@ internal B32 d_next_cmd(D_Cmd **cmd);
|
||||
//~ rjf: Main Layer Top-Level Calls
|
||||
|
||||
internal void d_init(void);
|
||||
internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalInfoArray *meta_eval_infos);
|
||||
internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalArray *meta_evals);
|
||||
|
||||
#endif // DBG_ENGINE_CORE_H
|
||||
|
||||
@@ -4,6 +4,37 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Kind Enum Functions
|
||||
|
||||
internal E_TypeKind
|
||||
e_type_kind_from_base(TypeKind kind)
|
||||
{
|
||||
E_TypeKind result = E_TypeKind_Null;
|
||||
switch(kind)
|
||||
{
|
||||
default:{}break;
|
||||
case TypeKind_Void: {result = E_TypeKind_Void;}break;
|
||||
case TypeKind_U8: {result = E_TypeKind_U8;}break;
|
||||
case TypeKind_U16: {result = E_TypeKind_U16;}break;
|
||||
case TypeKind_U32: {result = E_TypeKind_U32;}break;
|
||||
case TypeKind_U64: {result = E_TypeKind_U64;}break;
|
||||
case TypeKind_S8: {result = E_TypeKind_S8;}break;
|
||||
case TypeKind_S16: {result = E_TypeKind_S16;}break;
|
||||
case TypeKind_S32: {result = E_TypeKind_S32;}break;
|
||||
case TypeKind_S64: {result = E_TypeKind_S64;}break;
|
||||
case TypeKind_B8: {result = E_TypeKind_S8;}break;
|
||||
case TypeKind_B16: {result = E_TypeKind_S16;}break;
|
||||
case TypeKind_B32: {result = E_TypeKind_S32;}break;
|
||||
case TypeKind_B64: {result = E_TypeKind_S64;}break;
|
||||
case TypeKind_F32: {result = E_TypeKind_F32;}break;
|
||||
case TypeKind_F64: {result = E_TypeKind_F64;}break;
|
||||
case TypeKind_Ptr: {result = E_TypeKind_Ptr;}break;
|
||||
case TypeKind_Array: {result = E_TypeKind_Array;}break;
|
||||
case TypeKind_Struct:{result = E_TypeKind_Struct;}break;
|
||||
case TypeKind_Union: {result = E_TypeKind_Union;}break;
|
||||
case TypeKind_Enum: {result = E_TypeKind_Enum;}break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
internal E_TypeKind
|
||||
e_type_kind_from_rdi(RDI_TypeKind kind)
|
||||
{
|
||||
@@ -404,6 +435,63 @@ e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key)
|
||||
return key;
|
||||
}
|
||||
|
||||
internal E_TypeKey
|
||||
e_type_key_cons_base(Type *type, String8 name)
|
||||
{
|
||||
E_TypeKey result = e_type_key_zero();
|
||||
switch(type->kind)
|
||||
{
|
||||
default:
|
||||
if(TypeKind_FirstLeaf <= type->kind && type->kind <= TypeKind_LastLeaf)
|
||||
{
|
||||
E_TypeKind kind = e_type_kind_from_base(type->kind);
|
||||
result = e_type_key_basic(kind);
|
||||
}break;
|
||||
case TypeKind_Struct:
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
E_MemberList members = {0};
|
||||
for(U64 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
E_TypeKey member_type_key = e_type_key_cons_base(type->members[idx].type, str8_zero());
|
||||
e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key);
|
||||
}
|
||||
E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);
|
||||
result = e_type_key_cons(.arch = arch_from_context(),
|
||||
.kind = E_TypeKind_Struct,
|
||||
.name = name,
|
||||
.members = members_array.v,
|
||||
.count = members_array.count);
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
}
|
||||
return result;
|
||||
#if 0
|
||||
E_MemberList members = {0};
|
||||
{
|
||||
for(U64 idx = 0; idx < ArrayCount(ctrl_meta_eval_member_range_table); idx += 1)
|
||||
{
|
||||
E_TypeKey member_type_key = e_type_key_basic(ctrl_meta_eval_member_type_kind_table[idx]);
|
||||
switch(ctrl_meta_eval_member_dynamic_kind_table[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case CTRL_MetaEvalDynamicKind_String8:
|
||||
{
|
||||
member_type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8));
|
||||
}break;
|
||||
}
|
||||
e_member_list_push_new(scratch.arena, &members, .name = ctrl_meta_eval_member_name_table[idx], .off = ctrl_meta_eval_member_range_table[idx].min, .type_key = member_type_key);
|
||||
}
|
||||
}
|
||||
E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);
|
||||
E_TypeKey meta_eval_type_key = e_type_key_cons(.arch = arch_from_context(),
|
||||
.kind = E_TypeKind_Struct,
|
||||
.name = str8_lit("Meta"),
|
||||
.members = members_array.v,
|
||||
.count = members_array.count);
|
||||
#endif
|
||||
}
|
||||
|
||||
//- rjf: basic type key functions
|
||||
|
||||
internal B32
|
||||
|
||||
@@ -202,6 +202,7 @@ thread_static E_TypeState *e_type_state = 0;
|
||||
////////////////////////////////
|
||||
//~ rjf: Type Kind Enum Functions
|
||||
|
||||
internal E_TypeKind e_type_kind_from_base(TypeKind kind);
|
||||
internal E_TypeKind e_type_kind_from_rdi(RDI_TypeKind kind);
|
||||
internal E_MemberKind e_member_kind_from_rdi(RDI_MemberKind kind);
|
||||
internal RDI_EvalTypeGroup e_type_group_from_kind(E_TypeKind kind);
|
||||
@@ -242,6 +243,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
|
||||
//- 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_ptr(Arch arch, E_TypeKey element_type_key);
|
||||
internal E_TypeKey e_type_key_cons_base(Type *type, String8 name);
|
||||
|
||||
//- rjf: basic type key functions
|
||||
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);
|
||||
|
||||
+36
-35
@@ -1856,13 +1856,14 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
|
||||
}
|
||||
}break;
|
||||
case CTRL_EvalSpaceKind_Meta:
|
||||
if(space.u64_0 < rd_state->meta_eval_infos.count)
|
||||
if(space.u64_0 < rd_state->meta_evals.count)
|
||||
{
|
||||
CTRL_MetaEvalInfo *info = &rd_state->meta_eval_infos.v[space.u64_0];
|
||||
CTRL_MetaEval *eval = &rd_state->meta_evals.v[space.u64_0];
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
arena_push(scratch.arena, 0, 64);
|
||||
void *offsetify_base = arena_push(scratch.arena, 0, 64);
|
||||
U64 pos_min = arena_pos(scratch.arena);
|
||||
CTRL_MetaEval *eval = ctrl_meta_eval_from_info(scratch.arena, info);
|
||||
TypeSerializePtrRefInfo str_ptr_ref_info = { type(U8), .offsetify_base = offsetify_base};
|
||||
String8 eval_srlzed = serialized_from_struct(scratch.arena, CTRL_MetaEval, eval, .ptr_ref_infos_count = 1, .ptr_ref_infos = &str_ptr_ref_info);
|
||||
U64 pos_opl = arena_pos(scratch.arena);
|
||||
Rng1U64 legal_range = r1u64(0, pos_opl-pos_min);
|
||||
if(contains_1u64(legal_range, range.min))
|
||||
@@ -1870,7 +1871,7 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
|
||||
result = 1;
|
||||
U64 range_dim = dim_1u64(range);
|
||||
U64 bytes_to_read = Min(range_dim, (legal_range.max - range.min));
|
||||
MemoryCopy(out, ((U8 *)eval) + range.min, bytes_to_read);
|
||||
MemoryCopy(out, (eval_srlzed.str) + range.min, bytes_to_read);
|
||||
if(bytes_to_read < range_dim)
|
||||
{
|
||||
MemoryZero((U8 *)out + bytes_to_read, range_dim - bytes_to_read);
|
||||
@@ -10306,28 +10307,28 @@ rd_frame(void)
|
||||
CTRL_EntityKind_Thread,
|
||||
CTRL_EntityKind_Module,
|
||||
};
|
||||
U64 meta_eval_info_count = 0;
|
||||
U64 meta_eval_count = 0;
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_entity_kinds); idx += 1)
|
||||
{
|
||||
RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_entity_kinds[idx]);
|
||||
meta_eval_info_count += list.count;
|
||||
meta_eval_count += list.count;
|
||||
}
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_ctrl_entity_kinds); idx += 1)
|
||||
{
|
||||
CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, evallable_ctrl_entity_kinds[idx]);
|
||||
meta_eval_info_count += list.count;
|
||||
meta_eval_count += list.count;
|
||||
}
|
||||
rd_state->meta_eval_infos.count = meta_eval_info_count;
|
||||
rd_state->meta_eval_infos.v = push_array(scratch.arena, CTRL_MetaEvalInfo, rd_state->meta_eval_infos.count);
|
||||
U64 meta_eval_info_idx = 0;
|
||||
rd_state->meta_evals.count = meta_eval_count;
|
||||
rd_state->meta_evals.v = push_array(scratch.arena, CTRL_MetaEval, rd_state->meta_evals.count);
|
||||
U64 meta_eval_idx = 0;
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_entity_kinds); idx += 1)
|
||||
{
|
||||
RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_entity_kinds[idx]);
|
||||
switch(evallable_entity_kinds[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_eval_infos_bps_idx_range.min = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_eval_infos_wps_idx_range.min = idx;}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_evals_bps_idx_range.min = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_evals_wps_idx_range.min = idx;}break;
|
||||
}
|
||||
for(RD_EntityNode *n = list.first; n != 0; n = n->next)
|
||||
{
|
||||
@@ -10345,20 +10346,20 @@ rd_frame(void)
|
||||
loc_string = push_str8f(scratch.arena, "0x%I64x", loc->vaddr);
|
||||
}
|
||||
String8 cnd_string = push_str8_copy(scratch.arena, cnd->string);
|
||||
CTRL_MetaEvalInfo *mei = &rd_state->meta_eval_infos.v[meta_eval_info_idx];
|
||||
mei->enabled = !entity->disabled;
|
||||
mei->hit_count = entity->u64;
|
||||
mei->color = u32_from_rgba(rd_rgba_from_entity(entity));
|
||||
mei->label = label_string;
|
||||
mei->location = loc_string;
|
||||
mei->condition = cnd_string;
|
||||
meta_eval_info_idx += 1;
|
||||
CTRL_MetaEval *meval = &rd_state->meta_evals.v[meta_eval_idx];
|
||||
meval->enabled = !entity->disabled;
|
||||
meval->hit_count = entity->u64;
|
||||
meval->color = u32_from_rgba(rd_rgba_from_entity(entity));
|
||||
meval->label = label_string;
|
||||
meval->location = loc_string;
|
||||
meval->condition = cnd_string;
|
||||
meta_eval_idx += 1;
|
||||
}
|
||||
switch(evallable_entity_kinds[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_eval_infos_bps_idx_range.max = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_eval_infos_wps_idx_range.max = idx;}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_evals_bps_idx_range.max = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_evals_wps_idx_range.max = idx;}break;
|
||||
}
|
||||
}
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_ctrl_entity_kinds); idx += 1)
|
||||
@@ -10367,12 +10368,12 @@ rd_frame(void)
|
||||
for(CTRL_EntityNode *n = list.first; n != 0; n = n->next)
|
||||
{
|
||||
CTRL_Entity *entity = n->v;
|
||||
CTRL_MetaEvalInfo *mei = &rd_state->meta_eval_infos.v[meta_eval_info_idx];
|
||||
mei->label = entity->string;
|
||||
mei->id = entity->id;
|
||||
mei->color = entity->rgba;
|
||||
// TODO(rjf): @msgs
|
||||
meta_eval_info_idx += 1;
|
||||
CTRL_MetaEval *meval = &rd_state->meta_evals.v[meta_eval_idx];
|
||||
meval->frozen = entity->is_frozen;
|
||||
meval->color = entity->rgba;
|
||||
meval->label = entity->string;
|
||||
meval->id = entity->id;
|
||||
meta_eval_idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10441,10 +10442,10 @@ rd_frame(void)
|
||||
|
||||
//- rjf: add macros for meta evaluations
|
||||
{
|
||||
E_TypeKey meta_eval_type_key = ctrl_meta_eval_type_key();
|
||||
for(U64 idx = 0; idx < rd_state->meta_eval_infos.count; idx += 1)
|
||||
E_TypeKey meta_eval_type_key = e_type_key_cons_base(type(CTRL_MetaEval), str8_lit("debugger_entity"));
|
||||
for(U64 idx = 0; idx < rd_state->meta_evals.count; idx += 1)
|
||||
{
|
||||
CTRL_MetaEvalInfo *mei = &rd_state->meta_eval_infos.v[idx];
|
||||
CTRL_MetaEval *meval = &rd_state->meta_evals.v[idx];
|
||||
E_Space space = e_space_make(CTRL_EvalSpaceKind_Meta);
|
||||
space.u64_0 = idx;
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
@@ -10452,9 +10453,9 @@ rd_frame(void)
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = meta_eval_type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", idx), expr);
|
||||
if(mei->label.size != 0)
|
||||
if(meval->label.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, mei->label, expr);
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, meval->label, expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14500,7 +14501,7 @@ rd_frame(void)
|
||||
//- rjf: tick debug engine
|
||||
//
|
||||
U64 cmd_count_pre_tick = rd_state->cmds[0].count;
|
||||
D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, &rd_state->meta_eval_infos);
|
||||
D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, &rd_state->meta_evals);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: no selected thread? -> try to snap to any existing thread
|
||||
|
||||
@@ -804,9 +804,9 @@ struct RD_State
|
||||
F32 frame_dt;
|
||||
|
||||
// rjf: meta evaluation info
|
||||
CTRL_MetaEvalInfoArray meta_eval_infos;
|
||||
Rng1U64 meta_eval_infos_bps_idx_range;
|
||||
Rng1U64 meta_eval_infos_wps_idx_range;
|
||||
CTRL_MetaEvalArray meta_evals;
|
||||
Rng1U64 meta_evals_bps_idx_range;
|
||||
Rng1U64 meta_evals_wps_idx_range;
|
||||
|
||||
// rjf: registers stack
|
||||
RD_RegsNode base_regs;
|
||||
|
||||
@@ -1043,11 +1043,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, B32 modifiable, U32 default_radix, R
|
||||
//
|
||||
case RD_WatchViewFillKind_Breakpoints:
|
||||
{
|
||||
E_TypeKey meta_eval_type = ctrl_meta_eval_type_key();
|
||||
E_TypeKey meta_eval_type = e_type_key_cons_base(type(CTRL_MetaEval), str8_lit("debugger_entity"));
|
||||
mutable_entity_kind = RD_EntityKind_Breakpoint;
|
||||
ev_view_rule_list_push_string(scratch.arena, &top_level_view_rules, str8_lit("no_addr"));
|
||||
RD_EntityList bps = rd_query_cached_entity_list_with_kind(mutable_entity_kind);
|
||||
U64 idx = rd_state->meta_eval_infos_bps_idx_range.min;
|
||||
U64 idx = rd_state->meta_evals_bps_idx_range.min;
|
||||
for(RD_EntityNode *n = bps.first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
RD_Entity *bp = n->entity;
|
||||
@@ -1075,7 +1075,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, B32 modifiable, U32 default_radix, R
|
||||
{
|
||||
mutable_entity_kind = RD_EntityKind_WatchPin;
|
||||
RD_EntityList wps = rd_query_cached_entity_list_with_kind(mutable_entity_kind);
|
||||
U64 idx = rd_state->meta_eval_infos_wps_idx_range.min;
|
||||
U64 idx = rd_state->meta_evals_wps_idx_range.min;
|
||||
for(RD_EntityNode *n = wps.first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
RD_Entity *wp = n->entity;
|
||||
|
||||
@@ -52,75 +52,6 @@ struct FooBar
|
||||
String8 name;
|
||||
};
|
||||
|
||||
//-
|
||||
|
||||
Type String8__str_ptr_type = {TypeKind_Ptr, 0, sizeof(void *), type(U8), {0}, str8_lit_comp("size")};
|
||||
|
||||
Member String8__members[] =
|
||||
{
|
||||
{str8_lit_comp("str"), &String8__str_ptr_type, OffsetOf(String8, str)},
|
||||
{str8_lit_comp("size"), type(U64), OffsetOf(String8, size)},
|
||||
};
|
||||
|
||||
Type String8__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
0,
|
||||
sizeof(String8),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8"),
|
||||
{0},
|
||||
ArrayCount(String8__members),
|
||||
String8__members,
|
||||
};
|
||||
|
||||
//-
|
||||
|
||||
extern Type String8Node__type;
|
||||
Type String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type};
|
||||
|
||||
Member String8Node__members[] =
|
||||
{
|
||||
{str8_lit_comp("next"), &String8Node__ptr_type, OffsetOf(String8Node, next)},
|
||||
{str8_lit_comp("string"), type(String8), OffsetOf(String8Node, string)},
|
||||
};
|
||||
|
||||
Type String8Node__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
0,
|
||||
sizeof(String8Node),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8Node"),
|
||||
{0},
|
||||
ArrayCount(String8Node__members),
|
||||
String8Node__members,
|
||||
};
|
||||
|
||||
//-
|
||||
|
||||
Member String8List__members[] =
|
||||
{
|
||||
{str8_lit_comp("first"), &String8Node__ptr_type, OffsetOf(String8List, first)},
|
||||
{str8_lit_comp("last"), &String8Node__ptr_type, OffsetOf(String8List, last), MemberFlag_DoNotSerialize},
|
||||
{str8_lit_comp("node_count"), type(U64), OffsetOf(String8List, node_count)},
|
||||
{str8_lit_comp("total_size"), type(U64), OffsetOf(String8List, total_size)},
|
||||
};
|
||||
|
||||
Type String8List__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
0,
|
||||
sizeof(String8List),
|
||||
&type_nil,
|
||||
str8_lit_comp("String8List"),
|
||||
{0},
|
||||
ArrayCount(String8List__members),
|
||||
String8List__members,
|
||||
};
|
||||
|
||||
//-
|
||||
|
||||
Member FooBar__members[] =
|
||||
{
|
||||
{str8_lit_comp("x"), type(U64), OffsetOf(FooBar, x)},
|
||||
@@ -132,7 +63,6 @@ Member FooBar__members[] =
|
||||
Type FooBar__type =
|
||||
{
|
||||
TypeKind_Struct,
|
||||
0,
|
||||
sizeof(FooBar),
|
||||
&type_nil,
|
||||
str8_lit_comp("FooBar"),
|
||||
|
||||
Reference in New Issue
Block a user