* layout.adb (Set_Elem_Alignment): Cap the alignment of access types
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Aug 2012 14:17:22 +0000 (14:17 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Aug 2012 14:17:22 +0000 (14:17 +0000)
to that of a regular access type for non-strict-alignment platforms.
* gcc-interface/utils.c (finish_fat_pointer_type): Do not set the
alignment for non-strict-alignment platforms.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190515 138bc75d-0d04-0410-961f-82ee72b054a4

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

index b9b63b1..06259eb 100644 (file)
@@ -1,5 +1,12 @@
 2012-08-19  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * layout.adb (Set_Elem_Alignment): Cap the alignment of access types
+       to that of a regular access type for non-strict-alignment platforms.
+       * gcc-interface/utils.c (finish_fat_pointer_type): Do not set the
+       alignment for non-strict-alignment platforms.
+
+2012-08-19  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Use proper
        dummy type for the temporary COMPONENT_REF built for a derived tagged
        type with discriminant.
index c9b29ad..4cca41b 100644 (file)
@@ -1369,7 +1369,8 @@ void
 finish_fat_pointer_type (tree record_type, tree field_list)
 {
   /* Make sure we can put it into a register.  */
-  TYPE_ALIGN (record_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
+  if (STRICT_ALIGNMENT)
+    TYPE_ALIGN (record_type) = MIN (BIGGEST_ALIGNMENT, 2 * POINTER_SIZE);
 
   /* Show what it really is.  */
   TYPE_FAT_POINTER_P (record_type) = 1;
index d83a6e2..60a44a9 100644 (file)
@@ -3118,6 +3118,19 @@ package body Layout is
 
          if Esize (E) / SSU > Ttypes.Maximum_Alignment then
             S := Ttypes.Maximum_Alignment;
+
+         --  If this is an access type and the target doesn't have strict
+         --  alignment and we are not doing front end layout, then cap the
+         --  alignment to that of a regular access type. This will avoid
+         --  giving fat pointers twice the usual alignment for no practical
+         --  benefit since the misalignment doesn't really matter.
+
+         elsif Is_Access_Type (E)
+           and then not Target_Strict_Alignment
+           and then not Frontend_Layout_On_Target
+         then
+            S := System_Address_Size / SSU;
+
          else
             S := UI_To_Int (Esize (E)) / SSU;
          end if;