Patchwork Fix handling of calls to constants (PR debug/48163)

login
register
mail settings
Submitter Jakub Jelinek
Date March 17, 2011, 6:40 p.m.
Message ID <20110317184023.GV30899@tyan-ft48-01.lab.bos.redhat.com>
Download mbox | patch
Permalink /patch/87411/
State New
Headers show

Comments

Jakub Jelinek - March 17, 2011, 6:40 p.m.
Hi!

On calls.c testcase on cris we ICE from prepare_call_arguments on
calls like
  typedef void (*T) ();
  ((T) 0x100000) ();
Calling cselib_lookup with VOIDmode can't do any good, but there is
not reason why we should cselib_lookup constants, we can just use them
as is.

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

2011-03-17  Jakub Jelinek  <jakub@redhat.com>

	PR debug/48163
	* var-tracking.c (prepare_call_arguments): If CALL target
	is a non-SYMBOL_REF CONSTANT_P, just add that into the list as
	pc instead of looking it up using cselib_lookup and use
	Pmode for it if x has VOIDmode.
	* dwarf2out.c (gen_subprogram_die): If also both first and
	second CONCAT arguments are VOIDmode, use mode of CONCAT itself.


	Jakub
Richard Henderson - March 17, 2011, 8 p.m.
On 03/17/2011 11:40 AM, Jakub Jelinek wrote:
> 	PR debug/48163
> 	* var-tracking.c (prepare_call_arguments): If CALL target
> 	is a non-SYMBOL_REF CONSTANT_P, just add that into the list as
> 	pc instead of looking it up using cselib_lookup and use
> 	Pmode for it if x has VOIDmode.
> 	* dwarf2out.c (gen_subprogram_die): If also both first and
> 	second CONCAT arguments are VOIDmode, use mode of CONCAT itself.

Ok.


r~

Patch

--- gcc/var-tracking.c.jj	2011-03-17 09:37:59.000000000 +0100
+++ gcc/var-tracking.c	2011-03-17 12:45:18.000000000 +0100
@@ -5807,7 +5807,16 @@  prepare_call_arguments (basic_block bb, 
   if (GET_CODE (x) == CALL && MEM_P (XEXP (x, 0)))
     {
       x = XEXP (XEXP (x, 0), 0);
-      if (GET_CODE (x) != SYMBOL_REF)
+      if (GET_CODE (x) == SYMBOL_REF)
+	/* Don't record anything.  */;
+      else if (CONSTANT_P (x))
+	{
+	  x = gen_rtx_CONCAT (GET_MODE (x) == VOIDmode ? Pmode : GET_MODE (x),
+			      pc_rtx, x);
+	  call_arguments
+	    = gen_rtx_EXPR_LIST (VOIDmode, x, call_arguments);
+	}
+      else
 	{
 	  cselib_val *val = cselib_lookup (x, GET_MODE (x), 0, VOIDmode);
 	  if (val && cselib_preserved_value_p (val))
--- gcc/dwarf2out.c.jj	2011-03-17 12:07:01.000000000 +0100
+++ gcc/dwarf2out.c	2011-03-17 12:54:51.000000000 +0100
@@ -19479,7 +19479,11 @@  gen_subprogram_die (tree decl, dw_die_re
 			 == REGNO (XEXP (XEXP (XEXP (next_arg, 0), 0), 0)))
 		    next_arg = XEXP (next_arg, 1);
 		  if (mode == VOIDmode)
-		    mode = GET_MODE (XEXP (XEXP (arg, 0), 0));
+		    {
+		      mode = GET_MODE (XEXP (XEXP (arg, 0), 0));
+		      if (mode == VOIDmode)
+			mode = GET_MODE (XEXP (arg, 0));
+		    }
 		  if (GET_MODE_CLASS (mode) != MODE_INT
 		      || GET_MODE_SIZE (mode) > DWARF2_ADDR_SIZE)
 		    continue;