forked from Imagelibrary/binutils-gdb
* ada-lang.h (ada_convert_actual): Add GDBARCH argument.
* ada-lang.c (convert_actual): Remove stale prototype. (ensure_lval, make_array_descriptor, ada_convert_actual): Add GDBARCH argument and pass through to subroutine calls. (ensure_lval): Use GDBARCH instead of current_gdbarch. * infcall.c (value_arg_coerce): Update ada_convert_actual call.
This commit is contained in:
@@ -1,3 +1,12 @@
|
|||||||
|
2009-06-29 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
|
* ada-lang.h (ada_convert_actual): Add GDBARCH argument.
|
||||||
|
* ada-lang.c (convert_actual): Remove stale prototype.
|
||||||
|
(ensure_lval, make_array_descriptor, ada_convert_actual):
|
||||||
|
Add GDBARCH argument and pass through to subroutine calls.
|
||||||
|
(ensure_lval): Use GDBARCH instead of current_gdbarch.
|
||||||
|
* infcall.c (value_arg_coerce): Update ada_convert_actual call.
|
||||||
|
|
||||||
2009-06-29 Ulrich Weigand <uweigand@de.ibm.com>
|
2009-06-29 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* ada-lang.c (resolve): Use per-architecture void type instead
|
* ada-lang.c (resolve): Use per-architecture void type instead
|
||||||
|
|||||||
@@ -101,13 +101,11 @@ static int ada_type_match (struct type *, struct type *, int);
|
|||||||
|
|
||||||
static int ada_args_match (struct symbol *, struct value **, int);
|
static int ada_args_match (struct symbol *, struct value **, int);
|
||||||
|
|
||||||
static struct value *ensure_lval (struct value *, CORE_ADDR *);
|
static struct value *ensure_lval (struct value *,
|
||||||
|
struct gdbarch *, CORE_ADDR *);
|
||||||
static struct value *convert_actual (struct value *, struct type *,
|
|
||||||
CORE_ADDR *);
|
|
||||||
|
|
||||||
static struct value *make_array_descriptor (struct type *, struct value *,
|
static struct value *make_array_descriptor (struct type *, struct value *,
|
||||||
CORE_ADDR *);
|
struct gdbarch *, CORE_ADDR *);
|
||||||
|
|
||||||
static void ada_add_block_symbols (struct obstack *,
|
static void ada_add_block_symbols (struct obstack *,
|
||||||
struct block *, const char *,
|
struct block *, const char *,
|
||||||
@@ -3729,7 +3727,7 @@ parse_old_style_renaming (struct type *type,
|
|||||||
returning an lvalue whose value_address points to the copy. */
|
returning an lvalue whose value_address points to the copy. */
|
||||||
|
|
||||||
static struct value *
|
static struct value *
|
||||||
ensure_lval (struct value *val, CORE_ADDR *sp)
|
ensure_lval (struct value *val, struct gdbarch *gdbarch, CORE_ADDR *sp)
|
||||||
{
|
{
|
||||||
if (! VALUE_LVAL (val))
|
if (! VALUE_LVAL (val))
|
||||||
{
|
{
|
||||||
@@ -3738,25 +3736,25 @@ ensure_lval (struct value *val, CORE_ADDR *sp)
|
|||||||
/* The following is taken from the structure-return code in
|
/* The following is taken from the structure-return code in
|
||||||
call_function_by_hand. FIXME: Therefore, some refactoring seems
|
call_function_by_hand. FIXME: Therefore, some refactoring seems
|
||||||
indicated. */
|
indicated. */
|
||||||
if (gdbarch_inner_than (current_gdbarch, 1, 2))
|
if (gdbarch_inner_than (gdbarch, 1, 2))
|
||||||
{
|
{
|
||||||
/* Stack grows downward. Align SP and value_address (val) after
|
/* Stack grows downward. Align SP and value_address (val) after
|
||||||
reserving sufficient space. */
|
reserving sufficient space. */
|
||||||
*sp -= len;
|
*sp -= len;
|
||||||
if (gdbarch_frame_align_p (current_gdbarch))
|
if (gdbarch_frame_align_p (gdbarch))
|
||||||
*sp = gdbarch_frame_align (current_gdbarch, *sp);
|
*sp = gdbarch_frame_align (gdbarch, *sp);
|
||||||
set_value_address (val, *sp);
|
set_value_address (val, *sp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Stack grows upward. Align the frame, allocate space, and
|
/* Stack grows upward. Align the frame, allocate space, and
|
||||||
then again, re-align the frame. */
|
then again, re-align the frame. */
|
||||||
if (gdbarch_frame_align_p (current_gdbarch))
|
if (gdbarch_frame_align_p (gdbarch))
|
||||||
*sp = gdbarch_frame_align (current_gdbarch, *sp);
|
*sp = gdbarch_frame_align (gdbarch, *sp);
|
||||||
set_value_address (val, *sp);
|
set_value_address (val, *sp);
|
||||||
*sp += len;
|
*sp += len;
|
||||||
if (gdbarch_frame_align_p (current_gdbarch))
|
if (gdbarch_frame_align_p (gdbarch))
|
||||||
*sp = gdbarch_frame_align (current_gdbarch, *sp);
|
*sp = gdbarch_frame_align (gdbarch, *sp);
|
||||||
}
|
}
|
||||||
VALUE_LVAL (val) = lval_memory;
|
VALUE_LVAL (val) = lval_memory;
|
||||||
|
|
||||||
@@ -3773,7 +3771,7 @@ ensure_lval (struct value *val, CORE_ADDR *sp)
|
|||||||
|
|
||||||
struct value *
|
struct value *
|
||||||
ada_convert_actual (struct value *actual, struct type *formal_type0,
|
ada_convert_actual (struct value *actual, struct type *formal_type0,
|
||||||
CORE_ADDR *sp)
|
struct gdbarch *gdbarch, CORE_ADDR *sp)
|
||||||
{
|
{
|
||||||
struct type *actual_type = ada_check_typedef (value_type (actual));
|
struct type *actual_type = ada_check_typedef (value_type (actual));
|
||||||
struct type *formal_type = ada_check_typedef (formal_type0);
|
struct type *formal_type = ada_check_typedef (formal_type0);
|
||||||
@@ -3786,7 +3784,7 @@ ada_convert_actual (struct value *actual, struct type *formal_type0,
|
|||||||
|
|
||||||
if (ada_is_array_descriptor_type (formal_target)
|
if (ada_is_array_descriptor_type (formal_target)
|
||||||
&& TYPE_CODE (actual_target) == TYPE_CODE_ARRAY)
|
&& TYPE_CODE (actual_target) == TYPE_CODE_ARRAY)
|
||||||
return make_array_descriptor (formal_type, actual, sp);
|
return make_array_descriptor (formal_type, actual, gdbarch, sp);
|
||||||
else if (TYPE_CODE (formal_type) == TYPE_CODE_PTR
|
else if (TYPE_CODE (formal_type) == TYPE_CODE_PTR
|
||||||
|| TYPE_CODE (formal_type) == TYPE_CODE_REF)
|
|| TYPE_CODE (formal_type) == TYPE_CODE_REF)
|
||||||
{
|
{
|
||||||
@@ -3804,7 +3802,7 @@ ada_convert_actual (struct value *actual, struct type *formal_type0,
|
|||||||
memcpy ((char *) value_contents_raw (val),
|
memcpy ((char *) value_contents_raw (val),
|
||||||
(char *) value_contents (actual),
|
(char *) value_contents (actual),
|
||||||
TYPE_LENGTH (actual_type));
|
TYPE_LENGTH (actual_type));
|
||||||
actual = ensure_lval (val, sp);
|
actual = ensure_lval (val, gdbarch, sp);
|
||||||
}
|
}
|
||||||
result = value_addr (actual);
|
result = value_addr (actual);
|
||||||
}
|
}
|
||||||
@@ -3826,7 +3824,8 @@ ada_convert_actual (struct value *actual, struct type *formal_type0,
|
|||||||
representing a pointer to this descriptor. */
|
representing a pointer to this descriptor. */
|
||||||
|
|
||||||
static struct value *
|
static struct value *
|
||||||
make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
|
make_array_descriptor (struct type *type, struct value *arr,
|
||||||
|
struct gdbarch *gdbarch, CORE_ADDR *sp)
|
||||||
{
|
{
|
||||||
struct type *bounds_type = desc_bounds_type (type);
|
struct type *bounds_type = desc_bounds_type (type);
|
||||||
struct type *desc_type = desc_base_type (type);
|
struct type *desc_type = desc_base_type (type);
|
||||||
@@ -3846,10 +3845,10 @@ make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
|
|||||||
desc_bound_bitsize (bounds_type, i, 1));
|
desc_bound_bitsize (bounds_type, i, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
bounds = ensure_lval (bounds, sp);
|
bounds = ensure_lval (bounds, gdbarch, sp);
|
||||||
|
|
||||||
modify_general_field (value_contents_writeable (descriptor),
|
modify_general_field (value_contents_writeable (descriptor),
|
||||||
value_address (ensure_lval (arr, sp)),
|
value_address (ensure_lval (arr, gdbarch, sp)),
|
||||||
fat_pntr_data_bitpos (desc_type),
|
fat_pntr_data_bitpos (desc_type),
|
||||||
fat_pntr_data_bitsize (desc_type));
|
fat_pntr_data_bitsize (desc_type));
|
||||||
|
|
||||||
@@ -3858,7 +3857,7 @@ make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
|
|||||||
fat_pntr_bounds_bitpos (desc_type),
|
fat_pntr_bounds_bitpos (desc_type),
|
||||||
fat_pntr_bounds_bitsize (desc_type));
|
fat_pntr_bounds_bitsize (desc_type));
|
||||||
|
|
||||||
descriptor = ensure_lval (descriptor, sp);
|
descriptor = ensure_lval (descriptor, gdbarch, sp);
|
||||||
|
|
||||||
if (TYPE_CODE (type) == TYPE_CODE_PTR)
|
if (TYPE_CODE (type) == TYPE_CODE_PTR)
|
||||||
return value_addr (descriptor);
|
return value_addr (descriptor);
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ extern void ada_printstr (struct ui_file *, struct type *, const gdb_byte *,
|
|||||||
|
|
||||||
struct value *ada_convert_actual (struct value *actual,
|
struct value *ada_convert_actual (struct value *actual,
|
||||||
struct type *formal_type0,
|
struct type *formal_type0,
|
||||||
|
struct gdbarch *gdbarch,
|
||||||
CORE_ADDR *sp);
|
CORE_ADDR *sp);
|
||||||
|
|
||||||
extern struct value *ada_value_subscript (struct value *, int,
|
extern struct value *ada_value_subscript (struct value *, int,
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg,
|
|||||||
|
|
||||||
/* Perform any Ada-specific coercion first. */
|
/* Perform any Ada-specific coercion first. */
|
||||||
if (current_language->la_language == language_ada)
|
if (current_language->la_language == language_ada)
|
||||||
arg = ada_convert_actual (arg, type, sp);
|
arg = ada_convert_actual (arg, type, gdbarch, sp);
|
||||||
|
|
||||||
/* Force the value to the target if we will need its address. At
|
/* Force the value to the target if we will need its address. At
|
||||||
this point, we could allocate arguments on the stack instead of
|
this point, we could allocate arguments on the stack instead of
|
||||||
|
|||||||
Reference in New Issue
Block a user