From bb358f1cd9fbf80190bfcc77fea21237d6f5a44d Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 30 Apr 2012 08:11:42 +0000 Subject: [PATCH] i386.c (ix86_handle_struct_attribute): Use the proper predicate to discriminate types. * config/i386/i386.c (ix86_handle_struct_attribute): Use the proper predicate to discriminate types. ada/ * gcc-interface/utils.c (finish_record_type): Force the traditional GCC layout for bitfields on the type if it is packed or has a representation clause and an alternate layout is available. From-SVN: r186958 --- gcc/ChangeLog | 5 +++++ gcc/ada/ChangeLog | 6 ++++++ gcc/ada/gcc-interface/utils.c | 13 +++++++++++++ gcc/config/i386/i386.c | 3 +-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5d5149e2786..86a2f2d01db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-04-30 Eric Botcazou + + * config/i386/i386.c (ix86_handle_struct_attribute): Use the proper + predicate to discriminate types. + 2012-04-30 Manuel López-Ibáñez * doc/invoke.texi (Wmissing-format-attribute): Document as an diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e8421391e63..838e4d0f6a8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2012-04-30 Eric Botcazou + + * gcc-interface/utils.c (finish_record_type): Force the traditional GCC + layout for bitfields on the type if it is packed or has a representation + clause and an alternate layout is available. + 2012-04-30 Eric Botcazou * gcc-interface/gigi.h (mark_out_of_scope): Delete. diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 123c3a5705c..03d7cb011aa 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -721,6 +721,19 @@ finish_record_type (tree record_type, tree field_list, int rep_level, case where there is a rep clause but all fields have errors and no longer have a position. */ TYPE_SIZE (record_type) = 0; + + /* Ensure we use the traditional GCC layout for bitfields when we need + to pack the record type or have a representation clause. The other + possible layout (Microsoft C compiler), if available, would prevent + efficient packing in almost all cases. */ +#ifdef TARGET_MS_BITFIELD_LAYOUT + if (TARGET_MS_BITFIELD_LAYOUT && TYPE_PACKED (record_type)) + decl_attributes (&record_type, + tree_cons (get_identifier ("gcc_struct"), + NULL_TREE, NULL_TREE), + ATTR_FLAG_TYPE_IN_PLACE); +#endif + layout_type (record_type); } diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index a34c68c418e..903683e3500 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -32465,8 +32465,7 @@ ix86_handle_struct_attribute (tree *node, tree name, else type = node; - if (!(type && (TREE_CODE (*type) == RECORD_TYPE - || TREE_CODE (*type) == UNION_TYPE))) + if (!(type && RECORD_OR_UNION_TYPE_P (*type))) { warning (OPT_Wattributes, "%qE attribute ignored", name); -- 2.30.2