On Fri, May 10, 2019 at 04:26:47PM -0400, Jason Merrill wrote:
> That is strange.  That seems to go back to
> 
> Surely we should only set the incr location if it doesn't already have one,
> as would have been the case before that patch.

So, like this then?  Bootstrapped/regtested again on x86_64-linux and
i686-linux:

2019-05-11  Jakub Jelinek  <ja...@redhat.com>

        PR debug/90197
        * cp-gimplify.c (genericize_cp_loop): Emit a DEBUG_BEGIN_STMT
        before the condition (or if missing or constant non-zero at the end
        of the loop.  Emit a DEBUG_BEGIN_STMT before the increment expression
        if any.  Don't call protected_set_expr_location on incr if it already
        has a location.

--- gcc/cp/cp-gimplify.c.jj     2019-05-10 23:20:35.812735806 +0200
+++ gcc/cp/cp-gimplify.c        2019-05-10 23:23:20.712991042 +0200
@@ -241,8 +241,10 @@ genericize_cp_loop (tree *stmt_p, locati
   tree blab, clab;
   tree exit = NULL;
   tree stmt_list = NULL;
+  tree debug_begin = NULL;
 
-  protected_set_expr_location (incr, start_locus);
+  if (EXPR_LOCATION (incr) == UNKNOWN_LOCATION)
+    protected_set_expr_location (incr, start_locus);
 
   cp_walk_tree (&cond, cp_genericize_r, data, NULL);
   cp_walk_tree (&incr, cp_genericize_r, data, NULL);
@@ -253,6 +255,13 @@ genericize_cp_loop (tree *stmt_p, locati
   cp_walk_tree (&body, cp_genericize_r, data, NULL);
   *walk_subtrees = 0;
 
+  if (MAY_HAVE_DEBUG_MARKER_STMTS
+      && (!cond || !integer_zerop (cond)))
+    {
+      debug_begin = build0 (DEBUG_BEGIN_STMT, void_type_node);
+      SET_EXPR_LOCATION (debug_begin, cp_expr_loc_or_loc (cond, start_locus));
+    }
+
   if (cond && TREE_CODE (cond) != INTEGER_CST)
     {
       /* If COND is constant, don't bother building an exit.  If it's false,
@@ -265,10 +274,24 @@ genericize_cp_loop (tree *stmt_p, locati
     }
 
   if (exit && cond_is_first)
-    append_to_statement_list (exit, &stmt_list);
+    {
+      append_to_statement_list (debug_begin, &stmt_list);
+      debug_begin = NULL_TREE;
+      append_to_statement_list (exit, &stmt_list);
+    }
   append_to_statement_list (body, &stmt_list);
   finish_bc_block (&stmt_list, bc_continue, clab);
-  append_to_statement_list (incr, &stmt_list);
+  if (incr)
+    {
+      if (MAY_HAVE_DEBUG_MARKER_STMTS)
+       {
+         tree d = build0 (DEBUG_BEGIN_STMT, void_type_node);
+         SET_EXPR_LOCATION (d, cp_expr_loc_or_loc (incr, start_locus));
+         append_to_statement_list (d, &stmt_list);
+       }
+      append_to_statement_list (incr, &stmt_list);
+    }
+  append_to_statement_list (debug_begin, &stmt_list);
   if (exit && !cond_is_first)
     append_to_statement_list (exit, &stmt_list);
 


        Jakub

Reply via email to