From 4cc5f636fe8ec63bec4bf844c26cf5c3c44268c6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 27 Jan 2025 15:33:35 -0800 Subject: [PATCH] cfg tree collection evaluation --- src/eval/eval.mdesk | 1 + src/eval/eval_bundles.c | 4 +- src/eval/eval_interpret.c | 25 +- src/eval/eval_interpret.h | 1 + src/eval/eval_ir.c | 200 +++---- src/eval/eval_ir.h | 9 +- src/eval/eval_types.c | 17 + src/eval/eval_types.h | 1 + src/eval/generated/eval.meta.c | 6 +- src/eval/generated/eval.meta.h | 5 +- src/raddbg/generated/raddbg.meta.c | 49 +- src/raddbg/generated/raddbg.meta.h | 34 +- src/raddbg/raddbg.mdesk | 10 +- src/raddbg/raddbg_core.c | 843 +++++++++++------------------ src/raddbg/raddbg_core.h | 23 +- 15 files changed, 505 insertions(+), 723 deletions(-) diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 135213cb..5fc62ece 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -71,6 +71,7 @@ E_TypeKindTable: {IncompleteEnum "enum" 0 } {Bitfield "bitfield" 0 } {Variadic "variadic" 0 } + {SpacePtr "space_ptr" 0 } } @table(name op_kind precedence string op_pre op_sep op_pos) diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 5cdf357c..15cf1087 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -11,13 +11,11 @@ e_eval_from_expr(Arena *arena, E_Expr *expr) E_OpList oplist = e_oplist_from_irtree(arena, irtree.root); String8 bytecode = e_bytecode_from_oplist(arena, &oplist); E_Interpretation interp = e_interpret(bytecode); - E_Space zero_space = {0}; - E_Space space = (MemoryMatchStruct(&zero_space, &irtree.space) ? e_interpret_ctx->primary_space : irtree.space); E_Eval eval = { .value = interp.value, .mode = irtree.mode, - .space = space, + .space = interp.space, .expr = expr, .type_key = irtree.type_key, .code = interp.code, diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index c7c824a4..e507c46b 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -74,7 +74,8 @@ e_interpret(String8 bytecode) } else switch(op) { - case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break; + case E_IRExtKind_SetSpace: {ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break; + case E_IRExtKind_DerefSpacePtr:{ctrlbits = RDI_EVAL_CTRLBITS(0, 1, 1);}break; default: { result.code = E_InterpretationCode_BadOp; @@ -124,6 +125,27 @@ e_interpret(String8 bytecode) MemoryCopy(&selected_space, &imm, sizeof(selected_space)); }break; + case E_IRExtKind_DerefSpacePtr: + { + U64 addr = svals[0].u64; + U64 size = sizeof(E_Space) + sizeof(U64); + typedef struct SpacePtrRead SpacePtrRead; + struct SpacePtrRead + { + E_Space space; + U64 off; + }; + SpacePtrRead space_ptr_read = {0}; + B32 good_read = e_space_read(selected_space, &space_ptr_read, r1u64(addr, addr+size)); + if(!good_read) + { + result.code = E_InterpretationCode_BadMemRead; + goto done; + } + MemoryCopyStruct(&selected_space, &space_ptr_read.space); + nval.u64 = space_ptr_read.off; + }break; + case RDI_EvalOp_Stop: { goto done; @@ -812,6 +834,7 @@ e_interpret(String8 bytecode) { result.value = stack[0]; } + result.space = selected_space; scratch_end(scratch); return result; } diff --git a/src/eval/eval_interpret.h b/src/eval/eval_interpret.h index 3a9d0b51..68c6b029 100644 --- a/src/eval/eval_interpret.h +++ b/src/eval/eval_interpret.h @@ -11,6 +11,7 @@ typedef struct E_Interpretation E_Interpretation; struct E_Interpretation { E_Value value; + E_Space space; E_InterpretationCode code; }; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 49fdda40..4b9957b8 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -145,6 +145,16 @@ e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space) list->encoded_size += 1 + sizeof(space); } +internal void +e_oplist_push_deref_space_ptr(Arena *arena, E_OpList *list) +{ + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = E_IRExtKind_DerefSpacePtr; + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1; +} + internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string) { @@ -274,7 +284,15 @@ e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c) } internal E_IRNode * -e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key) +e_irtree_deref_space_ptr(Arena *arena, E_IRNode *c) +{ + E_IRNode *root = e_push_irnode(arena, E_IRExtKind_DerefSpacePtr); + e_irnode_push_child(root, c); + return root; +} + +internal E_IRNode * +e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key) { E_IRNode *result = &e_irnode_nil; U64 byte_size = e_type_byte_size_from_key(type_key); @@ -296,11 +314,8 @@ e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_ e_irnode_push_child(with_trunc, read_node); } - // rjf: set space for this mem read - E_IRNode *set_space_node = e_irtree_set_space(arena, space, with_trunc); - // rjf: fill - result = set_space_node; + result = with_trunc; return result; } @@ -358,12 +373,12 @@ e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in) } internal E_IRNode * -e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key) +e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key) { E_IRNode *result = tree; if(from_mode == E_Mode_Offset) { - result = e_irtree_mem_read_type(arena, from_space, tree, type_key); + result = e_irtree_mem_read_type(arena, tree, type_key); } return result; } @@ -371,7 +386,7 @@ e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_ //- rjf: top-level irtree/type extraction internal E_IRTreeAndType -e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) +e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr *expr) { E_IRTreeAndType result = {&e_irnode_nil}; E_ExprKind kind = expr->kind; @@ -382,7 +397,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) //- rjf: references -> just descend to sub-expr case E_ExprKind_Ref: { - result = e_irtree_and_type_from_expr(arena, expr->ref); + result = e_irtree_and_type_from_expr__space(arena, current_space, expr->ref); }break; //- rjf: array indices @@ -391,8 +406,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: unpack left/right expressions E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; - E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl); - E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr); + E_IRTreeAndType l = e_irtree_and_type_from_expr__space(arena, current_space, exprl); + E_IRTreeAndType r = e_irtree_and_type_from_expr__space(arena, current_space, exprr); E_TypeKey l_restype = e_type_unwrap(l.type_key); E_TypeKey r_restype = e_type_unwrap(r.type_key); E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); @@ -446,7 +461,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) case E_Mode_Offset: { // rjf: ops to compute the offset - E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype); if(direct_type_size > 1) { E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); @@ -457,7 +472,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *base_tree = l.root; if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value) { - base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype); + base_tree = e_irtree_resolve_to_value(arena, l.mode, base_tree, l_restype); } // rjf: ops to compute the final address @@ -468,7 +483,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) case E_Mode_Value: { // rjf: ops to compute the offset - E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype); if(direct_type_size > 1) { E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); @@ -488,7 +503,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = direct_type; result.mode = l.mode; - result.space = l.space; }break; //- rjf: member accesses @@ -497,7 +511,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: unpack left/right expressions E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; - E_IRTreeAndType l = e_irtree_and_type_from_expr(arena, exprl); + E_IRTreeAndType l = e_irtree_and_type_from_expr__space(arena, current_space, exprl); E_TypeKey l_restype = e_type_unwrap(l.type_key); E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); E_TypeKey check_type_key = l_restype; @@ -589,7 +603,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) l_restype_kind == E_TypeKind_LRef || l_restype_kind == E_TypeKind_RRef) { - new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); + new_tree = e_irtree_resolve_to_value(arena, l.mode, new_tree, l_restype); mode = E_Mode_Offset; } if(r_value != 0 && !r_is_constant_value) @@ -607,7 +621,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = r_type; result.mode = mode; - result.space = l.space; } }break; @@ -616,7 +629,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); E_TypeKey r_type = e_type_unwrap(r_tree.type_key); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); E_TypeKey r_type_direct = e_type_direct_from_key(r_type); @@ -658,12 +671,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) r_type_kind == E_TypeKind_LRef || r_type_kind == E_TypeKind_RRef)) { - new_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + new_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); } result.root = new_tree; result.type_key = r_type_direct; result.mode = E_Mode_Offset; - result.space = r_tree.space; } }break; @@ -672,7 +684,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); E_TypeKey r_type = r_tree.type_key; E_TypeKey r_type_unwrapped = e_type_unwrap(r_type); E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped); @@ -692,7 +704,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = r_tree.root; 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.space = r_tree.space; }break; //- rjf: cast @@ -704,7 +715,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_TypeKey cast_type = e_type_from_expr(cast_type_expr); E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type); U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type); - E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr); + E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr__space(arena, current_space, casted_expr); e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); E_TypeKey casted_type = e_type_unwrap(casted_tree.type_key); E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type); @@ -736,7 +747,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.space, casted_tree.mode, casted_tree.root, casted_type); + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type); E_IRNode *new_tree = in_tree; if(conversion_rule == RDI_EvalConversionKind_Legal) { @@ -749,7 +760,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = cast_type; result.mode = E_Mode_Value; - result.space = casted_tree.space; } }break; @@ -771,10 +781,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) }break; default: { - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); r_type = r_tree.type_key; - space = r_tree.space; }break; } @@ -794,7 +803,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = e_irtree_const_u(arena, r_type_byte_size); result.type_key = e_type_key_basic(E_TypeKind_U64); result.mode = E_Mode_Value; - result.space = space; } }break; @@ -803,14 +811,13 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { // rjf: evaluate operand tree E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); // rjf: fill output result.root = e_irtree_const_u(arena, 0); result.type_key = r_tree.type_key; result.mode = E_Mode_Null; - result.space = r_tree.space; }break; //- rjf: byteswap @@ -818,12 +825,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_unwrap(r_tree.type_key); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); U64 r_type_size = e_type_byte_size_from_key(r_type); - E_Space space = r_tree.space; // rjf: bad conditions? -> error if applicable, exit if(!e_type_kind_is_integer(r_type_kind) || (r_type_size != 8 && r_type_size != 4 && r_type_size != 2)) @@ -835,12 +841,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { E_IRNode *node = e_push_irnode(arena, RDI_EvalOp_ByteSwap); - E_IRNode *rhs = e_irtree_resolve_to_value(arena, space, r_tree.mode, r_tree.root, r_type); + E_IRNode *rhs = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); e_irnode_push_child(node, rhs); node->value.u64 = r_type_size; result.root = node; result.mode = E_Mode_Value; - result.space = space; result.type_key = r_type; } }break; @@ -848,7 +853,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) //- rjf: unary operations case E_ExprKind_Pos: { - result = e_irtree_and_type_from_expr(arena, expr->first); + result = e_irtree_and_type_from_expr__space(arena, current_space, expr->first); }break; case E_ExprKind_Neg: case E_ExprKind_LogNot: @@ -856,7 +861,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); E_TypeKey r_type = e_type_unwrap(r_tree.type_key); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); @@ -877,13 +882,12 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type); E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree); result.root = new_tree; result.type_key = r_type_promoted; result.mode = E_Mode_Value; - result.space = r_tree.space; } }break; @@ -912,8 +916,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) B32 is_comparison = e_expr_kind_is_comparison(kind); E_Expr *l_expr = expr->first; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType l_tree = e_irtree_and_type_from_expr__space(arena, current_space, l_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey l_type = e_type_unwrap_enum(e_type_unwrap(l_tree.type_key)); @@ -1011,20 +1015,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { E_TypeKey final_type_key = is_comparison ? e_type_key_basic(E_TypeKind_Bool) : l_type; - E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); - E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); l_value_tree = e_irtree_convert_hi(arena, l_value_tree, l_type, l_type); r_value_tree = e_irtree_convert_hi(arena, r_value_tree, l_type, r_type); E_IRNode *new_tree = e_irtree_binary_op(arena, op, l_type_group, l_value_tree, r_value_tree); result.root = new_tree; result.type_key = final_type_key; result.mode = E_Mode_Value; - result.space = l_tree.space; - E_Space zero_space = {0}; - if(MemoryMatchStruct(&result.space, &zero_space)) - { - result.space = r_tree.space; - } } }break; @@ -1051,10 +1049,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *ptr_root = ptr_tree->root; if(!ptr_is_decay) { - ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_root, ptr_tree->type_key); + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_root, ptr_tree->type_key); } E_IRNode *int_root = int_tree->root; - int_root = e_irtree_resolve_to_value(arena, int_tree->space, int_tree->mode, int_root, int_tree->type_key); + int_root = e_irtree_resolve_to_value(arena, int_tree->mode, int_root, int_tree->type_key); if(direct_type_size > 1) { E_IRNode *const_root = e_irtree_const_u(arena, direct_type_size); @@ -1069,12 +1067,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_root; result.type_key = ptr_type; result.mode = E_Mode_Value; - result.space = l_tree.space; - E_Space zero_space = {0}; - if(MemoryMatchStruct(&result.space, &zero_space)) - { - result.space = r_tree.space; - } } }break; @@ -1090,11 +1082,11 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *r_root = r_tree.root; if(!l_is_decay) { - l_root = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_root, l_type); + l_root = e_irtree_resolve_to_value(arena, l_tree.mode, l_root, l_type); } if(!r_is_decay) { - r_root = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_root, r_type); + r_root = e_irtree_resolve_to_value(arena, r_tree.mode, r_root, r_type); } E_IRNode *op_tree = e_irtree_binary_op_u(arena, op, l_root, r_root); E_IRNode *new_tree = op_tree; @@ -1106,12 +1098,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = e_type_key_basic(E_TypeKind_U64); result.mode = E_Mode_Value; - result.space = l_tree.space; - E_Space zero_space = {0}; - if(MemoryMatchStruct(&result.space, &zero_space)) - { - result.space = r_tree.space; - } }break; //- rjf: pointer array comparison @@ -1133,22 +1119,16 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRNode *arr_root = arr_tree->root; if(!ptr_is_decay) { - ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->space, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key); + ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key); } // rjf: read from pointer into value, to compare with array - E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_tree->space, ptr_root, arr_tree->type_key); + E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_root, arr_tree->type_key); // rjf: generate result.root = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, mem_root, arr_root); result.type_key = e_type_key_basic(E_TypeKind_Bool); result.mode = E_Mode_Value; - result.space = ptr_tree->space; - E_Space zero_space = {0}; - if(MemoryMatchStruct(&result.space, &zero_space)) - { - result.space = arr_tree->space; - } }break; } }break; @@ -1160,9 +1140,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_Expr *c_expr = expr->first; E_Expr *l_expr = c_expr->next; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType c_tree = e_irtree_and_type_from_expr(arena, c_expr); - E_IRTreeAndType l_tree = e_irtree_and_type_from_expr(arena, l_expr); - E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); + E_IRTreeAndType c_tree = e_irtree_and_type_from_expr__space(arena, current_space, c_expr); + E_IRTreeAndType l_tree = e_irtree_and_type_from_expr__space(arena, current_space, l_expr); + E_IRTreeAndType r_tree = e_irtree_and_type_from_expr__space(arena, current_space, r_expr); e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1190,21 +1170,15 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: generate { - E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.space, c_tree.mode, c_tree.root, c_type); - E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.space, l_tree.mode, l_tree.root, l_type); - E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.space, r_tree.mode, r_tree.root, r_type); + E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.mode, c_tree.root, c_type); + E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type); + E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type); l_value_tree = e_irtree_convert_hi(arena, l_value_tree, result_type, l_type); r_value_tree = e_irtree_convert_hi(arena, r_value_tree, result_type, r_type); E_IRNode *new_tree = e_irtree_conditional(arena, c_value_tree, l_value_tree, r_value_tree); result.root = new_tree; result.type_key = result_type; result.mode = E_Mode_Value; - result.space = l_expr->space; - E_Space zero_space = {0}; - if(MemoryMatchStruct(&result.space, &zero_space)) - { - result.space = r_expr->space; - } } }break; @@ -1216,7 +1190,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = final_type_key; result.mode = expr->mode; - result.space = expr->space; }break; //- rjf: (unexpected) leaf member @@ -1290,7 +1263,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) else { e_string2expr_map_inc_poison(e_ir_ctx->macro_map, expr->string); - result = e_irtree_and_type_from_expr(arena, macro_expr); + result = e_irtree_and_type_from_expr__space(arena, current_space, macro_expr); e_string2expr_map_dec_poison(e_ir_ctx->macro_map, expr->string); } }break; @@ -1303,7 +1276,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = new_tree; result.type_key = expr->type_key; result.mode = E_Mode_Offset; - result.space = expr->space; }break; //- rjf: leaf file paths @@ -1317,7 +1289,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = set_space; result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), size); result.mode = E_Mode_Offset; - result.space = space; }break; //- rjf: types @@ -1326,7 +1297,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = e_irtree_const_u(arena, 0); result.type_key = expr->type_key; result.mode = E_Mode_Null; - result.space = expr->space; }break; //- rjf: (unexpected) type expressions @@ -1342,15 +1312,19 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { E_Expr *lhs = expr->first; E_Expr *rhs = expr->last; - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); - E_Space space = lhs_irtree.space; + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr__space(arena, current_space, lhs); U64 line_num = rhs->value.u64; B32 space_is_good = 1; + E_Space space = {0}; if(lhs_irtree.root->op != E_IRExtKind_SetSpace) { space_is_good = 0; e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, lhs->location, "Cannot take a line from a non-file."); } + else + { + MemoryCopy(&space, &lhs_irtree.root->value, sizeof(space)); + } B32 line_num_is_good = 1; if(rhs->kind != E_ExprKind_LeafU64) { @@ -1372,7 +1346,6 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) result.root = set_space; result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), line_size); result.mode = E_Mode_Offset; - result.space = space; } else { @@ -1387,15 +1360,40 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { E_Expr *lhs = expr->first; E_Expr *rhs = lhs->next; - result = e_irtree_and_type_from_expr(arena, rhs); + result = e_irtree_and_type_from_expr__space(arena, current_space, rhs); if(lhs->kind != E_ExprKind_LeafIdent) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left side of assignment must be an unused identifier."); } }break; - } + //- rjf: evaluating a space pointer -> generate a dynamic set-space & resolve to the offset + if(e_type_kind_from_key(result.type_key) == E_TypeKind_SpacePtr) + { + result.root = e_irtree_deref_space_ptr(arena, result.root); + result.type_key = e_type_direct_from_key(result.type_key); + result.mode = E_Mode_Offset; + } + + //- rjf: if the expression's space does not match the current, then push a set-space node + // before returning + E_Space zero_space = zero_struct; + if(!MemoryMatchStruct(current_space, &expr->space) && + !MemoryMatchStruct(&zero_space, &expr->space)) + { + result.root = e_irtree_set_space(arena, expr->space, result.root); + *current_space = expr->space; + } + + return result; +} + +internal E_IRTreeAndType +e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) +{ + E_Space space = e_interpret_ctx->primary_space; + E_IRTreeAndType result = e_irtree_and_type_from_expr__space(arena, &space, expr); return result; } @@ -1429,7 +1427,17 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) { e_append_oplist_from_irtree(arena, child, out); } - + }break; + + case E_IRExtKind_DerefSpacePtr: + { + for(E_IRNode *child = root->first; + child != &e_irnode_nil; + child = child->next) + { + e_append_oplist_from_irtree(arena, child, out); + } + e_oplist_push_deref_space_ptr(arena, out); }break; case RDI_EvalOp_Cond: diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index d5485c1f..ed54188b 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -11,6 +11,7 @@ enum { E_IRExtKind_Bytecode = RDI_EvalOp_COUNT, E_IRExtKind_SetSpace, + E_IRExtKind_DerefSpacePtr, E_IRExtKind_COUNT }; @@ -52,7 +53,6 @@ struct E_IRTreeAndType E_IRNode *root; E_TypeKey type_key; E_Mode mode; - E_Space space; E_MsgList msgs; }; @@ -92,6 +92,7 @@ internal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x); internal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x); internal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode); internal void e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space); +internal void e_oplist_push_deref_space_ptr(Arena *arena, E_OpList *list); internal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); @@ -108,13 +109,15 @@ internal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, internal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode); internal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string); internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c); -internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key); +internal E_IRNode *e_irtree_deref_space_ptr(Arena *arena, E_IRNode *c); +internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key); internal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in); internal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key); internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in); -internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); +internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); //- rjf: top-level irtree/type extraction +internal E_IRTreeAndType e_irtree_and_type_from_expr__space(Arena *arena, E_Space *current_space, E_Expr *expr); internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); //- rjf: irtree -> linear ops/bytecode diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 13ba76f5..ec47d860 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -427,6 +427,10 @@ e_type_key_cons_(E_ConsTypeParams *params) { node->byte_size = bit_size_from_arch(node->params.arch)/8; }break; + case E_TypeKind_SpacePtr: + { + node->byte_size = sizeof(U64) + sizeof(E_Space); + }break; case E_TypeKind_Array: { U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key); @@ -458,6 +462,13 @@ e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags) return key; } +internal E_TypeKey +e_type_key_cons_space_ptr(E_TypeKey direct_type_key) +{ + E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_SpacePtr, .direct_key = direct_type_key); + return key; +} + internal E_TypeKey e_type_key_cons_base(Type *type) { @@ -1699,6 +1710,12 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr str8_list_push(arena, out, str8_lit("*")); }break; + case E_TypeKind_SpacePtr: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); + }break; + case E_TypeKind_LRef: { E_TypeKey direct = e_type_direct_from_key(key); diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index ee4da7ba..9009c04c 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -294,6 +294,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, E_TypeFlags flags); +internal E_TypeKey e_type_key_cons_space_ptr(E_TypeKey direct_type_key); internal E_TypeKey e_type_key_cons_base(Type *type); //- rjf: basic type key functions diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 228ef2fd..1d5e9291 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -135,7 +135,7 @@ E_OpInfo e_expr_kind_op_info_table[49] = { E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") }, }; -U8 e_kind_basic_byte_size_table[55] = +U8 e_kind_basic_byte_size_table[56] = { 0, 0, @@ -192,9 +192,10 @@ U8 e_kind_basic_byte_size_table[55] = 0, 0, 0, +0, }; -String8 e_kind_basic_string_table[55] = +String8 e_kind_basic_string_table[56] = { str8_lit_comp(""), str8_lit_comp("void"), @@ -251,6 +252,7 @@ str8_lit_comp("class"), str8_lit_comp("enum"), str8_lit_comp("bitfield"), str8_lit_comp("variadic"), +str8_lit_comp("space_ptr"), }; C_LINKAGE_END diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 2dc6342f..225aa598 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -74,6 +74,7 @@ E_TypeKind_IncompleteClass, E_TypeKind_IncompleteEnum, E_TypeKind_Bitfield, E_TypeKind_Variadic, +E_TypeKind_SpacePtr, E_TypeKind_COUNT, E_TypeKind_FirstBasic = E_TypeKind_Void, E_TypeKind_LastBasic = E_TypeKind_ComplexF128, @@ -163,8 +164,8 @@ extern String8 e_token_kind_strings[6]; extern String8 e_expr_kind_strings[49]; extern String8 e_interpretation_code_display_strings[11]; extern E_OpInfo e_expr_kind_op_info_table[49]; -extern U8 e_kind_basic_byte_size_table[55]; -extern String8 e_kind_basic_string_table[55]; +extern U8 e_kind_basic_byte_size_table[56]; +extern String8 e_kind_basic_string_table[56]; C_LINKAGE_END diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index e218d564..586781d7 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -710,14 +710,9 @@ str8_lit_comp("5"), str8_lit_comp("c"), }; -String8 rd_collection_name_table[18] = +String8 rd_collection_name_table[13] = { str8_lit_comp("watches"), -str8_lit_comp("targets"), -str8_lit_comp("breakpoints"), -str8_lit_comp("watch_pins"), -str8_lit_comp("file_path_maps"), -str8_lit_comp("auto_view_rules"), str8_lit_comp("machines"), str8_lit_comp("processes"), str8_lit_comp("threads"), @@ -732,14 +727,9 @@ str8_lit_comp("types"), str8_lit_comp("procedures"), }; -RD_EntityKind rd_collection_entity_kind_table[18] = +RD_EntityKind rd_collection_entity_kind_table[13] = { RD_EntityKind_Watch, -RD_EntityKind_Target, -RD_EntityKind_Breakpoint, -RD_EntityKind_WatchPin, -RD_EntityKind_FilePathMap, -RD_EntityKind_AutoViewRule, RD_EntityKind_Nil, RD_EntityKind_Nil, RD_EntityKind_Nil, @@ -754,14 +744,9 @@ RD_EntityKind_Nil, RD_EntityKind_Nil, }; -CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18] = +CTRL_EntityKind rd_collection_ctrl_entity_kind_table[13] = { CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, -CTRL_EntityKind_Null, CTRL_EntityKind_Machine, CTRL_EntityKind_Process, CTRL_EntityKind_Thread, @@ -776,14 +761,9 @@ CTRL_EntityKind_Null, CTRL_EntityKind_Null, }; -EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18] = +EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[13] = { EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(targets), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(breakpoints), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watch_pins), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(file_path_maps), -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(auto_view_rules), 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), @@ -798,14 +778,9 @@ 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[18] = +EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[13] = { EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watches), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(targets), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(breakpoints), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watch_pins), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(file_path_maps), -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(auto_view_rules), 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), @@ -820,14 +795,9 @@ 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[18] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[13] = { EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(targets), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(breakpoints), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watch_pins), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(file_path_maps), -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(auto_view_rules), 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), @@ -842,14 +812,9 @@ 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[18] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[13] = { EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(targets), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(breakpoints), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watch_pins), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(file_path_maps), -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(auto_view_rules), 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), diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 897039d7..4e96eefb 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -651,11 +651,6 @@ RD_ViewRuleUIFunctionType *ui; .os_event = rd_regs()->os_event,\ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watches); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps); -EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules); 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); @@ -669,11 +664,6 @@ 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(watches); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps); -EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules); 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); @@ -687,11 +677,6 @@ 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(watches); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps); -EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules); 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); @@ -703,11 +688,6 @@ 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(watches); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps); -EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules); 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); @@ -768,13 +748,13 @@ extern RD_StringBindingPair rd_default_binding_table[110]; 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[18]; -extern RD_EntityKind rd_collection_entity_kind_table[18]; -extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18]; -extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18]; -extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18]; +extern String8 rd_collection_name_table[13]; +extern RD_EntityKind rd_collection_entity_kind_table[13]; +extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[13]; +extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[13]; +extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[13]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[13]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[13]; 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 f456797c..e1ee91a5 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -988,11 +988,11 @@ RD_CollectionTable: { //- rjf: frontend entity groups {watches Watch Null x} - {targets Target Null x} - {breakpoints Breakpoint Null x} - {watch_pins WatchPin Null x} - {file_path_maps FilePathMap Null x} - {auto_view_rules AutoViewRule Null x} + //{targets Target Null x} + //{breakpoints Breakpoint Null x} + //{watch_pins WatchPin Null x} + //{file_path_maps FilePathMap Null x} + //{auto_view_rules AutoViewRule Null x} //- rjf: control entity groups {machines Nil Machine x} diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 857fb023..9aadb180 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -759,6 +759,20 @@ rd_cfg_top_level_list_from_string(Arena *arena, String8 string) return result; } +internal RD_CfgArray +rd_cfg_array_from_list(Arena *arena, RD_CfgList *list) +{ + RD_CfgArray array = {0}; + array.count = list->count; + array.v = push_array_no_zero(arena, RD_Cfg *, array.count); + U64 idx = 0; + for(RD_CfgNode *n = list->first; n != 0; n = n->next, idx += 1) + { + array.v[idx] = n->v; + } + return array; +} + internal RD_CfgList rd_cfg_tree_list_from_string(Arena *arena, String8 string) { @@ -941,7 +955,7 @@ rd_cfg_list_push(Arena *arena, RD_CfgList *list, RD_Cfg *cfg) { RD_CfgNode *n = push_array(arena, RD_CfgNode, 1); n->v = cfg; - SLLQueuePush(list->first, list->last, n); + DLLPushBack(list->first, list->last, n); list->count += 1; } @@ -2427,9 +2441,23 @@ rd_eval_blob_from_cfg(Arena *arena, RD_Cfg *cfg) MD_Node *member_schema = md_child_from_string(schema, child_name, 0); String8 member_type_name = member_schema->first->string; RD_Cfg *child = rd_cfg_child_from_string(cfg, child_name); - if(str8_match(member_type_name, str8_lit("code_string"), 0) || - str8_match(member_type_name, str8_lit("path"), 0) || - str8_match(member_type_name, str8_lit("string"), 0)) + if(str8_match(member_type_name, str8_lit("location"), 0)) + { + U64 off = type->byte_size + variable_width_parts.total_size; + str8_list_push(scratch.arena, &fixed_width_parts, push_str8_copy(scratch.arena, str8_struct(&off))); + for(RD_Cfg *loc_child = child->first; loc_child != &rd_nil_cfg; loc_child = loc_child->first) + { + if(loc_child != child->first) + { + str8_list_push(scratch.arena, &variable_width_parts, str8_lit(":")); + } + str8_list_push(scratch.arena, &variable_width_parts, loc_child->string); + } + str8_list_push(scratch.arena, &variable_width_parts, str8_lit("\0")); + } + else if(str8_match(member_type_name, str8_lit("code_string"), 0) || + str8_match(member_type_name, str8_lit("path"), 0) || + str8_match(member_type_name, str8_lit("string"), 0)) { U64 off = type->byte_size + variable_width_parts.total_size; str8_list_push(scratch.arena, &fixed_width_parts, push_str8_copy(scratch.arena, str8_struct(&off))); @@ -2778,6 +2806,38 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) } } }break; + + //- rjf: meta collections + case RD_EvalSpaceKind_MetaCollection: + { + typedef struct SpacePtr SpacePtr; + struct SpacePtr + { + E_Space space; + U64 off; + }; + RD_CfgArray cfgs_array = {0}; + if(space.u64s[0] < rd_state->eval_collection_cfg_names->count) + { + cfgs_array = rd_state->eval_collection_cfgs[space.u64s[0]]; + } + U64 space_ptr_size = sizeof(SpacePtr); + Rng1U64 idx_range = r1u64(range.min/space_ptr_size, range.max/space_ptr_size); + U64 out_off = 0; + U64 out_opl = dim_1u64(range); + for(U64 src_idx = idx_range.min; src_idx < idx_range.max && out_off+space_ptr_size <= out_opl; src_idx += 1) + { + RD_Cfg *cfg = &rd_nil_cfg; + if(src_idx < cfgs_array.count) + { + cfg = cfgs_array.v[src_idx]; + } + SpacePtr space_ptr = {rd_eval_space_from_cfg(cfg), 0}; + MemoryCopy((U8 *)out + out_off, &space_ptr, space_ptr_size); + out_off += sizeof(space_ptr); + } + result = 1; + }break; } scratch_end(scratch); return result; @@ -2869,12 +2929,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) if(contains_1u64(string_range, range.min)) { String8 new_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range)); - if(child == &rd_nil_cfg) + if(new_string.size == 0) { - child = rd_cfg_new(cfg, child_name); + rd_cfg_release(child); + } + else + { + if(child == &rd_nil_cfg) + { + child = rd_cfg_new(cfg, child_name); + } + rd_cfg_release_all_children(child); + rd_cfg_new(child, new_string); } - rd_cfg_release_all_children(child); - rd_cfg_new(child, new_string); result = 1; break; } @@ -2883,12 +2950,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) { U64 value = 0; MemoryCopy(&value, in, dim_1u64(range)); - if(child == &rd_nil_cfg) + if(value == 0) { - child = rd_cfg_new(cfg, child_name); + rd_cfg_release(child); + } + else + { + if(child == &rd_nil_cfg) + { + child = rd_cfg_new(cfg, child_name); + } + rd_cfg_release_all_children(child); + rd_cfg_newf(child, "%I64u", value); } - rd_cfg_release_all_children(child); - rd_cfg_newf(child, "%I64u", value); result = 1; break; } @@ -2896,12 +2970,19 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) { U64 value = 0; MemoryCopy(&value, in, dim_1u64(range)); - if(child == &rd_nil_cfg) + if(value == 0) { - child = rd_cfg_new(cfg, child_name); + rd_cfg_release(child); + } + else + { + if(child == &rd_nil_cfg) + { + child = rd_cfg_new(cfg, child_name); + } + rd_cfg_release_all_children(child); + rd_cfg_newf(child, "%I64u", value); } - rd_cfg_release_all_children(child); - rd_cfg_newf(child, "%I64u", value); result = 1; break; } @@ -12940,127 +13021,135 @@ rd_frame(void) } } - //- rjf: add macros for evallable config trees + //- rjf: choose set of evallable config names + String8 evallable_cfg_names[] = { - //- rjf: choose set of evallable config names - String8 evallable_cfg_names[] = - { - str8_lit("breakpoint"), - str8_lit("watch_pin"), - str8_lit("target"), - str8_lit("file_path_map"), - str8_lit("auto_view_rule"), - }; - - //- rjf: build special member types for evallable config types - E_TypeKey bool_type_key = {0}; - E_TypeKey u64_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}; - { - bool_type_key = e_type_key_basic(E_TypeKind_Bool); - u64_type_key = e_type_key_basic(E_TypeKind_U64); - 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 - struct - { - String8 schema_type_name; - E_TypeKey type_key; - } - schema_type_name_key_map[] = - { - { str8_lit("bool"), bool_type_key }, - { str8_lit("u64"), u64_type_key }, - { str8_lit("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) - { - String8 name = evallable_cfg_names[idx]; - MD_Node *schema = rd_schema_from_name(scratch.arena, name); - E_MemberList members_list = {0}; - U64 off = 0; - for MD_EachNode(child, schema->first) - { - String8 member_name = child->string; - String8 member_pretty_name = rd_display_from_code_name(member_name); - E_TypeKey member_type_key = zero_struct; - for EachElement(schema_type_name_idx, schema_type_name_key_map) - { - if(str8_match(child->first->string, schema_type_name_key_map[schema_type_name_idx].schema_type_name, 0)) - { - member_type_key = schema_type_name_key_map[schema_type_name_idx].type_key; - break; - } - } - e_member_list_push_new(scratch.arena, &members_list, - .type_key = member_type_key, - .name = member_name, - .pretty_name = member_pretty_name, - .off = off); - off += e_type_byte_size_from_key(member_type_key); - } - E_MemberArray members = e_member_array_from_list(scratch.arena, &members_list); - evallable_cfg_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) - { - 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); - } - - //- rjf: add macros for each evallable config tree - for EachElement(idx, evallable_cfg_names) - { - String8 name = evallable_cfg_names[idx]; - RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, name); - for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next) - { - RD_Cfg *cfg = n->v; - String8 label = rd_cfg_child_from_string(cfg, str8_lit("label"))->first->string; - String8 exe = rd_cfg_child_from_string(cfg, str8_lit("executable"))->first->string; - E_Space space = rd_eval_space_from_cfg(cfg); - 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]; - if(exe.size != 0) - { - e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr); - } - if(label.size != 0) - { - 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); - } - } + str8_lit("breakpoint"), + str8_lit("watch_pin"), + str8_lit("target"), + str8_lit("file_path_map"), + str8_lit("auto_view_rule"), + }; + + //- rjf: store off eval collections for this frame + rd_state->eval_collection_cfg_names = push_array(rd_frame_arena(), String8Array, 1); + rd_state->eval_collection_cfg_names->count = ArrayCount(evallable_cfg_names); + rd_state->eval_collection_cfg_names->v = push_array(rd_frame_arena(), String8, rd_state->eval_collection_cfg_names->count); + MemoryCopy(rd_state->eval_collection_cfg_names->v, evallable_cfg_names, sizeof(evallable_cfg_names)); + rd_state->eval_collection_cfgs = push_array(rd_frame_arena(), RD_CfgArray, rd_state->eval_collection_cfg_names->count); + for EachElement(idx, evallable_cfg_names) + { + RD_CfgList list = rd_cfg_top_level_list_from_string(scratch.arena, evallable_cfg_names[idx]); + rd_state->eval_collection_cfgs[idx] = rd_cfg_array_from_list(rd_frame_arena(), &list); } + //- rjf: build special member types for evallable config types + E_TypeKey bool_type_key = {0}; + E_TypeKey u64_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}; + { + bool_type_key = e_type_key_basic(E_TypeKind_Bool); + u64_type_key = e_type_key_basic(E_TypeKind_U64); + 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 + struct + { + String8 schema_type_name; + E_TypeKey type_key; + } + schema_type_name_key_map[] = + { + { str8_lit("bool"), bool_type_key }, + { str8_lit("u64"), u64_type_key }, + { str8_lit("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) + { + String8 name = evallable_cfg_names[idx]; + MD_Node *schema = rd_schema_from_name(scratch.arena, name); + E_MemberList members_list = {0}; + U64 off = 0; + for MD_EachNode(child, schema->first) + { + String8 member_name = child->string; + String8 member_pretty_name = rd_display_from_code_name(member_name); + E_TypeKey member_type_key = zero_struct; + for EachElement(schema_type_name_idx, schema_type_name_key_map) + { + if(str8_match(child->first->string, schema_type_name_key_map[schema_type_name_idx].schema_type_name, 0)) + { + member_type_key = schema_type_name_key_map[schema_type_name_idx].type_key; + break; + } + } + e_member_list_push_new(scratch.arena, &members_list, + .type_key = member_type_key, + .name = member_name, + .pretty_name = member_pretty_name, + .off = off); + off += e_type_byte_size_from_key(member_type_key); + } + E_MemberArray members = e_member_array_from_list(scratch.arena, &members_list); + evallable_cfg_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) + { + 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); + } + + //- rjf: add macros for each evallable config tree + for EachElement(idx, evallable_cfg_names) + { + String8 name = evallable_cfg_names[idx]; + RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, name); + for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next) + { + RD_Cfg *cfg = n->v; + String8 label = rd_cfg_child_from_string(cfg, str8_lit("label"))->first->string; + String8 exe = rd_cfg_child_from_string(cfg, str8_lit("executable"))->first->string; + E_Space space = rd_eval_space_from_cfg(cfg); + 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]; + if(exe.size != 0) + { + e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr); + } + if(label.size != 0) + { + 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 { CTRL_EntityKind evallable_kinds[] = @@ -13110,6 +13199,26 @@ rd_frame(void) } } + //- rjf: add macros for collections (new @cfg) + for EachElement(cfg_name_idx, evallable_cfg_names) + { + String8 cfg_name = evallable_cfg_names[cfg_name_idx]; + String8 collection_name = rd_plural_from_code_name(cfg_name); + E_TypeKey collection_type_key = {0}; + { + E_TypeKey element_type_key = evallable_cfg_types[cfg_name_idx]; + RD_CfgList cfgs = rd_cfg_top_level_list_from_string(scratch.arena, cfg_name); + collection_type_key = e_type_key_cons_array(e_type_key_cons_space_ptr(element_type_key), cfgs.count); + } + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Space space = e_space_make(RD_EvalSpaceKind_MetaCollection); + space.u64s[0] = cfg_name_idx; + expr->space = space; + expr->mode = E_Mode_Offset; + expr->type_key = collection_type_key; + e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); + } + //- rjf: add macros for all watches which define identifiers RD_CfgList watches = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch")); for(RD_CfgNode *n = watches.first; n != 0; n = n->next) @@ -14095,47 +14204,65 @@ rd_frame(void) }break; case RD_CmdKind_NextTab: { -#if 0 // TODO(rjf): @cfg - RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); - RD_View *start_view = rd_selected_tab_from_panel(panel); - RD_View *next_view = start_view; - U64 idx = 0; - for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_next) ? panel->first_tab_view : v->order_next), idx += 1) + RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); + RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); + RD_PanelNode *focused = panel_tree.focused; + RD_CfgNode *selected_tab_n = 0; + for(RD_CfgNode *n = focused->tabs.first; n != 0; n = n->next) { - if(v == start_view && idx != 0) + if(n->v == focused->selected_tab) { - break; - } - if(!rd_view_is_project_filtered(v) && v != start_view) - { - next_view = v; + selected_tab_n = n; break; } } - panel->selected_tab_view = rd_handle_from_view(next_view); -#endif + RD_Cfg *next_selected_tab = &rd_nil_cfg; + U64 idx = 0; + for(RD_CfgNode *tab_n = selected_tab_n; + tab_n != 0 && (tab_n != selected_tab_n || idx == 0); + ((tab_n->next == 0) ? (tab_n = focused->tabs.first) : (tab_n = tab_n->next)), idx += 1) + { + if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n) + { + next_selected_tab = tab_n->v; + break; + } + } + if(next_selected_tab != &rd_nil_cfg) + { + rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab)); + } }break; case RD_CmdKind_PrevTab: { -#if 0 // TODO(rjf): @cfg - RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); - RD_View *start_view = rd_selected_tab_from_panel(panel); - RD_View *next_view = start_view; - U64 idx = 0; - for(RD_View *v = start_view; !rd_view_is_nil(v); v = (rd_view_is_nil(v->order_prev) ? panel->last_tab_view : v->order_prev), idx += 1) + RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); + RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); + RD_PanelNode *focused = panel_tree.focused; + RD_CfgNode *selected_tab_n = 0; + for(RD_CfgNode *n = focused->tabs.last; n != 0; n = n->prev) { - if(v == start_view && idx != 0) + if(n->v == focused->selected_tab) { - break; - } - if(!rd_view_is_project_filtered(v) && v != start_view) - { - next_view = v; + selected_tab_n = n; break; } } - panel->selected_tab_view = rd_handle_from_view(next_view); -#endif + RD_Cfg *next_selected_tab = &rd_nil_cfg; + U64 idx = 0; + for(RD_CfgNode *tab_n = selected_tab_n; + tab_n != 0 && (tab_n != selected_tab_n || idx == 0); + ((tab_n->prev == 0) ? (tab_n = focused->tabs.last) : (tab_n = tab_n->prev)), idx += 1) + { + if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n) + { + next_selected_tab = tab_n->v; + break; + } + } + if(next_selected_tab != &rd_nil_cfg) + { + rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab)); + } }break; case RD_CmdKind_MoveTabRight: case RD_CmdKind_MoveTabLeft: @@ -14168,15 +14295,28 @@ rd_frame(void) }break; case RD_CmdKind_CloseTab: { -#if 0 // TODO(rjf): @cfg - RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel); - RD_View *view = rd_view_from_handle(rd_regs()->view); - if(!rd_view_is_nil(view)) + RD_Cfg *tab = rd_cfg_from_handle(rd_regs()->view); + RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, tab); + RD_PanelNode *panel = rd_panel_node_from_tree_cfg(panel_tree.root, tab->parent); + B32 found_selected = 0; + RD_Cfg *next_selected_tab = &rd_nil_cfg; + for(RD_CfgNode *n = panel->tabs.first; n != 0; n = n->next) { - rd_panel_remove_tab_view(panel, view); - rd_view_release(view); + if(n->v == panel->selected_tab) + { + found_selected = 1; + } + else if(!rd_cfg_is_project_filtered(n->v)) + { + next_selected_tab = n->v; + if(found_selected) + { + break; + } + } } -#endif + rd_cmd(RD_CmdKind_FocusTab, .view = rd_handle_from_cfg(next_selected_tab)); + rd_cfg_release(tab); }break; case RD_CmdKind_MoveTab: { @@ -14603,368 +14743,6 @@ X(getting_started) #define X(name) if(name->parent == &rd_nil_cfg) {rd_cfg_release(name);} FixedTab_XList #undef X - -#if 0 // TODO(rjf): @cfg - RD_Window *ws = rd_window_from_handle(rd_regs()->window); - - typedef enum Layout - { - Layout_Default, - Layout_Compact, - } - Layout; - Layout layout = Layout_Default; - switch(kind) - { - default:{}break; - case RD_CmdKind_ResetToDefaultPanels:{layout = Layout_Default;}break; - case RD_CmdKind_ResetToCompactPanels:{layout = Layout_Compact;}break; - } - - //- rjf: gather all panels in the panel tree - remove & gather views - // we'd like to keep in the next layout - RD_HandleList panels_to_close = {0}; - RD_HandleList views_to_close = {0}; - RD_View *watch = &rd_nil_view; - RD_View *locals = &rd_nil_view; - RD_View *regs = &rd_nil_view; - RD_View *globals = &rd_nil_view; - RD_View *tlocals = &rd_nil_view; - RD_View *types = &rd_nil_view; - RD_View *procs = &rd_nil_view; - RD_View *callstack = &rd_nil_view; - RD_View *breakpoints = &rd_nil_view; - RD_View *watch_pins = &rd_nil_view; - RD_View *output = &rd_nil_view; - RD_View *targets = &rd_nil_view; - RD_View *scheduler = &rd_nil_view; - RD_View *modules = &rd_nil_view; - RD_View *disasm = &rd_nil_view; - RD_View *memory = &rd_nil_view; - RD_View *getting_started = &rd_nil_view; - RD_HandleList code_views = {0}; - for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) - { - RD_Handle handle = rd_handle_from_panel(panel); - rd_handle_list_push(scratch.arena, &panels_to_close, handle); - for(RD_View *view = panel->first_tab_view, *next = 0; !rd_view_is_nil(view); view = next) - { - next = view->order_next; - RD_ViewRuleKind view_rule_kind = rd_view_rule_kind_from_string(view->spec->string); - B32 needs_delete = 1; - switch(view_rule_kind) - { - default:{}break; - case RD_ViewRuleKind_Watch: {if(rd_view_is_nil(watch)) { needs_delete = 0; watch = view;} }break; - case RD_ViewRuleKind_Locals: {if(rd_view_is_nil(locals)) { needs_delete = 0; locals = view;} }break; - case RD_ViewRuleKind_Registers: {if(rd_view_is_nil(regs)) { needs_delete = 0; regs = view;} }break; - case RD_ViewRuleKind_Globals: {if(rd_view_is_nil(globals)) { needs_delete = 0; globals = view;} }break; - case RD_ViewRuleKind_ThreadLocals: {if(rd_view_is_nil(tlocals)) { needs_delete = 0; tlocals = view;} }break; - case RD_ViewRuleKind_Types: {if(rd_view_is_nil(types)) { needs_delete = 0; types = view;} }break; - case RD_ViewRuleKind_Procedures: {if(rd_view_is_nil(procs)) { needs_delete = 0; procs = view;} }break; - case RD_ViewRuleKind_CallStack: {if(rd_view_is_nil(callstack)) { needs_delete = 0; callstack = view;} }break; - case RD_ViewRuleKind_Breakpoints: {if(rd_view_is_nil(breakpoints)) { needs_delete = 0; breakpoints = view;} }break; - case RD_ViewRuleKind_WatchPins: {if(rd_view_is_nil(watch_pins)) { needs_delete = 0; watch_pins = view;} }break; - case RD_ViewRuleKind_Output: {if(rd_view_is_nil(output)) { needs_delete = 0; output = view;} }break; - case RD_ViewRuleKind_Targets: {if(rd_view_is_nil(targets)) { needs_delete = 0; targets = view;} }break; - case RD_ViewRuleKind_Scheduler: {if(rd_view_is_nil(scheduler)) { needs_delete = 0; scheduler = view;} }break; - case RD_ViewRuleKind_Modules: {if(rd_view_is_nil(modules)) { needs_delete = 0; modules = view;} }break; - case RD_ViewRuleKind_Disasm: {if(rd_view_is_nil(disasm)) { needs_delete = 0; disasm = view;} }break; - case RD_ViewRuleKind_Memory: {if(rd_view_is_nil(memory)) { needs_delete = 0; memory = view;} }break; - case RD_ViewRuleKind_GettingStarted:{if(rd_view_is_nil(getting_started)) { needs_delete = 0; getting_started = view;} }break; - case RD_ViewRuleKind_Text: - { - needs_delete = 0; - rd_handle_list_push(scratch.arena, &code_views, rd_handle_from_view(view)); - }break; - } - if(!needs_delete) - { - rd_panel_remove_tab_view(panel, view); - } - } - } - - //- rjf: close all panels/views - for(RD_HandleNode *n = panels_to_close.first; n != 0; n = n->next) - { - RD_Panel *panel = rd_panel_from_handle(n->handle); - if(panel != ws->root_panel) - { - rd_panel_release(ws, panel); - } - else - { - rd_panel_release_all_views(panel); - panel->first = panel->last = &rd_nil_panel; - } - } - - //- rjf: allocate any missing views - if(rd_view_is_nil(watch)) - { - watch = rd_view_alloc(); - rd_view_equip_spec(watch, rd_view_rule_info_from_kind(RD_ViewRuleKind_Watch), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(locals)) - { - locals = rd_view_alloc(); - rd_view_equip_spec(locals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Locals), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(regs)) - { - regs = rd_view_alloc(); - rd_view_equip_spec(regs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Registers), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(globals)) - { - globals = rd_view_alloc(); - rd_view_equip_spec(globals, rd_view_rule_info_from_kind(RD_ViewRuleKind_Globals), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(tlocals)) - { - tlocals = rd_view_alloc(); - rd_view_equip_spec(tlocals, rd_view_rule_info_from_kind(RD_ViewRuleKind_ThreadLocals), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(types)) - { - types = rd_view_alloc(); - rd_view_equip_spec(types, rd_view_rule_info_from_kind(RD_ViewRuleKind_Types), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(procs)) - { - procs = rd_view_alloc(); - rd_view_equip_spec(procs, rd_view_rule_info_from_kind(RD_ViewRuleKind_Procedures), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(callstack)) - { - callstack = rd_view_alloc(); - rd_view_equip_spec(callstack, rd_view_rule_info_from_kind(RD_ViewRuleKind_CallStack), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(breakpoints)) - { - breakpoints = rd_view_alloc(); - rd_view_equip_spec(breakpoints, rd_view_rule_info_from_kind(RD_ViewRuleKind_Breakpoints), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(watch_pins)) - { - watch_pins = rd_view_alloc(); - rd_view_equip_spec(watch_pins, rd_view_rule_info_from_kind(RD_ViewRuleKind_WatchPins), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(output)) - { - output = rd_view_alloc(); - rd_view_equip_spec(output, rd_view_rule_info_from_kind(RD_ViewRuleKind_Output), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(targets)) - { - targets = rd_view_alloc(); - rd_view_equip_spec(targets, rd_view_rule_info_from_kind(RD_ViewRuleKind_Targets), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(scheduler)) - { - scheduler = rd_view_alloc(); - rd_view_equip_spec(scheduler, rd_view_rule_info_from_kind(RD_ViewRuleKind_Scheduler), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(modules)) - { - modules = rd_view_alloc(); - rd_view_equip_spec(modules, rd_view_rule_info_from_kind(RD_ViewRuleKind_Modules), str8_zero(), &md_nil_node); - } - if(rd_view_is_nil(disasm)) - { - disasm = rd_view_alloc(); - rd_view_equip_spec(disasm, rd_view_rule_info_from_kind(RD_ViewRuleKind_Disasm), str8_zero(), &md_nil_node); - } - if(layout == Layout_Default && rd_view_is_nil(memory)) - { - memory = rd_view_alloc(); - rd_view_equip_spec(memory, rd_view_rule_info_from_kind(RD_ViewRuleKind_Memory), str8_zero(), &md_nil_node); - } - if(code_views.count == 0 && rd_view_is_nil(getting_started)) - { - getting_started = rd_view_alloc(); - rd_view_equip_spec(getting_started, rd_view_rule_info_from_kind(RD_ViewRuleKind_GettingStarted), str8_zero(), &md_nil_node); - } - - //- rjf: apply layout - switch(layout) - { - //- rjf: default layout - case Layout_Default: - { - // rjf: root split - ws->root_panel->split_axis = Axis2_X; - RD_Panel *root_0 = rd_panel_alloc(ws); - RD_Panel *root_1 = rd_panel_alloc(ws); - rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0); - rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1); - root_0->pct_of_parent = 0.85f; - root_1->pct_of_parent = 0.15f; - - // rjf: root_0 split - root_0->split_axis = Axis2_Y; - RD_Panel *root_0_0 = rd_panel_alloc(ws); - RD_Panel *root_0_1 = rd_panel_alloc(ws); - rd_panel_insert(root_0, root_0->last, root_0_0); - rd_panel_insert(root_0, root_0->last, root_0_1); - root_0_0->pct_of_parent = 0.80f; - root_0_1->pct_of_parent = 0.20f; - - // rjf: root_1 split - root_1->split_axis = Axis2_Y; - RD_Panel *root_1_0 = rd_panel_alloc(ws); - RD_Panel *root_1_1 = rd_panel_alloc(ws); - rd_panel_insert(root_1, root_1->last, root_1_0); - rd_panel_insert(root_1, root_1->last, root_1_1); - root_1_0->pct_of_parent = 0.50f; - root_1_1->pct_of_parent = 0.50f; - rd_panel_insert_tab_view(root_1_0, root_1_0->last_tab_view, targets); - rd_panel_insert_tab_view(root_1_1, root_1_1->last_tab_view, scheduler); - root_1_0->selected_tab_view = rd_handle_from_view(targets); - root_1_1->selected_tab_view = rd_handle_from_view(scheduler); - root_1_1->tab_side = Side_Max; - - // rjf: root_0_0 split - root_0_0->split_axis = Axis2_X; - RD_Panel *root_0_0_0 = rd_panel_alloc(ws); - RD_Panel *root_0_0_1 = rd_panel_alloc(ws); - rd_panel_insert(root_0_0, root_0_0->last, root_0_0_0); - rd_panel_insert(root_0_0, root_0_0->last, root_0_0_1); - root_0_0_0->pct_of_parent = 0.25f; - root_0_0_1->pct_of_parent = 0.75f; - - // rjf: root_0_0_0 split - root_0_0_0->split_axis = Axis2_Y; - RD_Panel *root_0_0_0_0 = rd_panel_alloc(ws); - RD_Panel *root_0_0_0_1 = rd_panel_alloc(ws); - rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_0); - rd_panel_insert(root_0_0_0, root_0_0_0->last, root_0_0_0_1); - root_0_0_0_0->pct_of_parent = 0.5f; - root_0_0_0_1->pct_of_parent = 0.5f; - rd_panel_insert_tab_view(root_0_0_0_0, root_0_0_0_0->last_tab_view, disasm); - root_0_0_0_0->selected_tab_view = rd_handle_from_view(disasm); - rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, breakpoints); - rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, watch_pins); - rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, output); - rd_panel_insert_tab_view(root_0_0_0_1, root_0_0_0_1->last_tab_view, memory); - root_0_0_0_1->selected_tab_view = rd_handle_from_view(output); - - // rjf: root_0_1 split - root_0_1->split_axis = Axis2_X; - RD_Panel *root_0_1_0 = rd_panel_alloc(ws); - RD_Panel *root_0_1_1 = rd_panel_alloc(ws); - rd_panel_insert(root_0_1, root_0_1->last, root_0_1_0); - rd_panel_insert(root_0_1, root_0_1->last, root_0_1_1); - root_0_1_0->pct_of_parent = 0.60f; - root_0_1_1->pct_of_parent = 0.40f; - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, watch); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, locals); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, regs); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, globals); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, tlocals); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, types); - rd_panel_insert_tab_view(root_0_1_0, root_0_1_0->last_tab_view, procs); - root_0_1_0->selected_tab_view = rd_handle_from_view(watch); - root_0_1_0->tab_side = Side_Max; - rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, callstack); - rd_panel_insert_tab_view(root_0_1_1, root_0_1_1->last_tab_view, modules); - root_0_1_1->selected_tab_view = rd_handle_from_view(callstack); - root_0_1_1->tab_side = Side_Max; - - // rjf: fill main panel with getting started, OR all collected code views - if(!rd_view_is_nil(getting_started)) - { - rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, getting_started); - } - for(RD_HandleNode *n = code_views.first; n != 0; n = n->next) - { - RD_View *view = rd_view_from_handle(n->handle); - if(!rd_view_is_nil(view)) - { - rd_panel_insert_tab_view(root_0_0_1, root_0_0_1->last_tab_view, view); - } - } - - // rjf: choose initial focused panel - ws->focused_panel = root_0_0_1; - }break; - - //- rjf: compact layout: - case Layout_Compact: - { - // rjf: root split - ws->root_panel->split_axis = Axis2_X; - RD_Panel *root_0 = rd_panel_alloc(ws); - RD_Panel *root_1 = rd_panel_alloc(ws); - rd_panel_insert(ws->root_panel, ws->root_panel->last, root_0); - rd_panel_insert(ws->root_panel, ws->root_panel->last, root_1); - root_0->pct_of_parent = 0.25f; - root_1->pct_of_parent = 0.75f; - - // rjf: root_0 split - root_0->split_axis = Axis2_Y; - RD_Panel *root_0_0 = rd_panel_alloc(ws); - { - if(!rd_view_is_nil(watch)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, watch); } - if(!rd_view_is_nil(types)) { rd_panel_insert_tab_view(root_0_0, root_0_0->last_tab_view, types); } - root_0_0->selected_tab_view = rd_handle_from_view(watch); - } - RD_Panel *root_0_1 = rd_panel_alloc(ws); - { - if(!rd_view_is_nil(scheduler)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, scheduler); } - if(!rd_view_is_nil(targets)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, targets); } - if(!rd_view_is_nil(breakpoints)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, breakpoints); } - if(!rd_view_is_nil(watch_pins)) { rd_panel_insert_tab_view(root_0_1, root_0_1->last_tab_view, watch_pins); } - root_0_1->selected_tab_view = rd_handle_from_view(scheduler); - } - RD_Panel *root_0_2 = rd_panel_alloc(ws); - { - if(!rd_view_is_nil(disasm)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, disasm); } - if(!rd_view_is_nil(output)) { rd_panel_insert_tab_view(root_0_2, root_0_2->last_tab_view, output); } - root_0_2->selected_tab_view = rd_handle_from_view(disasm); - } - RD_Panel *root_0_3 = rd_panel_alloc(ws); - { - if(!rd_view_is_nil(callstack)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, callstack); } - if(!rd_view_is_nil(modules)) { rd_panel_insert_tab_view(root_0_3, root_0_3->last_tab_view, modules); } - root_0_3->selected_tab_view = rd_handle_from_view(callstack); - } - rd_panel_insert(root_0, root_0->last, root_0_0); - rd_panel_insert(root_0, root_0->last, root_0_1); - rd_panel_insert(root_0, root_0->last, root_0_2); - rd_panel_insert(root_0, root_0->last, root_0_3); - root_0_0->pct_of_parent = 0.25f; - root_0_1->pct_of_parent = 0.25f; - root_0_2->pct_of_parent = 0.25f; - root_0_3->pct_of_parent = 0.25f; - - // rjf: fill main panel with getting started, OR all collected code views - if(!rd_view_is_nil(getting_started)) - { - rd_panel_insert_tab_view(root_1, root_1->last_tab_view, getting_started); - } - for(RD_HandleNode *n = code_views.first; n != 0; n = n->next) - { - RD_View *view = rd_view_from_handle(n->handle); - if(!rd_view_is_nil(view)) - { - rd_panel_insert_tab_view(root_1, root_1->last_tab_view, view); - } - } - - // rjf: choose initial focused panel - ws->focused_panel = root_1; - }break; - } - - // rjf: dispatch cfg saves - for(RD_CfgSrc src = (RD_CfgSrc)0; src < RD_CfgSrc_COUNT; src = (RD_CfgSrc)(src+1)) - { - RD_CmdKind write_cmd = rd_cfg_src_write_cmd_kind_table[src]; - rd_cmd(write_cmd, .file_path = rd_cfg_path_from_src(src)); - } -#endif }break; //- rjf: thread finding @@ -15671,7 +15449,8 @@ X(getting_started) case RD_CmdKind_DisableTarget: { RD_Cfg *cfg = rd_cfg_from_handle(rd_regs()->cfg); - rd_cfg_child_from_string_or_alloc(cfg, str8_lit("disabled")); + RD_Cfg *disabled = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("disabled")); + rd_cfg_new(disabled, str8_lit("1")); }break; case RD_CmdKind_RemoveCfg: { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 83087c58..82482f27 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -143,16 +143,6 @@ enum RD_EntityFlag_MarkedForDeletion = (1<<31), }; -//////////////////////////////// -//~ rjf: Setting Types - -typedef struct RD_SettingVal RD_SettingVal; -struct RD_SettingVal -{ - B32 set; - S32 s32; -}; - //////////////////////////////// //~ rjf: View Rule Info Types @@ -351,6 +341,7 @@ typedef struct RD_CfgNode RD_CfgNode; struct RD_CfgNode { RD_CfgNode *next; + RD_CfgNode *prev; RD_Cfg *v; }; @@ -362,6 +353,13 @@ struct RD_CfgList U64 count; }; +typedef struct RD_CfgArray RD_CfgArray; +struct RD_CfgArray +{ + RD_Cfg **v; + U64 count; +}; + typedef struct RD_CfgRec RD_CfgRec; struct RD_CfgRec { @@ -889,6 +887,10 @@ struct RD_State // rjf: config -> eval blob map (lazily constructed from-scratch each frame) RD_Cfg2EvalBlobMap *cfg2evalblob_map; + // rjf: eval collections (constructed from scratch every frame) + String8Array *eval_collection_cfg_names; + RD_CfgArray *eval_collection_cfgs; + // rjf: registers stack RD_RegsNode base_regs; RD_RegsNode *top_regs; @@ -1171,6 +1173,7 @@ internal RD_Cfg *rd_cfg_child_from_string(RD_Cfg *parent, String8 string); internal RD_Cfg *rd_cfg_child_from_string_or_alloc(RD_Cfg *parent, String8 string); internal RD_CfgList rd_cfg_child_list_from_string(Arena *arena, RD_Cfg *parent, String8 string); internal RD_CfgList rd_cfg_top_level_list_from_string(Arena *arena, String8 string); +internal RD_CfgArray rd_cfg_array_from_list(Arena *arena, RD_CfgList *list); internal RD_CfgList rd_cfg_tree_list_from_string(Arena *arena, String8 string); internal String8 rd_string_from_cfg_tree(Arena *arena, RD_Cfg *cfg); internal RD_CfgRec rd_cfg_rec__depth_first(RD_Cfg *root, RD_Cfg *cfg);