aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/gcc-interface/utils.c3
-rw-r--r--gcc/ada/layout.adb13
3 files changed, 22 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index b9b63b1..06259eb 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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.
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index c9b29ad..4cca41b 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -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;
diff --git a/gcc/ada/layout.adb b/gcc/ada/layout.adb
index d83a6e2..60a44a9 100644
--- a/gcc/ada/layout.adb
+++ b/gcc/ada/layout.adb
@@ -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;