lto.c (hash_canonical_type): Drop hashing of TYPE_STRING_FLAG.
authorJan Hubicka <hubicka@ucw.cz>
Mon, 8 Jun 2015 22:24:57 +0000 (00:24 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 8 Jun 2015 22:24:57 +0000 (22:24 +0000)
* lto.c (hash_canonical_type): Drop hashing of TYPE_STRING_FLAG.
* tree.c (gimple_canonical_types_compatible_p): Drop comparsion of
TYPE_STRING_FLAG.

* gfortran.dg/lto/bind_c-2b_0.f90: New testcase
* gfortran.dg/lto/bind_c-2b_1.c: New testcase

From-SVN: r224252

gcc/ChangeLog
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/testsuite/gfortran.dg/lto/bind_c-2b_0.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/lto/bind_c-2b_1.c [new file with mode: 0644]
gcc/tree.c

index f8e8e6de4ce1bafa94ff65af2c0d495389fcdf61..18c4538d09e3b9e63b1536a51f01f7e5ecb3afe1 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree.c (gimple_canonical_types_compatible_p): Drop comparsion of
+       TYPE_STRING_FLAG.
+
 2015-06-08  Jan Hubicka  <hubicka@ucw.cz>
 
        * lto-streamer-out.c (lto_output_location): Stream
index 86771fe53a00dd414362e6a7c564a110ec25dd59..5d0e8881a176be37df5daa1a0705ccef95eb7bc1 100644 (file)
@@ -1,3 +1,7 @@
+2015-06-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       * lto.c (hash_canonical_type): Drop hashing of TYPE_STRING_FLAG.
+
 2015-06-08  Andrew MacLeod  <amacleod@redhat.com>
 
        * lto-lang.c : Adjust include files.
index b8e73cd489ffa83505facc1c215c412d8b847e61..b9b11106ac3063b9b360bb56d0cc3a545aac9de5 100644 (file)
@@ -332,17 +332,15 @@ hash_canonical_type (tree type)
   if (TREE_CODE (type) == COMPLEX_TYPE)
     hstate.add_int (TYPE_UNSIGNED (type));
 
+  /* Fortran's C_SIGNED_CHAR is !TYPE_STRING_FLAG but needs to be
+     interoperable with "signed char".  Unless all frontends are revisited to
+     agree on these types, we must ignore the flag completely.  */
+
   /* Fortran standard define C_PTR type that is compatible with every
      C pointer.  For this reason we need to glob all pointers into one.
      Still pointers in different address spaces are not compatible.  */
   if (POINTER_TYPE_P (type))
-    {
-      hstate.add_int (TYPE_ADDR_SPACE (TREE_TYPE (type)));
-    }
-
-  /* For integer types hash only the string flag.  */
-  if (TREE_CODE (type) == INTEGER_TYPE)
-    hstate.add_int (TYPE_STRING_FLAG (type));
+    hstate.add_int (TYPE_ADDR_SPACE (TREE_TYPE (type)));
 
   /* For array types hash the domain bounds and the string flag.  */
   if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
diff --git a/gcc/testsuite/gfortran.dg/lto/bind_c-2b_0.f90 b/gcc/testsuite/gfortran.dg/lto/bind_c-2b_0.f90
new file mode 100644 (file)
index 0000000..705282d
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-lto-do run }
+! { dg-lto-options {{ -O3 -flto }} }
+! This testcase will abort if C_SIGNED_CHAR is not interoperable with signed
+! char
+module lto_type_merge_test
+  use, intrinsic :: iso_c_binding
+  implicit none
+
+  type, bind(c) :: MYFTYPE_1
+     integer(c_signed_char) :: chr
+     integer(c_signed_char) :: chrb
+  end type MYFTYPE_1
+
+  type(myftype_1), bind(c, name="myVar") :: myVar
+
+contains
+  subroutine types_test() bind(c)
+    myVar%chr = myVar%chrb
+  end subroutine types_test
+end module lto_type_merge_test
+
diff --git a/gcc/testsuite/gfortran.dg/lto/bind_c-2b_1.c b/gcc/testsuite/gfortran.dg/lto/bind_c-2b_1.c
new file mode 100644 (file)
index 0000000..d005081
--- /dev/null
@@ -0,0 +1,36 @@
+#include <stdlib.h>
+/* interopse with myftype_1 */
+typedef struct {
+   signed char chr;
+   signed char chr2;
+} myctype_t;
+
+
+extern void abort(void);
+void types_test(void);
+/* declared in the fortran module */
+extern myctype_t myVar;
+
+int main(int argc, char **argv)
+{
+   myctype_t *cchr;
+   asm("":"=r"(cchr):"0"(&myVar));
+   cchr->chr = 1;
+   cchr->chr2 = 2;
+
+   types_test();
+
+   if(cchr->chr != 2)
+      abort();
+   if(cchr->chr2 != 2)
+      abort();
+   myVar.chr2 = 3;
+   types_test();
+
+   if(myVar.chr != 3)
+      abort();
+   if(myVar.chr2 != 3)
+      abort();
+   return 0;
+}
+
index db4ea8e1b10184067fcf6579883a5bd1b2873185..be01d0e19c96226578ff299bc3cbddee07c06d4a 100644 (file)
@@ -12948,9 +12948,9 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
          || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
        return false;
 
-      if (TREE_CODE (t1) == INTEGER_TYPE
-         && TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
-       return false;
+      /* Fortran's C_SIGNED_CHAR is !TYPE_STRING_FLAG but needs to be
+        interoperable with "signed char".  Unless all frontends are revisited
+        to agree on these types, we must ignore the flag completely.  */
 
       /* Fortran standard define C_PTR type that is compatible with every
         C pointer.  For this reason we need to glob all pointers into one.