diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2020-09-07 18:25:23 +0200 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2020-10-23 04:25:02 -0400 |
commit | b120ca616fc820e352a19523dae34f5c53bfe859 (patch) | |
tree | a1c3cdf69ff403e07cabb282d2f6643041a3bdc9 /gcc/ada/gcc-interface/decl.c | |
parent | 84a5809c7214d103dd2e7f5c352fd99cb8320bb3 (diff) | |
download | gcc-b120ca616fc820e352a19523dae34f5c53bfe859.zip gcc-b120ca616fc820e352a19523dae34f5c53bfe859.tar.gz gcc-b120ca616fc820e352a19523dae34f5c53bfe859.tar.bz2 |
[Ada] Implement new legality rules introduced in C.6(12) by AI12-0363
gcc/ada/
* doc/gnat_rm/implementation_defined_pragmas.rst (VFA): Remove uage
restrictions in conjunction with Atomic and Aliased.
* gnat_rm.texi: Regenerate.
* aspects.ads (Aspect_Id): Add Aspect_Full_Access_Only.
(Is_Representation_Aspect): Likewise.
(Aspect_Names): Likewise.
(Aspect_Delay): Likewise.
* einfo.ads (Is_Atomic_Or_VFA): Rename into...
(Is_Full_Access): ...this.
(Is_Volatile_Full_Access): Document new usage for Full_Access_Only.
* einfo.adb (Is_Atomic_Or_VFA): Rename into...
(Is_Full_Access): ...this.
* freeze.ads (Is_Atomic_VFA_Aggregate): Rename into...
(Is_Full_Access_Aggregate): ...this.
* freeze.adb (Is_Atomic_VFA_Aggregate): Rename into...
(Is_Full_Access_Aggregate): ...this. Adjust to above renaming.
(Freeze_Array_Type): Likewise.
(Freeze_Entity): Likewise.
* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): Likewise.
(Expand_Record_Aggregate): Likewise.
* exp_ch4.adb (Expand_N_Op_Eq): Likewise.
* exp_ch5.adb (Expand_Assign_Array): Likewise.
* exp_ch8.adb (Evaluation_Required): Likewise.
* layout.adb (Layout_Type): Likewise.
(Set_Composite_Alignment): Likewise.
* sem_aux.ads (Has_Rep_Item): Delete.
* sem_aux.adb (Has_Rep_Item): Likewise.
* sem_attr.adb (Resolve_Attribute) <Attribute_Access>: Implement
new legality rules in C.6(12).
* sem_ch12.adb (Instantiate_Object): Likewise.
* sem_res.adb (Resolve_Actuals): Likewise.
* sem_ch13.adb (Inherit_Delayed_Rep_Aspects): Deal with aspect
Full_Access_Only.
(Check_False_Aspect_For_Derived_Type): Likewise.
(Make_Pragma_From_Boolean_Aspect): Test for the presence of Expr.
Deal with aspect Full_Access_Only.
(Analyze_Aspects_At_Freeze_Point): Likewise.
(Analyze_One_Aspect): Do not set Delay_Required to true even for
Always_Delay boolean aspects if they have no expression. Force
Delay_Required to true for aspect Full_Access_Only in all cases.
Reject aspect Full_Access_Only if not in Ada 2020 mode.
(Check_Aspect_At_End_Of_Declarations): Deal with empty expression.
(Check_Aspect_At_Freeze_Point): Likewise.
(Rep_Item_Entity): Delete.
(Inherit_Aspects_At_Freeze_Point): Align handling for Bit_Order
with that for Scalar_Storage_Order.
* sem_prag.adb (Check_Atomic_VFA): Delete.
(Check_VFA_Conflicts): Likewise.
(Check_Full_Access_Only): New procedure.
(Process_Atomic_Independent_Shared_Volatile): Call to implement
the new legality checks in C.6(8/2) and mark the entity last.
(Analyze_Pragma) <Pragma_Atomic_Components>: Remove obsolete check.
* sem_util.ads (Is_Atomic_Or_VFA_Object): Rename into...
(Is_Full_Access_Object): ...this.
(Is_Subcomponent_Of_Atomic_Object): Rename into...
(Is_Subcomponent_Of_Full_Access_Object): ...this.
* sem_util.adb (Inherit_Rep_Item_Chain): Use Present_In_Rep_Item.
(Is_Atomic_Or_VFA_Object): Rename into...
(Is_Full_Access_Object): ...this.
(Is_Subcomponent_Of_Atomic_Object): Rename into...
(Is_Subcomponent_Of_Full_Access_Object): ...this and adjust.
* snames.ads-tmpl (Name_Full_Access_Only): New name of aspect.
* gcc-interface/decl.c (gnat_to_gnu_entity): Adjust for renaming.
(promote_object_alignment): Likewise.
(gnat_to_gnu_field): Likewise. Rename local variable and use
specific qualifier in error message for Volatile_Full_Access.
* gcc-interface/trans.c (lvalue_required_p): Likewise.
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index cd0a50b..4e6dc84 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -896,13 +896,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) gnu_size = bitsize_unit_node; /* If this is an object with no specified size and alignment, and - if either it is atomic or we are not optimizing alignment for + if either it is full access or we are not optimizing alignment for space and it is composite and not an exception, an Out parameter or a reference to another object, and the size of its type is a constant, set the alignment to the smallest one which is not smaller than the size, with an appropriate cap. */ if (!gnu_size && align == 0 - && (Is_Atomic_Or_VFA (gnat_entity) + && (Is_Full_Access (gnat_entity) || (!Optimize_Alignment_Space (gnat_entity) && kind != E_Exception && kind != E_Out_Parameter @@ -1014,7 +1014,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) } /* Now check if the type of the object allows atomic access. */ - if (Is_Atomic_Or_VFA (gnat_entity)) + if (Is_Full_Access (gnat_entity)) check_ok_for_atomic_type (gnu_type, gnat_entity, false); /* If this is a renaming, avoid as much as possible to create a new @@ -2876,7 +2876,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) { const int quals = TYPE_QUAL_VOLATILE - | (Is_Atomic_Or_VFA (gnat_entity) ? TYPE_QUAL_ATOMIC : 0); + | (Is_Full_Access (gnat_entity) ? TYPE_QUAL_ATOMIC : 0); gnu_type = change_qualified_type (gnu_type, quals); } /* Make it artificial only if the base type was artificial too. @@ -4362,12 +4362,12 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) gnat_entity); } } - else if (Is_Atomic_Or_VFA (gnat_entity) && !gnu_size + else if (Is_Full_Access (gnat_entity) && !gnu_size && tree_fits_uhwi_p (TYPE_SIZE (gnu_type)) && integer_pow2p (TYPE_SIZE (gnu_type))) align = MIN (BIGGEST_ALIGNMENT, tree_to_uhwi (TYPE_SIZE (gnu_type))); - else if (Is_Atomic_Or_VFA (gnat_entity) && gnu_size + else if (Is_Full_Access (gnat_entity) && gnu_size && tree_fits_uhwi_p (gnu_size) && integer_pow2p (gnu_size)) align = MIN (BIGGEST_ALIGNMENT, tree_to_uhwi (gnu_size)); @@ -4603,7 +4603,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) } /* Now check if the type allows atomic access. */ - if (Is_Atomic_Or_VFA (gnat_entity)) + if (Is_Full_Access (gnat_entity)) check_ok_for_atomic_type (gnu_type, gnat_entity, false); /* If this is not an unconstrained array type, set some flags. */ @@ -4721,7 +4721,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) { const int quals = TYPE_QUAL_VOLATILE - | (Is_Atomic_Or_VFA (gnat_entity) ? TYPE_QUAL_ATOMIC : 0); + | (Is_Full_Access (gnat_entity) ? TYPE_QUAL_ATOMIC : 0); gnu_type = change_qualified_type (gnu_type, quals); } @@ -5250,7 +5250,7 @@ gnat_to_gnu_component_type (Entity_Id gnat_array, bool definition, } /* Now check if the type of the component allows atomic access. */ - if (Has_Atomic_Components (gnat_array) || Is_Atomic_Or_VFA (gnat_type)) + if (Has_Atomic_Components (gnat_array) || Is_Full_Access (gnat_type)) check_ok_for_atomic_type (gnu_type, gnat_array, true); /* If the component type is a padded type made for a non-bit-packed array @@ -7105,9 +7105,9 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, const Entity_Id gnat_field_type = Etype (gnat_field); tree gnu_field_type = gnat_to_gnu_type (gnat_field_type); tree gnu_field_id = get_entity_name (gnat_field); - const bool is_atomic - = (Is_Atomic_Or_VFA (gnat_field) || Is_Atomic_Or_VFA (gnat_field_type)); const bool is_aliased = Is_Aliased (gnat_field); + const bool is_full_access + = (Is_Full_Access (gnat_field) || Is_Full_Access (gnat_field_type)); const bool is_independent = (Is_Independent (gnat_field) || Is_Independent (gnat_field_type)); const bool is_volatile @@ -7122,7 +7122,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, only constraint is the implementation advice whereby only the bits of the components should be accessed if they both start and end on byte boundaries, but that should be guaranteed by the GCC memory model. - Note that we have some redundancies (is_atomic => is_independent, + Note that we have some redundancies (is_full_access => is_independent, is_aliased => is_independent and is_by_ref => is_strict_alignment) so the following formula is sufficient. */ const bool needs_strict_alignment = (is_independent || is_strict_alignment); @@ -7131,10 +7131,16 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, bool is_bitfield; /* The qualifier to be used in messages. */ - if (is_atomic) - field_s = "atomic&"; - else if (is_aliased) + if (is_aliased) field_s = "aliased&"; + else if (is_full_access) + { + if (Is_Volatile_Full_Access (gnat_field) + || Is_Volatile_Full_Access (gnat_field_type)) + field_s = "volatile full access&"; + else + field_s = "atomic&"; + } else if (is_independent) field_s = "independent&"; else if (is_by_ref) @@ -7145,7 +7151,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, field_s = "&"; /* The message to be used for incompatible size. */ - if (is_atomic || is_aliased) + if (is_aliased || is_full_access) size_s = "size for %s must be ^"; else if (field_s) size_s = "size for %s too small{, minimum allowed is ^}"; @@ -7237,7 +7243,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, } /* Now check if the type of the field allows atomic access. */ - if (Is_Atomic_Or_VFA (gnat_field)) + if (Is_Full_Access (gnat_field)) { const unsigned int align = promote_object_alignment (gnu_field_type, gnat_field); @@ -7333,7 +7339,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed, /* If the size is lower than that of the type, or greater for atomic and aliased, then error out and reset the size. */ else if ((cmp = tree_int_cst_compare (gnu_size, type_size)) < 0 - || (cmp > 0 && (is_atomic || is_aliased))) + || (cmp > 0 && (is_aliased || is_full_access))) { char s[128]; snprintf (s, sizeof (s), size_s, field_s); @@ -9278,8 +9284,8 @@ promote_object_alignment (tree gnu_type, Entity_Id gnat_entity) the NRV optimization for it. No point in jumping through all the hoops needed in order to support BIGGEST_ALIGNMENT if we don't really have to. So we cap to the smallest alignment that corresponds to a known efficient - memory access pattern, except for Atomic and Volatile_Full_Access. */ - if (Is_Atomic_Or_VFA (gnat_entity)) + memory access pattern, except for a full access entity. */ + if (Is_Full_Access (gnat_entity)) { size_cap = UINT_MAX; align_cap = BIGGEST_ALIGNMENT; |