mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-13 07:32:23 -07:00
fixes for arithmetic with bitfields; bitfield -> numeric value path in irtree generation; fix bad stomping / mutation when generating a synthetic UFCS tree
This commit is contained in:
+33
-1
@@ -301,6 +301,20 @@ e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_Type
|
||||
{
|
||||
result = e_irtree_mem_read_type(arena, tree, type_key);
|
||||
}
|
||||
if(e_type_kind_from_key(type_key) == E_TypeKind_Bitfield)
|
||||
{
|
||||
E_Type *type = e_type_from_key(type_key);
|
||||
if(type->byte_size <= sizeof(U64))
|
||||
{
|
||||
U64 valid_bits_mask = 0;
|
||||
for(U64 idx = 0; idx < type->count; idx += 1)
|
||||
{
|
||||
valid_bits_mask |= (1ull<<idx);
|
||||
}
|
||||
result = e_irtree_binary_op_u(arena, RDI_EvalOp_RShift, result, e_irtree_const_u(arena, type->off));
|
||||
result = e_irtree_binary_op_u(arena, RDI_EvalOp_BitAnd, result, e_irtree_const_u(arena, valid_bits_mask));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1002,6 +1016,22 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32
|
||||
E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||
E_TypeKind l_type_kind = e_type_kind_from_key(l_type);
|
||||
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||
|
||||
// rjf: resolve complex types to simple arithmetic tyeps
|
||||
if(l_type_kind == E_TypeKind_Bitfield)
|
||||
{
|
||||
l_tree.root = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_tree.type_key);
|
||||
l_type = e_type_key_unwrap(e_type_key_direct(l_tree.type_key), E_TypeUnwrapFlag_AllDecorative);
|
||||
l_type_kind = e_type_kind_from_key(r_type);
|
||||
l_tree.mode = E_Mode_Value;
|
||||
}
|
||||
if(r_type_kind == E_TypeKind_Bitfield)
|
||||
{
|
||||
r_tree.root = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_tree.type_key);
|
||||
r_type = e_type_key_unwrap(e_type_key_direct(r_tree.type_key), E_TypeUnwrapFlag_AllDecorative);
|
||||
r_type_kind = e_type_kind_from_key(r_type);
|
||||
r_tree.mode = E_Mode_Value;
|
||||
}
|
||||
if(l_type.kind == E_TypeKeyKind_Reg)
|
||||
{
|
||||
l_type_kind = E_TypeKind_U64;
|
||||
@@ -1012,6 +1042,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32
|
||||
r_type_kind = E_TypeKind_U64;
|
||||
r_type = e_type_key_basic(r_type_kind);
|
||||
}
|
||||
|
||||
// rjf: unpack info about resolved types
|
||||
B32 l_is_pointer = (l_type_kind == E_TypeKind_Ptr);
|
||||
B32 l_is_decay = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Offset);
|
||||
B32 l_is_pointer_like = (l_is_pointer || l_is_decay);
|
||||
@@ -1355,7 +1387,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32
|
||||
// calls - for example, bin(2).digits(4)
|
||||
else if(lhs->kind == E_ExprKind_MemberAccess && lhs->first->next != &e_expr_nil)
|
||||
{
|
||||
E_Expr *callee = lhs->first->next;
|
||||
E_Expr *callee = e_expr_ref(arena, lhs->first->next);
|
||||
E_Expr *first_arg = e_expr_ref(arena, lhs->first);
|
||||
E_Expr *call = e_push_expr(arena, E_ExprKind_Call, r1u64(0, 0));
|
||||
e_expr_push_child(call, callee);
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
# define raddbg_pin(expr, ...) /* NOTE(rjf): inspected by debugger ui - does not change program execution */
|
||||
# define raddbg_log(fmt, ...) raddbg_log__impl((fmt), __VA_ARGS__)
|
||||
# define raddbg_entry_point(...) raddbg_exe_data char raddbg_gen_data_id()[] = ("entry_point: \"" #__VA_ARGS__ "\"")
|
||||
# define raddbg_type_view(type, ...) raddbg_exe_data char raddbg_gen_data_id()[] = ("type_view: {type: \"" #type "\", expr: \"" #__VA_ARGS__ "\"}")
|
||||
# define raddbg_type_view(type, ...) raddbg_exe_data char raddbg_gen_data_id()[] = ("type_view: {type: ```" #type "```, expr: ```" #__VA_ARGS__ "```}")
|
||||
# define raddbg_add_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (1), (size), (r), (w), (x))
|
||||
# define raddbg_remove_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (0), (size), (r), (w), (x))
|
||||
#else
|
||||
|
||||
@@ -196,6 +196,25 @@ union Matrix4x4F32
|
||||
};
|
||||
raddbg_type_view(Matrix4x4F32, table($.elements, $[0], $[1], $[2], $[3]));
|
||||
|
||||
union PackedF16
|
||||
{
|
||||
uint16_t v;
|
||||
struct
|
||||
{
|
||||
uint16_t mantissa : 10;
|
||||
uint16_t exponent : 5;
|
||||
uint16_t sign : 1;
|
||||
};
|
||||
};
|
||||
raddbg_type_view(PackedF16,
|
||||
exponent == 0 ? (0.00006103515625f*mantissa/1024.f) :
|
||||
(exponent == 31 && mantissa == 0 && sign == 1) ? "-infinity" :
|
||||
(exponent == 31 && mantissa == 0 && sign == 1) ? "+infinity" :
|
||||
(exponent == 31) ? "NaN" :
|
||||
(exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) :
|
||||
(exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) :
|
||||
((sign * -2 + 1) * 1.f + mantissa/1024.f));
|
||||
|
||||
enum Kind
|
||||
{
|
||||
Kind_None,
|
||||
@@ -1823,6 +1842,21 @@ fancy_viz_eval_tests(void)
|
||||
raddbg_pin(text(code_string, lang=c));
|
||||
raddbg_pin(disasm(fancy_viz_eval_tests));
|
||||
|
||||
//- rjf: half-floats
|
||||
PackedF16 f16s[] =
|
||||
{
|
||||
{0x0001}, // ~0.000000059604645
|
||||
{0x03ff}, // ~0.000060975552
|
||||
{0x0400}, // ~0.00006103515625
|
||||
{0x3555}, // ~0.33325195
|
||||
{0x3bff}, // ~0.99951172
|
||||
{0x3c00}, // 1
|
||||
{0x3c01}, // 1.00097656
|
||||
{0x7bff}, // 65504,
|
||||
{0x7c00}, // +inf
|
||||
{0xfc00}, // -inf
|
||||
};
|
||||
|
||||
//- rjf: table index lookups
|
||||
struct
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user