aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2008-01-08 17:40:09 +0000
committerJoel Brobecker <brobecker@gnat.com>2008-01-08 17:40:09 +0000
commita84a8a0d30b375691d864cf8d842fa19354e7e20 (patch)
tree860a3ce338ddc7c12fe126c23166274bbf7a48a8 /gdb/ada-lang.c
parent7eebcca8bd83b759da622cb306868147ce5b9312 (diff)
downloadgdb-a84a8a0d30b375691d864cf8d842fa19354e7e20.zip
gdb-a84a8a0d30b375691d864cf8d842fa19354e7e20.tar.gz
gdb-a84a8a0d30b375691d864cf8d842fa19354e7e20.tar.bz2
* ada-lang.c (ensure_lval): Fix value lval kind.
(convert_actual): Add handling for arguments passed by reference.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index a689b2e..2d1ce2f 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -3822,6 +3822,7 @@ ensure_lval (struct value *val, CORE_ADDR *sp)
if (gdbarch_frame_align_p (current_gdbarch))
*sp = gdbarch_frame_align (current_gdbarch, *sp);
}
+ VALUE_LVAL (val) = lval_memory;
write_memory (VALUE_ADDRESS (val), value_contents_raw (val), len);
}
@@ -3850,11 +3851,13 @@ convert_actual (struct value *actual, struct type *formal_type0,
if (ada_is_array_descriptor_type (formal_target)
&& TYPE_CODE (actual_target) == TYPE_CODE_ARRAY)
return make_array_descriptor (formal_type, actual, 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)
{
+ struct value *result;
if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY
&& ada_is_array_descriptor_type (actual_target))
- return desc_data (actual);
+ result = desc_data (actual);
else if (TYPE_CODE (actual_type) != TYPE_CODE_PTR)
{
if (VALUE_LVAL (actual) != lval_memory)
@@ -3867,8 +3870,11 @@ convert_actual (struct value *actual, struct type *formal_type0,
TYPE_LENGTH (actual_type));
actual = ensure_lval (val, sp);
}
- return value_addr (actual);
+ result = value_addr (actual);
}
+ else
+ return actual;
+ return value_cast_pointers (formal_type, result);
}
else if (TYPE_CODE (actual_type) == TYPE_CODE_PTR)
return ada_value_ind (actual);