Message ID | 452eaa4b26900f05171ab5b782b3ec8bed216785.1543969053.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
Series | rs6000: Fix AIX aggregate passing fix | expand |
On Tue, Dec 4, 2018 at 7:26 PM Segher Boessenkool <segher@kernel.crashing.org> wrote: > > David's fix for the AIX aggregate passing from yesterday unfortunately > also triggers on powerpc64-linux. This fixes it. > > David, looking at this once more, does this not need a "&& type" test > on AIX? Before the AGGREGATE_TYPE_P test. I suspect it only didn't > crash on AIX because AIX doesn't mind dereferencing address 0? The APIs for the functions explicitly allow type to be NULL for libcalls, so type should be tested. AIX allows dereference of NULL pointer, which explains the lack of symptoms on AIX. As far as I can tell, adding a test for non-NULL type does not cause additional incompatibilities. I am committing the appended patch. Bootstrapped on powerpc-ibm-aix7.2.0.0. Thanks, David * config/rs6000/rs6000.c (rs6000_function_arg): Ensure type is non-NULL. (rs6000_arg_partial_bytes): Same. Index: rs6000.c =================================================================== --- rs6000.c (revision 267103) +++ rs6000.c (working copy) @@ -11999,7 +11999,8 @@ rs6000_function_arg (cumulative_args_t cum_v, mach cum->fregno++; if (USE_FP_FOR_ARG_P (cum, elt_mode) - && !(TARGET_AIX && !TARGET_ELF && AGGREGATE_TYPE_P (type))) + && !(TARGET_AIX && !TARGET_ELF + && type != NULL && AGGREGATE_TYPE_P (type))) { rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1]; rtx r, off; @@ -12136,7 +12137,8 @@ rs6000_arg_partial_bytes (cumulative_args_t cum_v, align_words = rs6000_parm_start (mode, type, cum->words); if (USE_FP_FOR_ARG_P (cum, elt_mode) - && !(TARGET_AIX && !TARGET_ELF && AGGREGATE_TYPE_P (type))) + && !(TARGET_AIX && !TARGET_ELF + && type != NULL && AGGREGATE_TYPE_P (type))) { unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 4e35a05..ea7ff82 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -11990,7 +11990,7 @@ rs6000_function_arg (cumulative_args_t cum_v, machine_mode mode, cum->fregno++; if (USE_FP_FOR_ARG_P (cum, elt_mode) - && !(TARGET_AIX && AGGREGATE_TYPE_P (type))) + && !(TARGET_AIX && !TARGET_ELF && AGGREGATE_TYPE_P (type))) { rtx rvec[GP_ARG_NUM_REG + AGGR_ARG_NUM_REG + 1]; rtx r, off; @@ -12127,7 +12127,7 @@ rs6000_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode, align_words = rs6000_parm_start (mode, type, cum->words); if (USE_FP_FOR_ARG_P (cum, elt_mode) - && !(TARGET_AIX && AGGREGATE_TYPE_P (type))) + && !(TARGET_AIX && !TARGET_ELF && AGGREGATE_TYPE_P (type))) { unsigned long n_fpreg = (GET_MODE_SIZE (elt_mode) + 7) >> 3;