Commit 1e3af2a4 by Ilya Enkovich Committed by Ilya Enkovich

re PR middle-end/70877 ([MPX] ICE in in convert_move)

gcc/

	PR middle-end/70877
	* tree-chkp.c (chkp_add_bounds_to_call_stmt): Handle
	calls with type casted fndecl.

gcc/testsuite/

	PR middle-end/70877
	* gcc.target/i386/pr70877.c: New test.

From-SVN: r236088
parent cd36c83e
......@@ -5,6 +5,12 @@
2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
PR middle-end/70877
* tree-chkp.c (chkp_add_bounds_to_call_stmt): Handle
calls with type casted fndecl.
2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
PR tree-optimization/70786
* tree-chkp.c (chkp_find_bounds_1): Support WITH_SIZE_EXPR.
* gcc/calls.c (initialize_argument_information): Bind bounds
......
......@@ -4,6 +4,11 @@
2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
PR middle-end/70877
* gcc.target/i386/pr70877.c: New test.
2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
PR tree-optimization/70786
* gcc.target/i386/pr70876.c: New test.
......
/* { dg-do compile { target { ! x32 } } } */
/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
int foo(int);
typedef struct {
double d;
int a;
} str_t;
void bar(double d, int i, str_t s)
{
d = ((double (*) (int)) foo) (i); /* { dg-warning "function called through a non-compatible type" } */
}
......@@ -1853,7 +1853,9 @@ chkp_add_bounds_to_call_stmt (gimple_stmt_iterator *gsi)
/* If function decl is available then use it for
formal arguments list. Otherwise use function type. */
if (fndecl && DECL_ARGUMENTS (fndecl))
if (fndecl
&& DECL_ARGUMENTS (fndecl)
&& gimple_call_fntype (call) == TREE_TYPE (fndecl))
first_formal_arg = DECL_ARGUMENTS (fndecl);
else
{
......@@ -1929,7 +1931,16 @@ chkp_add_bounds_to_call_stmt (gimple_stmt_iterator *gsi)
{
tree new_decl = chkp_maybe_create_clone (fndecl)->decl;
gimple_call_set_fndecl (new_call, new_decl);
gimple_call_set_fntype (new_call, TREE_TYPE (new_decl));
/* In case of a type cast we should modify used function
type instead of using type of new fndecl. */
if (gimple_call_fntype (call) != TREE_TYPE (fndecl))
{
tree type = gimple_call_fntype (call);
type = chkp_copy_function_type_adding_bounds (type);
gimple_call_set_fntype (new_call, type);
}
else
gimple_call_set_fntype (new_call, TREE_TYPE (new_decl));
}
/* For indirect call we should fix function pointer type if
pass some bounds. */
......
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