[Ada] Do not propagate Object_Size onto Size for composite types
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 18 Dec 2019 07:14:23 +0000 (07:14 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Dec 2019 07:14:23 +0000 (07:14 +0000)
2019-12-18  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* layout.adb (Layout_Type): In the case of composite types, do
not copy the Esize onto the RM_Size if the latter is not set.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>:
Also cap the alignment if an Object_Size clause has been
specified.  Pass VAR_DECL in the call to validate_size for the
Esize of a type.
(validate_size): Be prepared to give an error on an Object_Size
clause.

From-SVN: r279507

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/ada/layout.adb

index 2b845d4cb571bec642832f7c30a40a51551a5b08..ce39bc81175fc87063b8528130adb5c1c2d1072c 100644 (file)
@@ -1,3 +1,14 @@
+2019-12-18  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * layout.adb (Layout_Type): In the case of composite types, do
+       not copy the Esize onto the RM_Size if the latter is not set.
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>:
+       Also cap the alignment if an Object_Size clause has been
+       specified.  Pass VAR_DECL in the call to validate_size for the
+       Esize of a type.
+       (validate_size): Be prepared to give an error on an Object_Size
+       clause.
+
 2019-12-18  Eric Botcazou  <ebotcazou@adacore.com>
 
        * einfo.ads (Handling of Type'Size Value): Add references to the
index 57d163169d0a979d63c8d0e14fbc7ea9cb8a19c1..871a309ab7d4baeb5d2cc31c57023f6cdfa3f8d5 100644 (file)
@@ -3054,6 +3054,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
                if (max_align < BIGGEST_ALIGNMENT)
                  TYPE_MAX_ALIGN (gnu_type) = max_align;
              }
+
+           /* Similarly if an Object_Size clause has been specified.  */
+           else if (Known_Esize (gnat_entity))
+             {
+               unsigned int max_size = UI_To_Int (Esize (gnat_entity));
+               unsigned int max_align = max_size & -max_size;
+               if (max_align < BIGGEST_ALIGNMENT)
+                 TYPE_MAX_ALIGN (gnu_type) = max_align;
+             }
          }
 
        /* If we have a Parent_Subtype, make a field for the parent.  If
@@ -4241,11 +4250,15 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
         non-constant).  */
       if (!gnu_size && kind != E_String_Literal_Subtype)
        {
-         Uint gnat_size = Known_Esize (gnat_entity)
-                          ? Esize (gnat_entity) : RM_Size (gnat_entity);
-         gnu_size
-           = validate_size (gnat_size, gnu_type, gnat_entity, TYPE_DECL,
-                            false, Has_Size_Clause (gnat_entity), NULL, NULL);
+         if (Known_Esize (gnat_entity))
+           gnu_size
+             = validate_size (Esize (gnat_entity), gnu_type, gnat_entity,
+                              VAR_DECL, false, false, NULL, NULL);
+         else
+           gnu_size
+             = validate_size (RM_Size (gnat_entity), gnu_type, gnat_entity,
+                              TYPE_DECL, false, Has_Size_Clause (gnat_entity),
+                              NULL, NULL);
        }
 
       /* If a size was specified, see if we can make a new type of that size
@@ -8872,6 +8885,8 @@ validate_size (Uint uint_size, tree gnu_type, Entity_Id gnat_object,
     gnat_error_node = Last_Bit (Component_Clause (gnat_object));
   else if (Present (Size_Clause (gnat_object)))
     gnat_error_node = Expression (Size_Clause (gnat_object));
+  else if (Has_Object_Size_Clause (gnat_object))
+    gnat_error_node = Expression (Object_Size_Clause (gnat_object));
   else
     gnat_error_node = gnat_object;
 
index 4fc502bc7b0eaad16dd65b893cab8eae342f81c9..ce2fe301f3c989de6556881116d72dd8d92eece8 100644 (file)
@@ -435,14 +435,6 @@ package body Layout is
             end;
          end if;
 
-         --  If Esize is set, and RM_Size is not, RM_Size is copied from Esize.
-         --  At least for now this seems reasonable, and is in any case needed
-         --  for compatibility with old versions of gigi.
-
-         if Known_Esize (E) and then Unknown_RM_Size (E) then
-            Set_RM_Size (E, Esize (E));
-         end if;
-
          --  For array base types, set the component size if object size of the
          --  component type is known and is a small power of 2 (8, 16, 32, 64),
          --  since this is what will always be used, except if a very large