diff options
author | Vasiliy Fofanov <fofanov@adacore.com> | 2009-08-11 16:33:41 +0000 |
---|---|---|
committer | Douglas Rupp <rupp@gcc.gnu.org> | 2009-08-11 16:33:41 +0000 |
commit | 050d3f9d806005a0951d13b742b75d8bee38f3f9 (patch) | |
tree | dce32ed9aa9c73c4a1653f820255b540db9437cd /gcc | |
parent | 2fa8205d74c37fc5ff73c03a7f04dec2faf0bf2d (diff) | |
download | gcc-050d3f9d806005a0951d13b742b75d8bee38f3f9.zip gcc-050d3f9d806005a0951d13b742b75d8bee38f3f9.tar.gz gcc-050d3f9d806005a0951d13b742b75d8bee38f3f9.tar.bz2 |
alpha.c (alpha_return_in_memory): On VMS...
* config/alpha/alpha.c (alpha_return_in_memory): On VMS, ensure
that records that fit in 64 bits are returned by immediate value,
as required by OpenVMS Calling Standard.
(function_value): Adjust for above modification.
(alpha_va_start) <TARGET_ABI_OPEN_VMS>: Use
virtual_incoming_args_rtx as base object, not next_arg.
* config/alpha/vms.h: (DEFAULT_PCC_STRUCT_RETURN): Define as 0.
Co-Authored-By: Douglas B Rupp <rupp@gnat.com>
Co-Authored-By: Eric Botcazou <ebotcazou@adacore.com>
From-SVN: r150652
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/alpha/alpha.c | 29 | ||||
-rw-r--r-- | gcc/config/alpha/vms.h | 4 |
3 files changed, 35 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8aaa865..74736d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2009-08-11 Vasiliy Fofanov <fofanov@adacore.com> + Eric Botcazou <botcazou@adacore.com> + Douglas B Rupp <rupp@gnat.com> + + * config/alpha/alpha.c (alpha_return_in_memory): On VMS, ensure + that records that fit in 64 bits are returned by immediate value, + as required by OpenVMS Calling Standard. + (function_value): Adjust for above modification. + (alpha_va_start) <TARGET_ABI_OPEN_VMS>: Use + virtual_incoming_args_rtx as base object, not next_arg. + * config/alpha/vms.h: (DEFAULT_PCC_STRUCT_RETURN): Define as 0. + 2009-08-11 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> * reload.c (find_reloads_subreg_address): Check the original diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index a1ec736..ccf9288 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -5771,7 +5771,14 @@ alpha_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED) { mode = TYPE_MODE (type); - /* All aggregates are returned in memory. */ + /* All aggregates are returned in memory, except on OpenVMS where + records that fit 64 bits should be returned by immediate value + as required by section 3.8.7.1 of the OpenVMS Calling Standard. */ + if (TARGET_ABI_OPEN_VMS + && TREE_CODE (type) != ARRAY_TYPE + && (unsigned HOST_WIDE_INT) int_size_in_bytes(type) <= 8) + return false; + if (AGGREGATE_TYPE_P (type)) return true; } @@ -5842,7 +5849,10 @@ function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED, switch (mclass) { case MODE_INT: - PROMOTE_MODE (mode, dummy, valtype); + /* Do the same thing as PROMOTE_MODE except for libcalls on VMS, + where we have them returning both SImode and DImode. */ + if (!(TARGET_ABI_OPEN_VMS && valtype && AGGREGATE_TYPE_P (valtype))) + PROMOTE_MODE (mode, dummy, valtype); /* FALLTHRU */ case MODE_COMPLEX_INT: @@ -5867,6 +5877,12 @@ function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED, GEN_INT (GET_MODE_SIZE (cmode))))); } + case MODE_RANDOM: + /* We should only reach here for BLKmode on VMS. */ + gcc_assert (TARGET_ABI_OPEN_VMS && mode == BLKmode); + regnum = 0; + break; + default: gcc_unreachable (); } @@ -6260,12 +6276,11 @@ alpha_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) if (TARGET_ABI_OPEN_VMS) { - nextarg = plus_constant (nextarg, offset); - nextarg = plus_constant (nextarg, NUM_ARGS * UNITS_PER_WORD); - t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, - make_tree (ptr_type_node, nextarg)); + t = make_tree (ptr_type_node, virtual_incoming_args_rtx); + t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, + size_int (offset + NUM_ARGS * UNITS_PER_WORD)); + t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); TREE_SIDE_EFFECTS (t) = 1; - expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); } else diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h index 3aff33c..819dee4 100644 --- a/gcc/config/alpha/vms.h +++ b/gcc/config/alpha/vms.h @@ -191,9 +191,7 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; (CUM).num_args += ALPHA_ARG_SIZE (MODE, TYPE, NAMED); \ } -/* ABI has stack checking, but it's broken. */ -#undef STACK_CHECK_BUILTIN -#define STACK_CHECK_BUILTIN 0 +#define DEFAULT_PCC_STRUCT_RETURN 0 #undef ASM_WEAKEN_LABEL #define ASM_WEAKEN_LABEL(FILE, NAME) \ |