diff --git a/src/base/base_math.c b/src/base/base_math.c index 16e3ad28..266d6a45 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -708,12 +708,19 @@ rgba_from_u32(U32 hex) //~ rjf: List Type Functions internal void +rng1u64_list_push_node(Rng1U64List *list, Rng1U64Node *n) +{ + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal Rng1U64Node * rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng) { Rng1U64Node *n = push_array(arena, Rng1U64Node, 1); MemoryCopyStruct(&n->v, &rng); - SLLQueuePush(list->first, list->last, n); - list->count += 1; + rng1u64_list_push_node(list, n); + return n; } internal void diff --git a/src/base/base_math.h b/src/base/base_math.h index 416dfeeb..37dd6c7a 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -678,7 +678,8 @@ internal Vec4F32 rgba_from_u32(U32 hex); //////////////////////////////// //~ rjf: List Type Functions -internal void rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng); +internal void rng1u64_list_push_node(Rng1U64List *list, Rng1U64Node *n); +internal Rng1U64Node * rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng); internal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat); internal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list); internal U64 rng_1u64_array_bsearch(Rng1U64Array arr, U64 value); diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.c b/src/rdi_from_dwarf/rdi_from_dwarf.c index 89103aa1..1b9f61e4 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.c +++ b/src/rdi_from_dwarf/rdi_from_dwarf.c @@ -169,13 +169,20 @@ internal Rng1U64List d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag) { // collect non-contiguous range - Rng1U64List ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); + Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges); + + // exclude invalid ranges caused by linker optimizations + Rng1U64List ranges = {0}; + for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) { + next = n->next; + if (n->v.min < image_base || n->v.min > n->v.max) { + continue; + } + rng1u64_list_push_node(&ranges, n); + } // debase ranges for EachNode(r, Rng1U64Node, ranges.first) { - // TODO: error handling - AssertAlways(r->v.min >= image_base); - AssertAlways(r->v.max >= image_base); r->v.min -= image_base; r->v.max -= image_base; } @@ -2808,8 +2815,10 @@ d2r_convert(Arena *arena, D2R_ConvertParams *params) if (cu_idx < cu_contrib_map.count) { cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min); } else { - // TODO: synthesize cu ranges from scopes - NotImplemented; + Rng1U64List range_list = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag); + for EachNode(n, Rng1U64Node, range_list.first) { + rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max }); + } } // convert compile unit diff --git a/src/rdi_from_dwarf/rdi_from_dwarf.h b/src/rdi_from_dwarf/rdi_from_dwarf.h index c66d3e95..c394181e 100644 --- a/src/rdi_from_dwarf/rdi_from_dwarf.h +++ b/src/rdi_from_dwarf/rdi_from_dwarf.h @@ -119,19 +119,19 @@ internal U64 rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_ba //~ rjf: Bytecode Conversion Helpers internal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type); -internal D2R_ValueType d2r_value_type_stack_pop(D2R_ValueTypeStack *stack); -internal D2R_ValueType d2r_value_type_stack_peek(D2R_ValueTypeStack *stack); +internal D2R_ValueType d2r_value_type_stack_pop(D2R_ValueTypeStack *stack); +internal D2R_ValueType d2r_value_type_stack_peek(D2R_ValueTypeStack *stack); -internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); -internal D2R_ValueType d2r_signed_value_type_from_bit_size(U64 bit_size); -internal D2R_ValueType d2r_float_type_from_bit_size(U64 bit_size); +internal D2R_ValueType d2r_unsigned_value_type_from_bit_size(U64 bit_size); +internal D2R_ValueType d2r_signed_value_type_from_bit_size(U64 bit_size); +internal D2R_ValueType d2r_float_type_from_bit_size(U64 bit_size); internal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v); -internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); -internal D2R_ValueType d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs); +internal U64 d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type); +internal D2R_ValueType d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs); internal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc); -internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); -internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); +internal void d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); +internal void d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op); internal RDIM_EvalBytecode d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out); internal RDIM_Location * d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr);