From 38c1e2a414cc0eaf387ee9460125310326b9bfc3 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Jun 2026 09:07:34 -0600 Subject: [PATCH] eval2: ptr arithmetic & comparisons --- project.raddbg | 38 +++---------------- src/eval2/eval2.c | 77 ++++++++++++++++++++++++++++++++++++-- src/eval2/eval2.h | 3 ++ src/scratch/ryan_scratch.c | 1 + 4 files changed, 84 insertions(+), 35 deletions(-) diff --git a/project.raddbg b/project.raddbg index 8c9b43d1..99025277 100644 --- a/project.raddbg +++ b/project.raddbg @@ -9,13 +9,6 @@ target: debug_subprocesses: 0 } target: -{ - executable: "build/raddbg.exe" - working_directory: "../raddebugger" - arguments: "--user:test123" - debug_subprocesses: 0 -} -target: { executable: "build/mule_main.exe" working_directory: build @@ -25,7 +18,6 @@ target: { executable: "build/torture.exe" working_directory: build - arguments: "raddbg/*" } target: { @@ -39,32 +31,14 @@ target: arguments: "--rdi raddbg" } target: -{ - executable: "build/release_version/raddbg.exe" - working_directory: "build/release_version" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi fat.so --capture" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi fat.debug --capture" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi raddbg" -} -watch_pin: expression: tag_hash_slots -target: { executable: "build/ryan_scratch.exe" working_directory: build enabled: 1 } +target: +{ + executable: "build/raddbg.exe" + working_directory: build + arguments: "--bin --dump test123.rdi" +} diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 2ca4ddee..80f1392e 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -550,6 +550,19 @@ e2_arch_from_type_key(E2_TypeKey k) return arch; } +//- rjf: type deep matches + +internal B32 +e2_type_deep_match(E2_TypeKey l, E2_TypeKey r) +{ + B32 result = e2_type_key_match(l, r); + if(!result) + { + // TODO(rjf) + } + return result; +} + //- rjf: type graph traversal primitives internal E2_TypeKey @@ -1985,13 +1998,54 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E //- rjf: pointer-add arithmetic case ArithKind_PtrAdd: { - // TODO(rjf) + // rjf: l/r -> ptr + int + E2_Expr *ptr_expr = lhs; + E2_Expr *int_expr = rhs; + if(e2_type_kind_is_ptr_or_ref(rhs_type_kind)) + { + ptr_expr = rhs; + int_expr = lhs; + } + + // rjf: unpack ptee type + E2_TypeKey ptee_type_key = e2_type_key_direct(e2_type_key_undecorate(ptr_expr->type_key)); + U64 ptee_byte_size = e2_byte_size_from_type_key(ptee_type_key); + + // rjf: form tree + E2_Expr *base_addr_expr = e2_expr_resolve_to_value(arena, ptr_expr); + E2_Expr *index_expr = e2_expr_resolve_to_value(arena, int_expr); + E2_Expr *offset_expr = index_expr; + if(ptee_byte_size > 1) + { + E2_Expr *size_expr = e2_expr_const_u64_or_smaller(arena, ptee_byte_size); + offset_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Mul, index_expr, size_expr); + } + E2_Expr *addr_value_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Add, base_addr_expr, offset_expr); + addr_value_expr->mode = E2_Mode_Address; + addr_value_expr->type_key = ptr_expr->type_key; + finished_root = addr_value_expr; }break; //- rjf: pointer-sub arithmetic case ArithKind_PtrSub: { - // TODO(rjf) + E2_Expr *lhs_addr_value_expr = e2_expr_resolve_to_value(arena, lhs); + E2_Expr *rhs_addr_value_expr = e2_expr_resolve_to_value(arena, rhs); + E2_Expr *sub_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Sub, lhs_addr_value_expr, rhs_addr_value_expr); + E2_Expr *sub_divided_expr = sub_expr; + E2_TypeKey lhs_ptr_type = e2_type_key_undecorate(lhs->type_key); + E2_TypeKey rhs_ptr_type = e2_type_key_undecorate(rhs->type_key); + E2_TypeKey lhs_ptee_type = e2_type_key_direct(lhs_ptr_type); + E2_TypeKey rhs_ptee_type = e2_type_key_direct(rhs_ptr_type); + if(e2_type_deep_match(lhs_ptee_type, rhs_ptee_type)) + { + U64 ptee_byte_size = e2_byte_size_from_type_key(lhs_ptee_type); + if(ptee_byte_size != 0) + { + sub_divided_expr = e2_expr_binary_op(arena, e2_type_key_basic(E2_TypeKind_U64), RDI_EvalOp_Div, sub_expr, e2_expr_const_u64_or_smaller(arena, ptee_byte_size)); + } + } + finished_root = sub_divided_expr; }break; //- rjf: pointer-array comparisons @@ -2003,7 +2057,24 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E //- rjf: type comparisons case ArithKind_TypeCompare: { - // TODO(rjf) + if(completed_task->op_kind == E2_OpKind_EqEq || + completed_task->op_kind == E2_OpKind_NtEq) + { + E2_TypeKey lhs_type_key = e2_type_key_unwrap(lhs->type_key, E2_TypeUnwrapFlag_Meta); + E2_TypeKey rhs_type_key = e2_type_key_unwrap(rhs->type_key, E2_TypeUnwrapFlag_Meta); + B32 types_match = e2_type_deep_match(lhs_type_key, rhs_type_key); + B32 result = types_match; + if(completed_task->op_kind == E2_OpKind_NtEq) + { + result = !result; + } + finished_root = e2_expr_const_u64_or_smaller(arena, (U64)result); + finished_root->type_key = e2_type_key_basic(E2_TypeKind_Bool); + } + else + { + e2_msgf(arena, &parse.msgs, completed_task->src_range, "Cannot use `%S` on types.", str8_skip_chop_whitespace(e2_op_kind_info_table[completed_task->op_kind].sep)); + } }break; } }break; diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index 71459b1f..a1c7ee21 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -490,6 +490,9 @@ internal U64 e2_shift_from_type_key(E2_TypeKey k); internal U64 e2_mask_count_from_type_key(E2_TypeKey k); internal Arch e2_arch_from_type_key(E2_TypeKey k); +//- rjf: type deep matches +internal B32 e2_type_deep_match(E2_TypeKey l, E2_TypeKey r); + //- rjf: type graph traversal primitives internal E2_TypeKey e2_type_key_direct(E2_TypeKey k); internal E2_TypeKey e2_type_key_owner(E2_TypeKey k); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index 0721d17a..bf85cd64 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -41,6 +41,7 @@ entry_point(CmdLine *cmdline) // (A) // int & B // (1 + (int)&B) + s("int32 == int32"), s("foo = 123"), s("1 > 2"), s("1 ? \"Test\" : 888"),