diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2024-04-25 12:44:14 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2024-04-25 12:47:57 +0200 |
commit | 1d238c84025aaef1641e4000bd2a8f4328b474dd (patch) | |
tree | 8773b08a8d5d395a90f8f0e9db6444c8afc67f14 | |
parent | af7d981ba40f145256f6f6d3409451e8fa647f75 (diff) | |
download | gcc-1d238c84025aaef1641e4000bd2a8f4328b474dd.zip gcc-1d238c84025aaef1641e4000bd2a8f4328b474dd.tar.gz gcc-1d238c84025aaef1641e4000bd2a8f4328b474dd.tar.bz2 |
Fix calling convention incompatibility with vendor compiler
For the 20th anniversary of https://gcc.gnu.org/gcc-3.4/sparc-abi.html,
a new calling convention incompatibility with the vendor compiler (and
the ABI) has been discovered in 64-bit mode, affecting small structures
containing arrays of floating-point components. The decision has been
made to fix it on Solaris only at this point.
gcc/
PR target/114416
* config/sparc/sparc.h (SUN_V9_ABI_COMPATIBILITY): New macro.
* config/sparc/sol2.h (SUN_V9_ABI_COMPATIBILITY): Redefine it.
* config/sparc/sparc.cc (fp_type_for_abi): New predicate.
(traverse_record_type): Use it to spot floating-point types.
(compute_fp_layout): Also deal with array types.
gcc/testsuite/
* gcc.target/sparc/small-struct-1.c: New test.
* gcc.target/sparc/pr105573.c: Rename to...
* gcc.target/sparc/20230425-1.c: ...this.
* gcc.target/sparc/pr109541.c: Rename to...
* gcc.target/sparc/20230607-1.c: ...this
-rw-r--r-- | gcc/config/sparc/sol2.h | 3 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.cc | 26 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/20230425-1.c (renamed from gcc/testsuite/gcc.target/sparc/pr105573.c) | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/20230607-1.c (renamed from gcc/testsuite/gcc.target/sparc/pr109541.c) | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/small-struct-1.c | 46 |
6 files changed, 82 insertions, 2 deletions
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h index e849af9..552f58b 100644 --- a/gcc/config/sparc/sol2.h +++ b/gcc/config/sparc/sol2.h @@ -456,3 +456,6 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #undef SPARC_LOW_FE_EXCEPT_VALUES #define SPARC_LOW_FE_EXCEPT_VALUES 1 + +#undef SUN_V9_ABI_COMPATIBILITY +#define SUN_V9_ABI_COMPATIBILITY 1 diff --git a/gcc/config/sparc/sparc.cc b/gcc/config/sparc/sparc.cc index 30fa447..8a5f76c 100644 --- a/gcc/config/sparc/sparc.cc +++ b/gcc/config/sparc/sparc.cc @@ -6782,6 +6782,22 @@ sparc_pass_by_reference (cumulative_args_t, const function_arg_info &arg) || GET_MODE_SIZE (mode) > 16); } +/* Return true if TYPE is considered as a floating-point type by the ABI. */ + +static bool +fp_type_for_abi (const_tree type) +{ + /* This is the original GCC implementation. */ + if (FLOAT_TYPE_P (type) || VECTOR_TYPE_P (type)) + return true; + + /* This has been introduced in GCC 14 to match the vendor compiler. */ + if (SUN_V9_ABI_COMPATIBILITY && TREE_CODE (type) == ARRAY_TYPE) + return fp_type_for_abi (TREE_TYPE (type)); + + return false; +} + /* Traverse the record TYPE recursively and call FUNC on its fields. NAMED is true if this is for a named parameter. DATA is passed to FUNC for each field. OFFSET is the starting position and @@ -6820,8 +6836,7 @@ traverse_record_type (const_tree type, bool named, T *data, packed); else { - const bool fp_type - = FLOAT_TYPE_P (field_type) || VECTOR_TYPE_P (field_type); + const bool fp_type = fp_type_for_abi (field_type); Func (field, bitpos, fp_type && named && !packed && TARGET_FPU, data); } @@ -7072,6 +7087,13 @@ compute_fp_layout (const_tree field, int bitpos, assign_data_t *data, mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field))); nregs = 2; } + else if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE) + { + tree elt_type = strip_array_types (TREE_TYPE (field)); + mode = TYPE_MODE (elt_type); + nregs + = int_size_in_bytes (TREE_TYPE (field)) / int_size_in_bytes (elt_type); + } else nregs = 1; diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index fb07480..232ecb3 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1700,3 +1700,6 @@ extern int sparc_indent_opcode; #define SPARC_LOW_FE_EXCEPT_VALUES 0 #define TARGET_SUPPORTS_WIDE_INT 1 + +/* Define this to 1 to accept ABI changes to match the vendor compiler. */ +#define SUN_V9_ABI_COMPATIBILITY 0 diff --git a/gcc/testsuite/gcc.target/sparc/pr105573.c b/gcc/testsuite/gcc.target/sparc/20230425-1.c index 14043a5..c07dd32 100644 --- a/gcc/testsuite/gcc.target/sparc/pr105573.c +++ b/gcc/testsuite/gcc.target/sparc/20230425-1.c @@ -1,3 +1,6 @@ +/* PR target/105573 */ +/* Reported by Sam James <sjames@gcc.gnu.org> */ + /* { dg-do compile } */ /* { dg-options "-O3 -mvis3" } */ diff --git a/gcc/testsuite/gcc.target/sparc/pr109541.c b/gcc/testsuite/gcc.target/sparc/20230607-1.c index 1360f10..3613dca 100644 --- a/gcc/testsuite/gcc.target/sparc/pr109541.c +++ b/gcc/testsuite/gcc.target/sparc/20230607-1.c @@ -1,3 +1,6 @@ +/* PR target.109541 */ +/* Reported by Sam James <sjames@gcc.gnu.org> */ + /* { dg-do compile } */ /* { dg-options "-O1 -mcpu=niagara4 -fpic -w" } */ diff --git a/gcc/testsuite/gcc.target/sparc/small-struct-1.c b/gcc/testsuite/gcc.target/sparc/small-struct-1.c new file mode 100644 index 0000000..4897288 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/small-struct-1.c @@ -0,0 +1,46 @@ +/* PR target/114416 */ +/* Reported by Rainer Orth <ro@gcc.gnu.org> */ + +/* { dg-do compile } */ +/* { dg-options "-O" } */ +/* { dg-require-effective-target lp64 } */ + +struct vec2 +{ + double x[2]; +}; + +struct vec2x +{ + double x; + double y; +}; + +struct vec2 sum2 (double val) +{ + struct vec2 v; + v.x[0] = val; + v.x[1] = val; + return v; +} + +struct vec2x sum2x (double val) +{ + struct vec2x v; + v.x = val; + v.y = val; + return v; +} + +double get2 (struct vec2 v) +{ + return v.x[0] + v.x[1]; +} + +double get2x (struct vec2x v) +{ + return v.x + v.y; +} + +/* { dg-final { scan-assembler-not "ldx" } } */ +/* { dg-final { scan-assembler-not "stx" } } */ |