public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Iain D Sandoe <iains@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-7432] Darwin, PPC: Fix struct layout with pragma pack [PR110044]. Date: Fri, 9 Jun 2023 08:38:59 +0000 (GMT) [thread overview] Message-ID: <20230609083859.ECC903858D1E@sourceware.org> (raw) https://gcc.gnu.org/g:46e585c5c3f8ea81c163e1d7db044a972bc29321 commit r13-7432-g46e585c5c3f8ea81c163e1d7db044a972bc29321 Author: Iain Sandoe <iain@sandoe.co.uk> Date: Thu Jun 1 13:43:35 2023 +0100 Darwin, PPC: Fix struct layout with pragma pack [PR110044]. This bug was essentially that darwin_rs6000_special_round_type_align() was ignoring externally-imposed capping of field alignment. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> PR target/110044 gcc/ChangeLog: * config/rs6000/rs6000.cc (darwin_rs6000_special_round_type_align): Make sure that we do not have a cap on field alignment before altering the struct layout based on the type alignment of the first entry. gcc/testsuite/ChangeLog: * gcc.target/powerpc/darwin-abi-13-0.c: New test. * gcc.target/powerpc/darwin-abi-13-1.c: New test. * gcc.target/powerpc/darwin-abi-13-2.c: New test. * gcc.target/powerpc/darwin-structs-0.h: New test. (cherry picked from commit 84d080a29a780973bef47171ba708ae2f7b4ee47) Diff: --- gcc/config/rs6000/rs6000.cc | 3 ++- gcc/testsuite/gcc.target/powerpc/darwin-abi-13-0.c | 23 +++++++++++++++++ gcc/testsuite/gcc.target/powerpc/darwin-abi-13-1.c | 27 ++++++++++++++++++++ gcc/testsuite/gcc.target/powerpc/darwin-abi-13-2.c | 27 ++++++++++++++++++++ .../gcc.target/powerpc/darwin-structs-0.h | 29 ++++++++++++++++++++++ 5 files changed, 108 insertions(+), 1 deletion(-) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 45702d86588..216f807116a 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -8209,7 +8209,8 @@ darwin_rs6000_special_round_type_align (tree type, unsigned int computed, type = TREE_TYPE (type); } while (AGGREGATE_TYPE_P (type)); - if (! AGGREGATE_TYPE_P (type) && type != error_mark_node) + if (type != error_mark_node && ! AGGREGATE_TYPE_P (type) + && ! TYPE_PACKED (type) && maximum_field_alignment == 0) align = MAX (align, TYPE_ALIGN (type)); return align; diff --git a/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-0.c b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-0.c new file mode 100644 index 00000000000..d8d3c63a083 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-0.c @@ -0,0 +1,23 @@ +/* { dg-do compile { target powerpc*-*-darwin* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-Wno-long-long" } */ + +#include "darwin-structs-0.h" + +int tcd[sizeof(cd) != 12 ? -1 : 1]; +int acd[__alignof__(cd) != 4 ? -1 : 1]; + +int sdc[sizeof(dc) != 16 ? -1 : 1]; +int adc[__alignof__(dc) != 8 ? -1 : 1]; + +int scL[sizeof(cL) != 12 ? -1 : 1]; +int acL[__alignof__(cL) != 4 ? -1 : 1]; + +int sLc[sizeof(Lc) != 16 ? -1 : 1]; +int aLc[__alignof__(Lc) != 8 ? -1 : 1]; + +int scD[sizeof(cD) != 32 ? -1 : 1]; +int acD[__alignof__(cD) != 16 ? -1 : 1]; + +int sDc[sizeof(Dc) != 32 ? -1 : 1]; +int aDc[__alignof__(Dc) != 16 ? -1 : 1]; diff --git a/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-1.c b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-1.c new file mode 100644 index 00000000000..4d888d383fa --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-1.c @@ -0,0 +1,27 @@ +/* { dg-do compile { target powerpc*-*-darwin* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-Wno-long-long" } */ + +#pragma pack(push, 1) + +#include "darwin-structs-0.h" + +int tcd[sizeof(cd) != 9 ? -1 : 1]; +int acd[__alignof__(cd) != 1 ? -1 : 1]; + +int sdc[sizeof(dc) != 9 ? -1 : 1]; +int adc[__alignof__(dc) != 1 ? -1 : 1]; + +int scL[sizeof(cL) != 9 ? -1 : 1]; +int acL[__alignof__(cL) != 1 ? -1 : 1]; + +int sLc[sizeof(Lc) != 9 ? -1 : 1]; +int aLc[__alignof__(Lc) != 1 ? -1 : 1]; + +int scD[sizeof(cD) != 17 ? -1 : 1]; +int acD[__alignof__(cD) != 1 ? -1 : 1]; + +int sDc[sizeof(Dc) != 17 ? -1 : 1]; +int aDc[__alignof__(Dc) != 1 ? -1 : 1]; + +#pragma pack(pop) diff --git a/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-2.c b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-2.c new file mode 100644 index 00000000000..3bd52c0a8f8 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/darwin-abi-13-2.c @@ -0,0 +1,27 @@ +/* { dg-do compile { target powerpc*-*-darwin* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-Wno-long-long" } */ + +#pragma pack(push, 2) + +#include "darwin-structs-0.h" + +int tcd[sizeof(cd) != 10 ? -1 : 1]; +int acd[__alignof__(cd) != 2 ? -1 : 1]; + +int sdc[sizeof(dc) != 10 ? -1 : 1]; +int adc[__alignof__(dc) != 2 ? -1 : 1]; + +int scL[sizeof(cL) != 10 ? -1 : 1]; +int acL[__alignof__(cL) != 2 ? -1 : 1]; + +int sLc[sizeof(Lc) != 10 ? -1 : 1]; +int aLc[__alignof__(Lc) != 2 ? -1 : 1]; + +int scD[sizeof(cD) != 18 ? -1 : 1]; +int acD[__alignof__(cD) != 2 ? -1 : 1]; + +int sDc[sizeof(Dc) != 18 ? -1 : 1]; +int aDc[__alignof__(Dc) != 2 ? -1 : 1]; + +#pragma pack(pop) diff --git a/gcc/testsuite/gcc.target/powerpc/darwin-structs-0.h b/gcc/testsuite/gcc.target/powerpc/darwin-structs-0.h new file mode 100644 index 00000000000..1db44f7a808 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/darwin-structs-0.h @@ -0,0 +1,29 @@ +typedef struct _cd { + char c; + double d; +} cd; + +typedef struct _dc { + double d; + char c; +} dc; + +typedef struct _cL { + char c; + long long L; +} cL; + +typedef struct _Lc { + long long L; + char c; +} Lc; + +typedef struct _cD { + char c; + long double D; +} cD; + +typedef struct _Dc { + long double D; + char c; +} Dc;
reply other threads:[~2023-06-09 8:38 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=20230609083859.ECC903858D1E@sourceware.org \ --to=iains@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).