public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Eric Botcazou <ebotcazou@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-10119] Fix calling convention incompatibility with vendor compiler Date: Thu, 25 Apr 2024 10:48:17 +0000 (GMT) [thread overview] Message-ID: <20240425104817.EDCEF3846410@sourceware.org> (raw) https://gcc.gnu.org/g:1d238c84025aaef1641e4000bd2a8f4328b474dd commit r14-10119-g1d238c84025aaef1641e4000bd2a8f4328b474dd Author: Eric Botcazou <ebotcazou@adacore.com> Date: Thu Apr 25 12:44:14 2024 +0200 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 Diff: --- gcc/config/sparc/sol2.h | 3 ++ gcc/config/sparc/sparc.cc | 26 +++++++++++- gcc/config/sparc/sparc.h | 3 ++ .../gcc.target/sparc/{pr105573.c => 20230425-1.c} | 3 ++ .../gcc.target/sparc/{pr109541.c => 20230607-1.c} | 3 ++ 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 e849af9038b..552f58b2cc8 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 30fa4474bbd..8a5f76c8885 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 fb074808d30..232ecb30ddc 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 similarity index 82% rename from gcc/testsuite/gcc.target/sparc/pr105573.c rename to gcc/testsuite/gcc.target/sparc/20230425-1.c index 14043a5fdad..c07dd3261fc 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 similarity index 92% rename from gcc/testsuite/gcc.target/sparc/pr109541.c rename to gcc/testsuite/gcc.target/sparc/20230607-1.c index 1360f101930..3613dca602f 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 00000000000..4897288766b --- /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" } } */
reply other threads:[~2024-04-25 10:48 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20240425104817.EDCEF3846410@sourceware.org \ --to=ebotcazou@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).