alias.c (get_alias_set): Be ready for TYPE_CANONICAL of ptr_type_node to not be ptr_to_node.

* alias.c (get_alias_set): Be ready for TYPE_CANONICAL
	of ptr_type_node to not be ptr_to_node.
	* tree.c (gimple_types_compatible_p): Do not match TREE_CODE of
	TREE_TYPE of pointers.
	* gimple-expr.c (useless_type_conversion): Reorder the check for
	function pointers and TYPE_CANONICAL.
	* lto.c (hash_canonical_type): Do not hash TREE_CODE of TREE_TYPE of
	pointers.
	* gfortran.dg/lto/bind_c-1_0.f90: New testcase.
	* gfortran.dg/lto/bind_c-1_1.c: New testcase.
	* gcc.dg/lto/c-compatible-types_0.c: Rename to ...
	* gcc.dg/lto/c-compatible-types-1_0.c: this one; fix template
	* gcc.dg/lto/c-compatible-types_1.c: Rename to ...
	* gcc.dg/lto/c-compatible-types-1_1.c: this one; harden for
	-fshort-enum.

From-SVN: r224201
This commit is contained in:
Jan Hubicka 2015-06-07 23:30:58 +02:00 committed by Jan Hubicka
parent d7b35f22be
commit ccb5ad373f
11 changed files with 100 additions and 23 deletions

View File

@ -1,3 +1,12 @@
2015-06-06 Jan Hubicka <hubicka@ucw.cz>
* alias.c (get_alias_set): Be ready for TYPE_CANONICAL
of ptr_type_node to not be ptr_to_node.
* tree.c (gimple_types_compatible_p): Do not match TREE_CODE of
TREE_TYPE of pointers.
* gimple-expr.c (useless_type_conversion): Reorder the check for
function pointers and TYPE_CANONICAL.
2015-06-06 John David Anglin <danglin@gcc.gnu.org>
PR bootstrap/66319

View File

@ -1072,8 +1072,9 @@ get_alias_set (tree t)
}
/* In LTO the rules above needs to be part of canonical type machinery.
For now just punt. */
else if (POINTER_TYPE_P (t) && t != ptr_type_node && in_lto_p)
set = get_alias_set (ptr_type_node);
else if (POINTER_TYPE_P (t)
&& t != TYPE_CANONICAL (ptr_type_node) && in_lto_p)
set = get_alias_set (TYPE_CANONICAL (ptr_type_node));
/* Otherwise make a new alias set for this type. */
else

View File

@ -84,6 +84,12 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type))
!= TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))
return false;
/* Do not lose casts to function pointer types. */
if ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
&& !(TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (inner_type)) == METHOD_TYPE))
return false;
}
/* From now on qualifiers on value types do not matter. */
@ -142,13 +148,6 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
else if (POINTER_TYPE_P (inner_type)
&& POINTER_TYPE_P (outer_type))
{
/* Do not lose casts to function pointer types. */
if ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
&& !(TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (inner_type)) == METHOD_TYPE))
return false;
/* We do not care for const qualification of the pointed-to types
as const qualification has no semantic value to the middle-end. */

View File

@ -1,3 +1,8 @@
2015-06-06 Jan Hubicka <hubicka@ucw.cz>
* lto.c (hash_canonical_type): Do not hash TREE_CODE of TREE_TYPE of
pointers.
2015-06-05 Aldy Hernandez <aldyh@redhat.com>
* lto-lang.c (lto_write_globals): Remove.

View File

@ -337,12 +337,12 @@ hash_canonical_type (tree type)
if (TREE_CODE (type) == COMPLEX_TYPE)
hstate.add_int (TYPE_UNSIGNED (type));
/* For pointer and reference types, fold in information about the type
pointed to but do not recurse to the pointed-to type. */
/* 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)));
hstate.add_int (TREE_CODE (TREE_TYPE (type)));
}
/* For integer types hash only the string flag. */

View File

@ -1,3 +1,13 @@
2015-06-06 Jan Hubicka <hubicka@ucw.cz>
* gfortran.dg/lto/bind_c-1_0.f90: New testcase.
* gfortran.dg/lto/bind_c-1_1.c: New testcase.
* gcc.dg/lto/c-compatible-types_0.c: Rename to ...
* gcc.dg/lto/c-compatible-types-1_0.c: this one; fix template
* gcc.dg/lto/c-compatible-types_1.c: Rename to ...
* gcc.dg/lto/c-compatible-types-1_1.c: this one; harden for
-fshort-enum.
2015-06-06 Thomas Koenig <tkoenig@netcologne.de>
PR fortran/47659

View File

@ -1,6 +1,5 @@
/* { dg-do run } */
/* { dg-options "-O3" } */
/* { dg-skip-if "require -fno-short-enums to work" {target short_enums} } */
/* { dg-lto-do run } */
/* { dg-lto-options "-O3" } */
/* By C standard Each enumerated type shall be compatible with char, a signed
integer, type, or an unsigned integer type. The choice of type is

View File

@ -1,4 +1,5 @@
enum a {test1, test2};
#include <limits.h>
enum a {test1, test2, test3=INT_MAX};
enum a a;
enum a *b;

View File

@ -0,0 +1,21 @@
! { dg-do run }
! { dg-lto-options {{ -O3 -flto }} }
! This testcase will abort if C_PTR is not interoperable with both int *
! and float *
module lto_type_merge_test
use, intrinsic :: iso_c_binding
implicit none
type, bind(c) :: MYFTYPE_1
type(c_ptr) :: ptr
type(c_ptr) :: ptrb
end type MYFTYPE_1
type(myftype_1), bind(c, name="myVar") :: myVar
contains
subroutine types_test() bind(c)
myVar%ptr = myVar%ptrb
end subroutine types_test
end module lto_type_merge_test

View File

@ -0,0 +1,36 @@
#include <stdlib.h>
/* interopse with myftype_1 */
typedef struct {
float *ptr;
int *ptr2;
} 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 *cptr;
asm("":"=r"(cptr):"0"(&myVar));
cptr->ptr = (float *)(size_t) (void *)1;
cptr->ptr2 = (int *)(size_t) (void *)2;
types_test();
if(cptr->ptr != (float *)(size_t) (void *)2)
abort();
if(cptr->ptr2 != (int *)(size_t) (void *)2)
abort();
myVar.ptr2 = (int *)(size_t) (void *)3;
types_test();
if(myVar.ptr != (float *)(size_t) (void *)3)
abort();
if(myVar.ptr2 != (int *)(size_t) (void *)3)
abort();
return 0;
}

View File

@ -12958,18 +12958,14 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2,
&& TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
return false;
/* For canonical type comparisons we do not want to build SCCs
so we cannot compare pointed-to types. But we can, for now,
require the same pointed-to type kind and match what
useless_type_conversion_p would do. */
/* 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 (t1))
{
if (TYPE_ADDR_SPACE (TREE_TYPE (t1))
!= TYPE_ADDR_SPACE (TREE_TYPE (t2)))
return false;
if (TREE_CODE (TREE_TYPE (t1)) != TREE_CODE (TREE_TYPE (t2)))
return false;
}
/* Tail-recurse to components. */