Hi!

Apparently my recent patch turned on many non-delegitimized UNSPEC notes
(it is checking only note, goes away in release builds, but anyway).

The problem is that formerly UNSPECs were diagnosed that way only when
inside of CONST, but now also outside of them.  The patch keeps ignoring
them if they don't have all constant arguments though as before, only tries
to handle them if they have all constant arguments and thus normally would
appear inside of CONST but we are processing parts of the CONST
individually.

The following patch fixes it by determining first if they have all
CONSTANT_P arguments, and only if they do, follows that with
const_ok_for_output_1 verification which can emit this diagnostics.

The patch also removes what appears to be a badly applied patch in r255862,
the posted patch contained just addition of if (CONST_POLY_INT_P (rtl)) return 
false;
to the function, but added also the hunk I'm removing, so we have now
  if (targetm.const_not_ok_for_debug_p (rtl))
    {
      if (GET_CODE (rtl) != UNSPEC)
        {
          diagnostics;
          return false;
        }
      another diagnostics;
      return false;
    }
  if (CONST_POLY_INT_P (rtl))
    return false;
  if (targetm.const_not_ok_for_debug_p (rtl))
    {
      diagnostics;
      return false;
    }
Calling it twice will not help in any way.

Bootstrapped/regtested on x86_64-linux and i686-linux, plus tested on the
testcase with -> sparc-solaris cross-compiler, ok for trunk?

2019-01-07  Jakub Jelinek  <ja...@redhat.com>

        PR debug/88723
        * dwarf2out.c (const_ok_for_output_1): Remove redundant call to
        const_not_ok_for_debug_p target hook.
        (mem_loc_descriptor) <case UNSPEC>: Only call const_ok_for_output_1
        on UNSPEC and subexpressions thereof if all subexpressions of the
        UNSPEC are CONSTANT_P.

--- gcc/dwarf2out.c.jj  2019-01-05 12:10:36.630753817 +0100
+++ gcc/dwarf2out.c     2019-01-06 21:33:58.583426865 +0100
@@ -14445,13 +14445,6 @@ const_ok_for_output_1 (rtx rtl)
   if (CONST_POLY_INT_P (rtl))
     return false;
 
-  if (targetm.const_not_ok_for_debug_p (rtl))
-    {
-      expansion_failed (NULL_TREE, rtl,
-                       "Expression rejected for debug by the backend.\n");
-      return false;
-    }
-
   /* FIXME: Refer to PR60655. It is possible for simplification
      of rtl expressions in var tracking to produce such expressions.
      We should really identify / validate expressions
@@ -15660,8 +15653,17 @@ mem_loc_descriptor (rtx rtl, machine_mod
          bool not_ok = false;
          subrtx_var_iterator::array_type array;
          FOR_EACH_SUBRTX_VAR (iter, array, rtl, ALL)
-           if ((*iter != rtl && !CONSTANT_P (*iter))
-               || !const_ok_for_output_1 (*iter))
+           if (*iter != rtl && !CONSTANT_P (*iter))
+             {
+               not_ok = true;
+               break;
+             }
+
+         if (not_ok)
+           break;
+
+         FOR_EACH_SUBRTX_VAR (iter, array, rtl, ALL)
+           if (!const_ok_for_output_1 (*iter))
              {
                not_ok = true;
                break;


        Jakub

Reply via email to