static struct type *resolve_dynamic_type_internal
(struct type *type, struct property_addr_info *addr_stack,
- const frame_info_ptr &frame, bool top_level);
+ const frame_info_ptr &frame, reg_buffer *regcache, bool top_level);
/* Given a dynamic range type (dyn_range_type) and a stack of
struct property_addr_info elements, return a static version
resolve_dynamic_range (struct type *dyn_range_type,
struct property_addr_info *addr_stack,
const frame_info_ptr &frame,
+ reg_buffer *regcache,
int rank, bool resolve_p = true)
{
CORE_ADDR value;
const struct dynamic_prop *prop = &dyn_range_type->bounds ()->low;
if (resolve_p)
{
- if (dwarf2_evaluate_property (prop, frame, addr_stack, &value,
+ if (dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value,
{ (CORE_ADDR) rank }))
low_bound.set_const_val (value);
else if (prop->kind () == PROP_UNDEFINED)
prop = &dyn_range_type->bounds ()->high;
if (resolve_p)
{
- if (dwarf2_evaluate_property (prop, frame, addr_stack, &value,
+ if (dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value,
{ (CORE_ADDR) rank }))
{
/* In the case of a vector with tdesc parameter in the range, we
bool byte_stride_p = dyn_range_type->bounds ()->flag_is_byte_stride;
prop = &dyn_range_type->bounds ()->stride;
- if (resolve_p && dwarf2_evaluate_property (prop, frame, addr_stack, &value,
- { (CORE_ADDR) rank }))
+ if (resolve_p && dwarf2_evaluate_property (prop, frame, regcache, addr_stack,
+ &value, { (CORE_ADDR) rank }))
{
stride.set_const_val (value);
static_target_type
= resolve_dynamic_type_internal (dyn_range_type->target_type (),
- addr_stack, frame, false);
+ addr_stack, frame, regcache, false);
LONGEST bias = dyn_range_type->bounds ()->bias;
type_allocator alloc (dyn_range_type);
static_range_type = create_range_type_with_stride
resolve_dynamic_array_or_string_1 (struct type *type,
struct property_addr_info *addr_stack,
const frame_info_ptr &frame,
+ reg_buffer *regcache,
int rank, bool resolve_p)
{
CORE_ADDR value;
dimension of the array. */
prop = TYPE_ALLOCATED_PROP (type);
if (prop != NULL && resolve_p
- && dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ && dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
{
prop->set_const_val (value);
if (value == 0)
prop = TYPE_ASSOCIATED_PROP (type);
if (prop != NULL && resolve_p
- && dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ && dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
{
prop->set_const_val (value);
if (value == 0)
range_type = check_typedef (type->index_type ());
range_type
- = resolve_dynamic_range (range_type, addr_stack, frame, rank, resolve_p);
+ = resolve_dynamic_range (range_type, addr_stack, frame, regcache, rank,
+ resolve_p);
ary_dim = check_typedef (type->target_type ());
if (ary_dim != NULL && ary_dim->code () == TYPE_CODE_ARRAY)
{
ary_dim = copy_type (ary_dim);
elt_type = resolve_dynamic_array_or_string_1 (ary_dim, addr_stack,
- frame, rank - 1,
+ frame, regcache, rank - 1,
resolve_p);
}
else if (ary_dim != nullptr && ary_dim->code () == TYPE_CODE_STRING)
Fortran, and hope that this doesn't cause problems for anyone
else. */
elt_type = resolve_dynamic_type_internal (type->target_type (),
- addr_stack, frame, 0);
+ addr_stack, frame, regcache, 0);
}
else
elt_type = type->target_type ();
prop = nullptr;
if (prop != NULL && resolve_p)
{
- if (dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ if (dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
{
type->remove_dyn_prop (DYN_PROP_BYTE_STRIDE);
bit_stride = (unsigned int) (value * 8);
static struct type *
resolve_dynamic_array_or_string (struct type *type,
struct property_addr_info *addr_stack,
- const frame_info_ptr &frame)
+ const frame_info_ptr &frame,
+ reg_buffer *regcache)
{
CORE_ADDR value;
int rank = 0;
/* Resolve the rank property to get rank value. */
struct dynamic_prop *prop = TYPE_RANK_PROP (type);
- if (dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ if (dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
{
prop->set_const_val (value);
rank = value;
reduce the rank by 1 here. */
--rank;
- return resolve_dynamic_array_or_string_1 (type, addr_stack, frame, rank,
- true);
+ return resolve_dynamic_array_or_string_1 (type, addr_stack, frame, regcache,
+ rank, true);
}
/* Resolve dynamic bounds of members of the union TYPE to static
static struct type *
resolve_dynamic_union (struct type *type,
struct property_addr_info *addr_stack,
- const frame_info_ptr &frame)
+ const frame_info_ptr &frame,
+ reg_buffer *regcache)
{
struct type *resolved_type;
int i;
continue;
t = resolve_dynamic_type_internal (resolved_type->field (i).type (),
- addr_stack, frame, false);
+ addr_stack, frame, regcache, false);
resolved_type->field (i).set_type (t);
struct type *real_type = check_typedef (t);
static struct type *
resolve_dynamic_struct (struct type *type,
struct property_addr_info *addr_stack,
- const frame_info_ptr &frame)
+ const frame_info_ptr &frame,
+ reg_buffer *regcache)
{
struct type *resolved_type;
int i;
prop.set_locexpr (&baton);
CORE_ADDR addr;
- if (dwarf2_evaluate_property (&prop, frame, addr_stack, &addr,
- {addr_stack->addr}))
+ if (dwarf2_evaluate_property (&prop, frame, regcache, addr_stack,
+ &addr, {addr_stack->addr}))
resolved_type->field (i).set_loc_bitpos
(TARGET_CHAR_BIT * (addr - addr_stack->addr));
}
resolved_type->field (i).set_type
(resolve_dynamic_type_internal (resolved_type->field (i).type (),
- &pinfo, frame, false));
+ &pinfo, frame, regcache, false));
gdb_assert (resolved_type->field (i).loc_kind ()
== FIELD_LOC_KIND_BITPOS);
resolve_dynamic_type_internal (struct type *type,
struct property_addr_info *addr_stack,
const frame_info_ptr &frame,
+ reg_buffer *regcache,
bool top_level)
{
struct type *real_type = check_typedef (type);
std::optional<CORE_ADDR> type_length;
prop = TYPE_DYNAMIC_LENGTH (type);
if (prop != NULL
- && dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ && dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
type_length = value;
if (type->code () == TYPE_CODE_TYPEDEF)
resolved_type = copy_type (type);
resolved_type->set_target_type
(resolve_dynamic_type_internal (type->target_type (), addr_stack,
- frame, top_level));
+ frame, regcache, top_level));
}
else
{
{
resolved_type = copy_type (type);
resolved_type->set_target_type
- (resolve_dynamic_type_internal (type->target_type (),
- &pinfo, frame, true));
+ (resolve_dynamic_type_internal (type->target_type (), &pinfo,
+ frame, regcache, true));
}
break;
}
treated as one here. */
case TYPE_CODE_ARRAY:
resolved_type = resolve_dynamic_array_or_string (type, addr_stack,
- frame);
+ frame, regcache);
break;
case TYPE_CODE_RANGE:
this rank value is not actually required for the resolution of
the dynamic range, otherwise, we'd be resolving this range
within the context of a dynamic array. */
- resolved_type = resolve_dynamic_range (type, addr_stack, frame, 0);
+ resolved_type = resolve_dynamic_range (type, addr_stack, frame,
+ regcache, 0);
break;
case TYPE_CODE_UNION:
- resolved_type = resolve_dynamic_union (type, addr_stack, frame);
+ resolved_type = resolve_dynamic_union (type, addr_stack, frame,
+ regcache);
break;
case TYPE_CODE_STRUCT:
- resolved_type = resolve_dynamic_struct (type, addr_stack, frame);
+ resolved_type = resolve_dynamic_struct (type, addr_stack, frame,
+ regcache);
break;
}
}
/* Resolve data_location attribute. */
prop = TYPE_DATA_LOCATION (resolved_type);
if (prop != NULL
- && dwarf2_evaluate_property (prop, frame, addr_stack, &value))
+ && dwarf2_evaluate_property (prop, frame, regcache, addr_stack, &value))
{
/* Start of Fortran hack. See comment in f-lang.h for what is going
on here.*/
resolve_dynamic_type (struct type *type,
gdb::array_view<const gdb_byte> valaddr,
CORE_ADDR addr,
- const frame_info_ptr *in_frame)
+ const frame_info_ptr *in_frame,
+ reg_buffer *regcache)
{
struct property_addr_info pinfo
= {check_typedef (type), valaddr, addr, NULL};
if (in_frame != nullptr)
frame = *in_frame;
- return resolve_dynamic_type_internal (type, &pinfo, frame, true);
+ return resolve_dynamic_type_internal (type, &pinfo, frame, regcache, true);
}
/* See gdbtypes.h */