eval2: ptr arithmetic & comparisons

This commit is contained in:
Ryan Fleury
2026-06-25 09:07:34 -06:00
parent c817d1f136
commit 38c1e2a414
4 changed files with 84 additions and 35 deletions
+6 -32
View File
@@ -9,13 +9,6 @@ target:
debug_subprocesses: 0 debug_subprocesses: 0
} }
target: target:
{
executable: "build/raddbg.exe"
working_directory: "../raddebugger"
arguments: "--user:test123"
debug_subprocesses: 0
}
target:
{ {
executable: "build/mule_main.exe" executable: "build/mule_main.exe"
working_directory: build working_directory: build
@@ -25,7 +18,6 @@ target:
{ {
executable: "build/torture.exe" executable: "build/torture.exe"
working_directory: build working_directory: build
arguments: "raddbg/*"
} }
target: target:
{ {
@@ -39,32 +31,14 @@ target:
arguments: "--rdi raddbg" arguments: "--rdi raddbg"
} }
target: 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" executable: "build/ryan_scratch.exe"
working_directory: build working_directory: build
enabled: 1 enabled: 1
} }
target:
{
executable: "build/raddbg.exe"
working_directory: build
arguments: "--bin --dump test123.rdi"
}
+74 -3
View File
@@ -550,6 +550,19 @@ e2_arch_from_type_key(E2_TypeKey k)
return arch; 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 //- rjf: type graph traversal primitives
internal E2_TypeKey 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 //- rjf: pointer-add arithmetic
case ArithKind_PtrAdd: 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; }break;
//- rjf: pointer-sub arithmetic //- rjf: pointer-sub arithmetic
case ArithKind_PtrSub: 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; }break;
//- rjf: pointer-array comparisons //- 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 //- rjf: type comparisons
case ArithKind_TypeCompare: 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;
} }
}break; }break;
+3
View File
@@ -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 U64 e2_mask_count_from_type_key(E2_TypeKey k);
internal Arch e2_arch_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 //- rjf: type graph traversal primitives
internal E2_TypeKey e2_type_key_direct(E2_TypeKey k); internal E2_TypeKey e2_type_key_direct(E2_TypeKey k);
internal E2_TypeKey e2_type_key_owner(E2_TypeKey k); internal E2_TypeKey e2_type_key_owner(E2_TypeKey k);
+1
View File
@@ -41,6 +41,7 @@ entry_point(CmdLine *cmdline)
// (A) // (A)
// int & B // int & B
// (1 + (int)&B) // (1 + (int)&B)
s("int32 == int32"),
s("foo = 123"), s("foo = 123"),
s("1 > 2"), s("1 > 2"),
s("1 ? \"Test\" : 888"), s("1 ? \"Test\" : 888"),