diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2012-08-19 14:17:22 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2012-08-19 14:17:22 +0000 |
commit | 5da8c011067c5514c5e891fd8b4d854eb4fc2e71 (patch) | |
tree | 47a00b258127a7a74d5fefaab458140baa840190 /gcc/ada | |
parent | 08cb7d42bfd7810c05761df53348d582acc4eea1 (diff) | |
download | gcc-5da8c011067c5514c5e891fd8b4d854eb4fc2e71.zip gcc-5da8c011067c5514c5e891fd8b4d854eb4fc2e71.tar.gz gcc-5da8c011067c5514c5e891fd8b4d854eb4fc2e71.tar.bz2 |
layout.adb (Set_Elem_Alignment): Cap the alignment of access types to that of a regular access type for...
* 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.
From-SVN: r190515
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 3 | ||||
-rw-r--r-- | gcc/ada/layout.adb | 13 |
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; |