continue;
}
- if (type->kind == Type_Kind_DynArray) {
- output_unsigned_integer(7, §ion_buff);
- output_unsigned_integer(type->DynArray.elem->id, §ion_buff);
- continue;
- }
+ // This would be nice if this would work...
+ // But it breaks when passing dynamic arrays as parameters.
+ // if (type->kind == Type_Kind_DynArray) {
+ // output_unsigned_integer(7, §ion_buff);
+ // output_unsigned_integer(type->DynArray.elem->id, §ion_buff);
+ // continue;
+ // }
if (type_is_structlike_strict(type)) {
output_unsigned_integer(3, §ion_buff);
+ output_unsigned_integer(type_structlike_is_simple(type), §ion_buff);
+
i32 mem_count = type_structlike_mem_count(type);
output_unsigned_integer(mem_count, §ion_buff);
} debug_type_structure_member_t;
typedef struct debug_type_structure_t {
+ b32 simple;
u32 member_count;
debug_type_structure_member_t *members;
} debug_type_structure_t;
break;
case debug_type_kind_structure:
+ type.structure.simple = uleb128_to_uint(data, &offset);
+
type.structure.member_count = uleb128_to_uint(data, &offset);
type.structure.members = bh_alloc_array(info->alloc, debug_type_structure_member_t, type.structure.member_count);
if (frame == &bh_arr_last(state->stack_frames)) {
val_num_base = state->value_number_offset;
} else {
- val_num_base = (frame + 1)->value_number_base;
+ val_num_base = frame->value_number_base;
}
*out = state->numbered_values[val_num_base + reg];
break;
}
+ // TODO: Should this output all of the members?
+ // Is this guaranteed to only have 1 member?
case debug_type_kind_structure: {
append_ovm_value_with_type(builder, value, type->structure.members[0].type);
break;
builder->it_name = mem->name;
if (builder->base_loc_kind == debug_sym_loc_register) {
- builder->base_loc += index;
+ if (type->structure.simple) {
+ builder->base_loc += index;
+
+ } else {
+ ovm_value_t value;
+ if (!lookup_register_in_frame(builder->ovm_state, builder->ovm_frame, builder->base_loc, &value)) {
+ goto bad_case;
+ }
+
+ builder->base_loc_kind = debug_sym_loc_global;
+ builder->base_loc = value.u32 + mem->offset;
+ }
}
else if (builder->base_loc_kind == debug_sym_loc_stack || builder->base_loc_kind == debug_sym_loc_global) {