diff options
Diffstat (limited to 'gcc/config/rs6000')
| -rw-r--r-- | gcc/config/rs6000/aix.h | 7 | ||||
| -rw-r--r-- | gcc/config/rs6000/linux64.h | 10 | ||||
| -rw-r--r-- | gcc/config/rs6000/rs6000.c | 16 |
3 files changed, 15 insertions, 18 deletions
diff --git a/gcc/config/rs6000/aix.h b/gcc/config/rs6000/aix.h index 8875207..38196d7 100644 --- a/gcc/config/rs6000/aix.h +++ b/gcc/config/rs6000/aix.h @@ -183,13 +183,6 @@ #define AGGREGATE_PADDING_FIXED 1 #define AGGREGATES_PAD_UPWARD_ALWAYS 1 -/* We don't want anything in the reg parm area being passed on the - stack. */ -#define MUST_PASS_IN_STACK(MODE, TYPE) \ - ((TYPE) != 0 \ - && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \ - || TREE_ADDRESSABLE (TYPE))) - /* Specify padding for the last element of a block move between registers and memory. FIRST is nonzero if this is the only element. */ diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index a63cb5f..5ebc19c 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -259,16 +259,6 @@ #define AGGREGATE_PADDING_FIXED TARGET_64BIT #define AGGREGATES_PAD_UPWARD_ALWAYS 0 -/* We don't want anything in the reg parm area being passed on the - stack. */ -#define MUST_PASS_IN_STACK(MODE, TYPE) \ - ((TARGET_64BIT \ - && (TYPE) != 0 \ - && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \ - || TREE_ADDRESSABLE (TYPE))) \ - || (!TARGET_64BIT \ - && default_must_pass_in_stack ((MODE), (TYPE)))) - /* Specify padding for the last element of a block move between registers and memory. FIRST is nonzero if this is the only element. */ diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 0722ed7..ea81e8b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -744,6 +744,7 @@ static tree get_prev_label (tree function_name); static tree rs6000_build_builtin_va_list (void); static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *); +static bool rs6000_must_pass_in_stack (enum machine_mode, tree); /* Hash table stuff for keeping track of TOC entries. */ @@ -948,6 +949,8 @@ static const char alt_reg_names[][8] = #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED hook_bool_CUMULATIVE_ARGS_true #undef TARGET_SPLIT_COMPLEX_ARG #define TARGET_SPLIT_COMPLEX_ARG hook_bool_tree_true +#undef TARGET_MUST_PASS_IN_STACK +#define TARGET_MUST_PASS_IN_STACK rs6000_must_pass_in_stack #undef TARGET_BUILD_BUILTIN_VA_LIST #define TARGET_BUILD_BUILTIN_VA_LIST rs6000_build_builtin_va_list @@ -4525,6 +4528,17 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, } } +/* Return true if TYPE must be passed on the stack and not in registers. */ + +static bool +rs6000_must_pass_in_stack (enum machine_mode mode, tree type) +{ + if (DEFAULT_ABI == ABI_AIX || TARGET_64BIT) + return must_pass_in_stack_var_size (mode, type); + else + return must_pass_in_stack_var_size_or_pad (mode, type); +} + /* If defined, a C expression which determines whether, and in which direction, to pad out an argument with extra space. The value should be of type `enum direction': either `upward' to pad above @@ -5261,7 +5275,7 @@ setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode, save_area = virtual_incoming_args_rtx; cfun->machine->sysv_varargs_p = 0; - if (MUST_PASS_IN_STACK (mode, type)) + if (targetm.calls.must_pass_in_stack (mode, type)) first_reg_offset += rs6000_arg_size (TYPE_MODE (type), type); } |
