From 626266ff9314edce72b7c9b45977b1b5fcaa234b Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Sat, 9 Sep 2017 12:02:57 +0000 Subject: [PATCH] * gcc-interface/decl.c (gnat_to_gnu_entity): Only set the TYPE_ALIGN_OK and TYPE_BY_REFERENCE_P flags on types after various promotions. * gcc-interface/trans.c (node_has_volatile_full_access) : Consider all kinds of entities. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251927 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 7 ++ gcc/ada/gcc-interface/decl.c | 30 +++--- gcc/ada/gcc-interface/trans.c | 2 - gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/gnat.dg/specs/{vfa.ads => vfa1.ads} | 4 +- gcc/testsuite/gnat.dg/specs/vfa2.ads | 110 ++++++++++++++++++++++ 6 files changed, 140 insertions(+), 19 deletions(-) rename gcc/testsuite/gnat.dg/specs/{vfa.ads => vfa1.ads} (88%) create mode 100644 gcc/testsuite/gnat.dg/specs/vfa2.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 65b68334929..6015967ab32 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,12 @@ 2017-09-09 Eric Botcazou + * gcc-interface/decl.c (gnat_to_gnu_entity): Only set the TYPE_ALIGN_OK + and TYPE_BY_REFERENCE_P flags on types after various promotions. + * gcc-interface/trans.c (node_has_volatile_full_access) : + Consider all kinds of entities. + +2017-09-09 Eric Botcazou + * gcc-interface/utils.c (convert): When converting to a padding type, reuse an existing CONSTRUCTOR if it has got the right size. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index baa925999fa..df88ce7849e 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -4277,18 +4277,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) already defined so we cannot pass true for IN_PLACE here. */ process_attributes (&gnu_type, &attr_list, false, gnat_entity); - /* Tell the middle-end that objects of tagged types are guaranteed to - be properly aligned. This is necessary because conversions to the - class-wide type are translated into conversions to the root type, - which can be less aligned than some of its derived types. */ - if (Is_Tagged_Type (gnat_entity) - || Is_Class_Wide_Equivalent_Type (gnat_entity)) - TYPE_ALIGN_OK (gnu_type) = 1; - - /* Record whether the type is passed by reference. */ - if (!VOID_TYPE_P (gnu_type) && Is_By_Reference_Type (gnat_entity)) - TYPE_BY_REFERENCE_P (gnu_type) = 1; - /* ??? Don't set the size for a String_Literal since it is either confirming or we don't handle it properly (if the low bound is non-constant). */ @@ -4498,17 +4486,29 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) /* If this is not an unconstrained array type, set some flags. */ if (TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE) { + /* Tell the middle-end that objects of tagged types are guaranteed to + be properly aligned. This is necessary because conversions to the + class-wide type are translated into conversions to the root type, + which can be less aligned than some of its derived types. */ + if (Is_Tagged_Type (gnat_entity) + || Is_Class_Wide_Equivalent_Type (gnat_entity)) + TYPE_ALIGN_OK (gnu_type) = 1; + + /* Record whether the type is passed by reference. */ + if (Is_By_Reference_Type (gnat_entity) && !VOID_TYPE_P (gnu_type)) + TYPE_BY_REFERENCE_P (gnu_type) = 1; + + /* Record whether an alignment clause was specified. */ if (Present (Alignment_Clause (gnat_entity))) TYPE_USER_ALIGN (gnu_type) = 1; + /* Record whether a pragma Universal_Aliasing was specified. */ if (Universal_Aliasing (gnat_entity) && !TYPE_IS_DUMMY_P (gnu_type)) TYPE_UNIVERSAL_ALIASING_P (gnu_type) = 1; /* If it is passed by reference, force BLKmode to ensure that objects of this type will always be put in memory. */ - if (TYPE_MODE (gnu_type) != BLKmode - && AGGREGATE_TYPE_P (gnu_type) - && TYPE_BY_REFERENCE_P (gnu_type)) + if (AGGREGATE_TYPE_P (gnu_type) && TYPE_BY_REFERENCE_P (gnu_type)) SET_TYPE_MODE (gnu_type, BLKmode); } diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 8eff9c3c098..2f7d497b11b 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -4075,8 +4075,6 @@ node_has_volatile_full_access (Node_Id gnat_node) case N_Identifier: case N_Expanded_Name: gnat_entity = Entity (gnat_node); - if (Ekind (gnat_entity) != E_Variable) - break; return Is_Volatile_Full_Access (gnat_entity) || Is_Volatile_Full_Access (Etype (gnat_entity)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cdbb5557011..928a1e42006 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-09-09 Eric Botcazou + + * gnat.dg/specs/vfa.ads: Rename into... + * gnat.dg/specs/vfa1.ads: ...this. + * gnat.dg/specs/vfa2.ads: New test. + 2017-09-09 Paul Thomas * gfortran.dg/pdt_1.f03 : New test. diff --git a/gcc/testsuite/gnat.dg/specs/vfa.ads b/gcc/testsuite/gnat.dg/specs/vfa1.ads similarity index 88% rename from gcc/testsuite/gnat.dg/specs/vfa.ads rename to gcc/testsuite/gnat.dg/specs/vfa1.ads index a63be969d55..cf918c20a03 100644 --- a/gcc/testsuite/gnat.dg/specs/vfa.ads +++ b/gcc/testsuite/gnat.dg/specs/vfa1.ads @@ -1,7 +1,7 @@ -- { dg-do compile } -- { dg-options "-g" } -package VFA is +package VFA1 is type Rec is record A : Short_Integer; @@ -11,4 +11,4 @@ package VFA is type Rec_VFA is new Rec; pragma Volatile_Full_Access (Rec_VFA); -end VFA; +end VFA1; diff --git a/gcc/testsuite/gnat.dg/specs/vfa2.ads b/gcc/testsuite/gnat.dg/specs/vfa2.ads new file mode 100644 index 00000000000..8ca9687a39e --- /dev/null +++ b/gcc/testsuite/gnat.dg/specs/vfa2.ads @@ -0,0 +1,110 @@ +-- { dg-do compile } +-- { dg-options "-O" } + +package VFA2 is + + type Bit is mod 2**1 + with Size => 1; + type UInt2 is mod 2**2 + with Size => 2; + type UInt22 is mod 2**22 + with Size => 22; + + type MODE_ENUM is + ( + Function_0_Default, + Function_1, + Function_2, + Function_3, + Function_4, + Function_5, + Function_6, + Function_7) + with Size => 3; + + type EPD_ENUM is + ( + Disable_Pull_Down, + Enable_Pull_Down) + with Size => 1; + + type EPUN_ENUM is + ( + Enable_Pull_Up, + Disable_Pull_Up) + with Size => 1; + + type EHS_ENUM is + ( + Slow_Low_Noise_With, + Fast_Medium_Noise_W) + with Size => 1; + + type EZI_ENUM is + ( + Disable_Input_Buffer, + Enable_Input_Buffer) + with Size => 1; + + type ZIF_ENUM is + ( + Enable_Input_Glitch, + Disable_Input_Glitch) + with Size => 1; + + type EHD_ENUM is + ( + Normal_Drive_4_Ma_D, + Medium_Drive_8_Ma_D, + High_Drive_14_Ma_Dr, + Ultra_High_Drive_20) + with Size => 2; + + type Pin_Type is (Normal_Drive, High_Drive, High_Speed); + + type SFS_Register(Pin : Pin_Type := Normal_Drive) is record + MODE : MODE_ENUM; + EPD : EPD_ENUM; + EPUN : EPUN_ENUM; + EZI : EZI_ENUM; + ZIF : ZIF_ENUM; + RESERVED : UInt22; + + case Pin is + when Normal_Drive => + + ND_EHS_RESERVED : Bit; + ND_EHD_RESERVED : UInt2; + + when High_Drive => + + EHD : EHD_ENUM; + HD_EHS_RESERVED : Bit; + + when High_Speed => + EHS : EHS_ENUM; + HS_EHD_RESERVED : UInt2; + + end case; + end record + with Unchecked_Union, Size => 32, Volatile_Full_Access; + + for SFS_Register use record + MODE at 0 range 0 .. 2; + EPD at 0 range 3 .. 3; + EPUN at 0 range 4 .. 4; + ND_EHS_RESERVED at 0 range 5 .. 5; + HD_EHS_RESERVED at 0 range 5 .. 5; + EHS at 0 range 5 .. 5; + EZI at 0 range 6 .. 6; + ZIF at 0 range 7 .. 7; + ND_EHD_RESERVED at 0 range 8 .. 9; + EHD at 0 range 8 .. 9; + HS_EHD_RESERVED at 0 range 8 .. 9; + RESERVED at 0 range 10 .. 31; + end record; + + type Normal_Drive_Pins is array (Integer range <>) + of SFS_Register(Normal_Drive) with Volatile; + +end VFA2; -- 2.11.4.GIT