From 918895c09107351224d3f0392d4b9b98042e8370 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 14 Aug 2024 10:49:56 -0700 Subject: [PATCH] small string evaluation; strings as values in eval --- src/df/core/df_core.c | 4 +- src/df/gfx/df_gfx.c | 41 +++++++++++--------- src/df/gfx/df_views.c | 2 +- src/eval/eval_bundles.c | 30 +++++++++++++++ src/eval/eval_bundles.h | 2 + src/eval/eval_interpret.c | 6 +++ src/eval/eval_ir.c | 56 ++++++++++++++++++++------- src/eval/eval_ir.h | 9 ++--- src/lib_rdi_format/rdi_format.c | 6 +-- src/lib_rdi_format/rdi_format.h | 68 ++++++++++++++++----------------- src/raddbg/raddbg.h | 1 + src/rdi_format/rdi_format.mdesk | 62 +++++++++++++++--------------- 12 files changed, 175 insertions(+), 112 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index d5393b3f..c6bc480a 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4983,8 +4983,8 @@ df_eval_viz_block_list_from_eval_view_expr_keys(Arena *arena, DF_EvalView *eval_ DF_EvalVizBlockList blocks = {0}; { E_Eval eval = e_eval_from_string(arena, expr); - U64 expr_comma_pos = str8_find_needle(expr, 0, str8_lit(","), 0); - U64 passthrough_pos = str8_find_needle(expr, 0, str8_lit("--"), 0); + U64 expr_comma_pos = str8_find_needle(expr, eval.advance, str8_lit(","), 0); + U64 passthrough_pos = str8_find_needle(expr, eval.advance, str8_lit("--"), 0); String8List default_view_rules = {0}; if(expr_comma_pos < expr.size && expr_comma_pos < passthrough_pos) { diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 11fbd829..0c298a7a 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8531,19 +8531,36 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags B32 special_case = 0; // rjf: special-case: strings - if(!has_array && direct_type_is_string && eval.mode == E_Mode_Addr) + if(!has_array && direct_type_is_string) { special_case = 1; DF_Entity *thread = df_entity_from_handle(df_interact_regs()->thread); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); U64 element_size = e_type_byte_size_from_key(eval_type->direct_type_key); - CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0); + + // rjf: read text + String8 text_data = {0}; + switch(eval.mode) + { + default:{}break; + case E_Mode_Addr: + { + CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0); + text_data = text_slice.data; + }break; + case E_Mode_Value: + { + text_data = str8_cstring_capped(&eval.value.u512[0], (U8 *)(&eval.value.u512[0]) + sizeof(eval.value.u512)); + }break; + } + + // rjf: convert to utf-8 if needed String8 raw_text = {0}; switch(element_size) { - default:{raw_text = text_slice.data;}break; - case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_slice.data.str, text_slice.data.size/sizeof(U16)));}break; - case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_slice.data.str, text_slice.data.size/sizeof(U32)));}break; + default:{raw_text = text_data;}break; + case 2: {raw_text = str8_from_16(arena, str16((U16 *)text_data.str, text_data.size/sizeof(U16)));}break; + case 4: {raw_text = str8_from_32(arena, str32((U32 *)text_data.str, text_data.size/sizeof(U32)));}break; } String8 text = df_eval_escaped_from_raw_string(arena, raw_text); space_taken += f_dim_from_tag_size_string(font, font_size, 0, 0, text).x; @@ -8569,11 +8586,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags U64 direct_type_byte_size = e_type_byte_size_from_key(direct_type_key); for(U64 idx = 0; idx < array_count && max_size > space_taken; idx += 1) { - E_Eval element_eval = zero_struct; - element_eval.type_key = direct_type_key; - element_eval.mode = eval.mode; - element_eval.value = eval.value; - element_eval.value.u64 += direct_type_byte_size*idx; + E_Eval element_eval = e_element_eval_from_array_eval_index(eval, idx); String8List element_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, element_eval, opt_member, cfg_table); space_taken += f_dim_from_tag_size_string_list(font, font_size, 0, 0, element_strs).x; str8_list_concat_in_place(&list, &element_strs); @@ -8937,13 +8950,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope, DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(block->parent_key), idx+1); // rjf: get eval for this element - E_Eval elem_eval = zero_struct; - { - elem_eval.type_key = direct_type_key; - elem_eval.mode = block->eval.mode; - elem_eval.value = block->eval.value; - elem_eval.value.u64 += idx*direct_type_key_byte_size; - } + E_Eval elem_eval = e_element_eval_from_array_eval_index(block->eval, idx); // rjf: get view rules String8 view_rule_string = df_eval_view_rule_from_key(eval_view, key); diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 5342c311..120a1ff1 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2722,7 +2722,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break; default: { - ext = str8_from_u64(scratch.arena, op->p, 16, 0, 0); + ext = str8_from_u64(scratch.arena, op->u64, 16, 0, 0); }break; } ui_labelf(" %S%s%S", op_string, ext.size ? " " : "", ext); diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 8113d394..1acf7bb0 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -19,6 +19,7 @@ e_eval_from_string(Arena *arena, String8 string) .mode = irtree.mode, .type_key = irtree.type_key, .code = interp.code, + .advance = parse.last_token >= tokens.v + tokens.count ? string.size : parse.last_token->range.min, }; e_msg_list_concat_in_place(&eval.msgs, &parse.msgs); e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs); @@ -200,3 +201,32 @@ e_value_eval_from_eval(E_Eval eval) return eval; } + +internal E_Eval +e_element_eval_from_array_eval_index(E_Eval eval, U64 index) +{ + E_Eval result = {0}; + result.mode = eval.mode; + result.type_key = e_type_direct_from_key(eval.type_key); + result.code = eval.code; + result.msgs = eval.msgs; + U64 element_size = e_type_byte_size_from_key(result.type_key); + switch(eval.mode) + { + default:{}break; + case E_Mode_Value: + if(element_size <= sizeof(E_Value) && + index < sizeof(E_Value)/element_size) + { + MemoryCopy((U8 *)(&result.value.u512[0]), + (U8 *)(&eval.value.u512[0]) + index*element_size, + element_size); + }break; + case E_Mode_Addr: + case E_Mode_Reg: + { + result.value.u64 = eval.value.u64 + element_size*index; + }break; + } + return result; +} diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index 646ceb49..a5c7b304 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -15,6 +15,7 @@ struct E_Eval E_TypeKey type_key; E_InterpretationCode code; E_MsgList msgs; + U64 advance; }; //////////////////////////////// @@ -24,5 +25,6 @@ internal E_Eval e_eval_from_string(Arena *arena, String8 string); internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval); internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval); internal E_Eval e_value_eval_from_eval(E_Eval eval); +internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index); #endif // EVAL_BUNDLES_H diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 444094b1..b4f30c25 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -206,6 +206,12 @@ e_interpret(String8 bytecode) nval.u64 = imm; }break; + case RDI_EvalOp_ConstString: + { + MemoryCopy(&nval, ptr, imm); + ptr += imm; + }break; + case RDI_EvalOp_Abs: { if(imm == RDI_EvalTypeGroup_F32) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 99d76d13..4268f4de 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -82,7 +82,7 @@ e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, U64 p) U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); E_Op *node = push_array_no_zero(arena, E_Op, 1); node->opcode = opcode; - node->p = p; + node->u64 = p; SLLQueuePush(list->first, list->last, node); list->op_count += 1; list->encoded_size += 1 + p_size; @@ -127,12 +127,27 @@ e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode) { E_Op *node = push_array_no_zero(arena, E_Op, 1); node->opcode = E_IRExtKind_Bytecode; - node->bytecode = bytecode; + node->string = bytecode; SLLQueuePush(list->first, list->last, node); list->op_count += 1; list->encoded_size += bytecode.size; } +internal void +e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string) +{ + RDI_EvalOp opcode = RDI_EvalOp_ConstString; + U8 ctrlbits = rdi_eval_op_ctrlbits_table[opcode]; + U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits); + E_Op *node = push_array_no_zero(arena, E_Op, 1); + node->opcode = opcode; + node->string = string; + node->u64 = Min(string.size, 64); + SLLQueuePush(list->first, list->last, node); + list->op_count += 1; + list->encoded_size += 1 + p_size + node->u64; +} + internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push) { @@ -231,8 +246,8 @@ e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode) internal E_IRNode * e_irtree_string_literal(Arena *arena, String8 string) { - E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstU512); - root->string = str8(string.str, Min(64, string.size)); + E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstString); + root->string = string; return root; } @@ -1138,13 +1153,6 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) e_oplist_push_bytecode(arena, out, root->string); }break; - case RDI_EvalOp_ConstU128: - case RDI_EvalOp_ConstU256: - case RDI_EvalOp_ConstU512: - { - // TODO(rjf) - }break; - case RDI_EvalOp_Cond: { // rjf: generate oplists for each child @@ -1171,6 +1179,11 @@ e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out) e_oplist_concat_in_place(out, &prt_left); }break; + case RDI_EvalOp_ConstString: + { + e_oplist_push_string_literal(arena, out, root->string); + }break; + default: { if(op >= RDI_EvalOp_COUNT) @@ -1232,7 +1245,22 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) // rjf: fill bytecode ptr[0] = opcode; - MemoryCopy(ptr + 1, &op->p, extra_byte_count); + MemoryCopy(ptr + 1, &op->u64, extra_byte_count); + + // rjf: advance + ptr = next_ptr; + }break; + + case RDI_EvalOp_ConstString: + { + // rjf: compute bytecode advance + U8 *next_ptr = ptr + 2 + op->u64; + Assert(next_ptr <= opl); + + // rjf: fill + ptr[0] = opcode; + ptr[1] = (U8)op->u64; + MemoryCopy(ptr+2, op->string.str, op->u64); // rjf: advance ptr = next_ptr; @@ -1241,12 +1269,12 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) case E_IRExtKind_Bytecode: { // rjf: compute bytecode advance - U64 size = op->bytecode.size; + U64 size = op->string.size; U8 *next_ptr = ptr + size; Assert(next_ptr <= opl); // rjf: fill bytecode - MemoryCopy(ptr, op->bytecode.str, size); + MemoryCopy(ptr, op->string.str, size); // rjf: advance ptr = next_ptr; diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index e5c72eea..0e930fcb 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -18,12 +18,8 @@ struct E_Op { E_Op *next; RDI_EvalOp opcode; - union - { - U64 p; - String8 bytecode; - String8 data; - }; + U64 u64; + String8 string; }; typedef struct E_OpList E_OpList; @@ -93,6 +89,7 @@ internal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, 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_string_literal(Arena *arena, E_OpList *list, String8 string); internal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push); //- rjf: ir tree core building helpers diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 1b947329..ec22412f 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -92,7 +92,7 @@ RDI_U8 rdi_section_is_required_table[37] = 0, }; -RDI_U8 rdi_eval_op_ctrlbits_table[48] = +RDI_U8 rdi_eval_op_ctrlbits_table[46] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -110,9 +110,7 @@ RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(2, 0, 1), RDI_EVAL_CTRLBITS(4, 0, 1), RDI_EVAL_CTRLBITS(8, 0, 1), -RDI_EVAL_CTRLBITS(16, 0, 1), -RDI_EVAL_CTRLBITS(32, 0, 1), -RDI_EVAL_CTRLBITS(64, 0, 1), +RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 1, 1), RDI_EVAL_CTRLBITS(1, 2, 1), diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index a1f08180..e0d8b349 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -452,38 +452,36 @@ RDI_EvalOp_ConstU8 = 12, RDI_EvalOp_ConstU16 = 13, RDI_EvalOp_ConstU32 = 14, RDI_EvalOp_ConstU64 = 15, -RDI_EvalOp_ConstU128 = 16, -RDI_EvalOp_ConstU256 = 17, -RDI_EvalOp_ConstU512 = 18, -RDI_EvalOp_Abs = 19, -RDI_EvalOp_Neg = 20, -RDI_EvalOp_Add = 21, -RDI_EvalOp_Sub = 22, -RDI_EvalOp_Mul = 23, -RDI_EvalOp_Div = 24, -RDI_EvalOp_Mod = 25, -RDI_EvalOp_LShift = 26, -RDI_EvalOp_RShift = 27, -RDI_EvalOp_BitAnd = 28, -RDI_EvalOp_BitOr = 29, -RDI_EvalOp_BitXor = 30, -RDI_EvalOp_BitNot = 31, -RDI_EvalOp_LogAnd = 32, -RDI_EvalOp_LogOr = 33, -RDI_EvalOp_LogNot = 34, -RDI_EvalOp_EqEq = 35, -RDI_EvalOp_NtEq = 36, -RDI_EvalOp_LsEq = 37, -RDI_EvalOp_GrEq = 38, -RDI_EvalOp_Less = 39, -RDI_EvalOp_Grtr = 40, -RDI_EvalOp_Trunc = 41, -RDI_EvalOp_TruncSigned = 42, -RDI_EvalOp_Convert = 43, -RDI_EvalOp_Pick = 44, -RDI_EvalOp_Pop = 45, -RDI_EvalOp_Insert = 46, -RDI_EvalOp_COUNT = 47, +RDI_EvalOp_ConstString = 16, +RDI_EvalOp_Abs = 17, +RDI_EvalOp_Neg = 18, +RDI_EvalOp_Add = 19, +RDI_EvalOp_Sub = 20, +RDI_EvalOp_Mul = 21, +RDI_EvalOp_Div = 22, +RDI_EvalOp_Mod = 23, +RDI_EvalOp_LShift = 24, +RDI_EvalOp_RShift = 25, +RDI_EvalOp_BitAnd = 26, +RDI_EvalOp_BitOr = 27, +RDI_EvalOp_BitXor = 28, +RDI_EvalOp_BitNot = 29, +RDI_EvalOp_LogAnd = 30, +RDI_EvalOp_LogOr = 31, +RDI_EvalOp_LogNot = 32, +RDI_EvalOp_EqEq = 33, +RDI_EvalOp_NtEq = 34, +RDI_EvalOp_LsEq = 35, +RDI_EvalOp_GrEq = 36, +RDI_EvalOp_Less = 37, +RDI_EvalOp_Grtr = 38, +RDI_EvalOp_Trunc = 39, +RDI_EvalOp_TruncSigned = 40, +RDI_EvalOp_Convert = 41, +RDI_EvalOp_Pick = 42, +RDI_EvalOp_Pop = 43, +RDI_EvalOp_Insert = 44, +RDI_EvalOp_COUNT = 45, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -857,9 +855,7 @@ X(ConstU8)\ X(ConstU16)\ X(ConstU32)\ X(ConstU64)\ -X(ConstU128)\ -X(ConstU256)\ -X(ConstU512)\ +X(ConstString)\ X(Abs)\ X(Neg)\ X(Add)\ @@ -1357,6 +1353,6 @@ RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConver extern RDI_U16 rdi_section_element_size_table[37]; extern RDI_U8 rdi_section_is_required_table[37]; -extern RDI_U8 rdi_eval_op_ctrlbits_table[48]; +extern RDI_U8 rdi_eval_op_ctrlbits_table[46]; #endif // RDI_FORMAT_H diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index a41e577c..99021451 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -4,6 +4,7 @@ //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks // +// [ ] fix HRESULTs // [ ] file overrides -> always pick most specific one! found with conflicting // overrides, e.g. C:/devel/ -> D:/devel/, but also C:/devel/foo -> // C:/devel/bar, etc. diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 45a95846..24931608 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1245,38 +1245,36 @@ RDI_EvalOpTable: {ConstU16 13 2 0 1} {ConstU32 14 4 0 1} {ConstU64 15 8 0 1} - {ConstU128 16 16 0 1} - {ConstU256 17 32 0 1} - {ConstU512 18 64 0 1} - {Abs 19 1 1 1} - {Neg 20 1 1 1} - {Add 21 1 2 1} - {Sub 22 1 2 1} - {Mul 23 1 2 1} - {Div 24 1 2 1} - {Mod 25 1 2 1} - {LShift 26 1 2 1} - {RShift 27 1 2 1} - {BitAnd 28 1 2 1} - {BitOr 29 1 2 1} - {BitXor 30 1 2 1} - {BitNot 31 1 1 1} - {LogAnd 32 1 2 1} - {LogOr 33 1 2 1} - {LogNot 34 1 1 1} - {EqEq 35 1 2 1} - {NtEq 36 1 2 1} - {LsEq 37 1 2 1} - {GrEq 38 1 2 1} - {Less 39 1 2 1} - {Grtr 40 1 2 1} - {Trunc 41 1 1 1} - {TruncSigned 42 1 1 1} - {Convert 43 2 1 1} - {Pick 44 1 0 1} - {Pop 45 0 1 0} - {Insert 46 1 0 0} - {COUNT 47 0 0 0} + {ConstString 16 1 0 1} + {Abs 17 1 1 1} + {Neg 18 1 1 1} + {Add 19 1 2 1} + {Sub 20 1 2 1} + {Mul 21 1 2 1} + {Div 22 1 2 1} + {Mod 23 1 2 1} + {LShift 24 1 2 1} + {RShift 25 1 2 1} + {BitAnd 26 1 2 1} + {BitOr 27 1 2 1} + {BitXor 28 1 2 1} + {BitNot 29 1 1 1} + {LogAnd 30 1 2 1} + {LogOr 31 1 2 1} + {LogNot 32 1 1 1} + {EqEq 33 1 2 1} + {NtEq 34 1 2 1} + {LsEq 35 1 2 1} + {GrEq 36 1 2 1} + {Less 37 1 2 1} + {Grtr 38 1 2 1} + {Trunc 39 1 1 1} + {TruncSigned 40 1 1 1} + {Convert 41 2 1 1} + {Pick 42 1 0 1} + {Pop 43 0 1 0} + {Insert 44 1 0 0} + {COUNT 45 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form