This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
common block alignment
- From: Jack Howarth <howarth at bromo dot msbb dot uc dot edu>
- To: fortran at gcc dot gnu dot org
- Date: Mon, 6 Aug 2007 12:03:25 -0400
- Subject: common block alignment
I haven't seen Christopher Rickett ask this yet on
the list. Using a powerpc-apple-darwin9 cross-compiler
(which adds an additional alignment field to the .comm
assembly lines), we discovered a mismatch between the
code generated in bind_c_coms .f90...
>> .size main, .-main
>> .comm com,16,8
>> .comm single,8,8
>> .comm mycom,4,4
>> .comm mycom2,8,8
>> .comm f03_com2,8,4
>> .section .rodata
>> .align
...and bind_c_coms_driver.c...
>> .size test_coms, .-test_coms
>> .comm mycom,4,16
>> .comm com3,8,16
>> .comm com,16,16
>> .comm f03_com2,8,16
>> .comm single,8,16
>> .comm mycom2,8,16
>> .section .rodata
>> .align 8
Chris fixed this issue for the iso c binding tests with
the following patch...
Index: gcc/fortran/trans-common.c
===================================================================
--- gcc/fortran/trans-common.c (revision 127182)
+++ gcc/fortran/trans-common.c (working copy)
@@ -413,7 +413,20 @@ build_common_decl (gfc_common_head *com,
SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_common_id (com));
TREE_PUBLIC (decl) = 1;
TREE_STATIC (decl) = 1;
- DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
+ if (!com->is_bind_c)
+ DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
+ else
+ {
+ /* Do not set the alignment for bind(c) common blocks to
+ BIGGEST_ALIGNMENT because that won't match what C does. Also,
+ for common blocks with one element, the alignment must be
+ that of the field within the common block in order to match
+ what C will do. */
+ tree field = NULL_TREE;
+ field = TYPE_FIELDS (TREE_TYPE (decl));
+ if (TREE_CHAIN (field) == NULL_TREE)
+ DECL_ALIGN (decl) = TYPE_ALIGN (TREE_TYPE (field));
+ }
DECL_USER_ALIGN (decl) = 0;
GFC_DECL_COMMON_OR_EQUIV (decl) = 1;
However we still have the question of why the common blocks in fortran
are aligned according to BIGGEST_ALIGNMENT and if we shouldn't just
have all of fortran use the same alignment as in c? I assume we would
have to do this with the soversion bump for libgfortran in gcc 4.3.
Thanks in advance for any clarifications on this.
Jack