From af90c10fe1738861ec3b9be24a13e8215905c6e2 Mon Sep 17 00:00:00 2001 From: "Christopher D. Rickett" Date: Sat, 24 Nov 2007 05:42:07 +0000 Subject: [PATCH] trans-common.c (build_common_decl): Fix the alignment for BIND(C) common blocks. 2007-11-23 Christopher D. Rickett * trans-common.c (build_common_decl): Fix the alignment for BIND(C) common blocks. From-SVN: r130393 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/trans-common.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ce45d6041be..e7c00b2a4ab 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-11-23 Christopher D. Rickett + + * trans-common.c (build_common_decl): Fix the alignment for + BIND(C) common blocks. + 2007-11-23 Jerry DeLisle PR fortran/34209 diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c index 604078226b7..64cee0db5c1 100644 --- a/gcc/fortran/trans-common.c +++ b/gcc/fortran/trans-common.c @@ -407,7 +407,20 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init) 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; -- 2.30.2