ipa-prop: Fix ipa_get_callee_param_type for calls with argument type mismatches

Message ID ZFtow4ihR8drfg7g@tucnak
State Unresolved
Headers
Series ipa-prop: Fix ipa_get_callee_param_type for calls with argument type mismatches |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Jakub Jelinek May 10, 2023, 9:49 a.m. UTC
  Hi!

The PR contains a testcase where the Fortran FE creates FUNCTION_TYPE
which doesn't really match the passed in arguments (FUNCTION_TYPE has
5 arguments, call has 6).  Now, I think that is a Fortran FE bug that
should be fixed there, but I think with function pointers one can
create something similar (of course invalid) in C/C++ too,so IMHO IPA
should be also more careful.
The ipa_get_callee_param_type function can return NULL if something goes
wrong and it does e.g. if asked for 7th argument type on a function
with just 5 arguments and similar.  But, if a function isn't varargs,
when asked for 6th argument type on a function with just 5 arguments
it actually returns void_type_node because the argument list is in that
case terminated with void_list_node.

The following patch makes sure we don't treat void_list_node as something
holding another argument.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2023-05-10  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/109788
	* ipa-prop.cc (ipa_get_callee_param_type): Don't return TREE_VALUE (t)
	if t is void_list_node.


	Jakub
  

Comments

Richard Biener May 10, 2023, 9:56 a.m. UTC | #1
On Wed, 10 May 2023, Jakub Jelinek wrote:

> Hi!
> 
> The PR contains a testcase where the Fortran FE creates FUNCTION_TYPE
> which doesn't really match the passed in arguments (FUNCTION_TYPE has
> 5 arguments, call has 6).  Now, I think that is a Fortran FE bug that
> should be fixed there, but I think with function pointers one can
> create something similar (of course invalid) in C/C++ too,so IMHO IPA
> should be also more careful.
> The ipa_get_callee_param_type function can return NULL if something goes
> wrong and it does e.g. if asked for 7th argument type on a function
> with just 5 arguments and similar.  But, if a function isn't varargs,
> when asked for 6th argument type on a function with just 5 arguments
> it actually returns void_type_node because the argument list is in that
> case terminated with void_list_node.
> 
> The following patch makes sure we don't treat void_list_node as something
> holding another argument.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

> 2023-05-10  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR fortran/109788
> 	* ipa-prop.cc (ipa_get_callee_param_type): Don't return TREE_VALUE (t)
> 	if t is void_list_node.
> 
> --- gcc/ipa-prop.cc.jj	2023-05-01 09:59:46.485296735 +0200
> +++ gcc/ipa-prop.cc	2023-05-09 15:07:44.975578250 +0200
> @@ -2147,7 +2147,7 @@ ipa_get_callee_param_type (struct cgraph
>          break;
>        t = TREE_CHAIN (t);
>      }
> -  if (t)
> +  if (t && t != void_list_node)
>      return TREE_VALUE (t);
>    if (!e->callee)
>      return NULL;
> 
> 	Jakub
> 
>
  

Patch

--- gcc/ipa-prop.cc.jj	2023-05-01 09:59:46.485296735 +0200
+++ gcc/ipa-prop.cc	2023-05-09 15:07:44.975578250 +0200
@@ -2147,7 +2147,7 @@  ipa_get_callee_param_type (struct cgraph
         break;
       t = TREE_CHAIN (t);
     }
-  if (t)
+  if (t && t != void_list_node)
     return TREE_VALUE (t);
   if (!e->callee)
     return NULL;