Commit 64578d98 by Jan Hubicka Committed by Jan Hubicka

lto.c (hash_canonical_type): Drop hashing of TYPE_STRING_FLAG.


	* 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
parent 44433db0
2015-06-08 Jan Hubicka <hubicka@ucw.cz> 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 * lto-streamer-out.c (lto_output_location): Stream
reserved locations correctly. reserved locations correctly.
* lto-streamer-in.c (lto_output_location): Likewise. * lto-streamer-in.c (lto_output_location): Likewise.
......
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> 2015-06-08 Andrew MacLeod <amacleod@redhat.com>
* lto-lang.c : Adjust include files. * lto-lang.c : Adjust include files.
......
...@@ -332,17 +332,15 @@ hash_canonical_type (tree type) ...@@ -332,17 +332,15 @@ hash_canonical_type (tree type)
if (TREE_CODE (type) == COMPLEX_TYPE) if (TREE_CODE (type) == COMPLEX_TYPE)
hstate.add_int (TYPE_UNSIGNED (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 /* Fortran standard define C_PTR type that is compatible with every
C pointer. For this reason we need to glob all pointers into one. C pointer. For this reason we need to glob all pointers into one.
Still pointers in different address spaces are not compatible. */ Still pointers in different address spaces are not compatible. */
if (POINTER_TYPE_P (type)) if (POINTER_TYPE_P (type))
{ hstate.add_int (TYPE_ADDR_SPACE (TREE_TYPE (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));
/* For array types hash the domain bounds and the string flag. */ /* For array types hash the domain bounds and the string flag. */
if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type)) if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
......
! { 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
#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;
}
...@@ -12948,9 +12948,9 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2, ...@@ -12948,9 +12948,9 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
|| TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2)) || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
return false; return false;
if (TREE_CODE (t1) == INTEGER_TYPE /* Fortran's C_SIGNED_CHAR is !TYPE_STRING_FLAG but needs to be
&& TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)) interoperable with "signed char". Unless all frontends are revisited
return false; to agree on these types, we must ignore the flag completely. */
/* Fortran standard define C_PTR type that is compatible with every /* Fortran standard define C_PTR type that is compatible with every
C pointer. For this reason we need to glob all pointers into one. C pointer. For this reason we need to glob all pointers into one.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment