re PR debug/90197 (Cannot step through simple loop at -O -g)
authorJakub Jelinek <jakub@redhat.com>
Wed, 15 May 2019 21:41:35 +0000 (23:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 15 May 2019 21:41:35 +0000 (23:41 +0200)
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.

From-SVN: r271269

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c

index 3119c0370df2aa2ce6651b0bcc7b8be21d3b2a85..058773f299902fdb9e405be3295ffadffb28eaee 100644 (file)
@@ -1,3 +1,12 @@
+2019-05-15  Jakub Jelinek  <jakub@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.
+
 2019-05-15  Marek Polacek  <polacek@redhat.com>
 
        CWG 2096 - constraints on literal unions.
index 4e63a4a6944b294fa3f0d8bd2966e0fe6e002b78..72d8581ffe51eecc6ee8335044bc755d67c6bd79 100644 (file)
@@ -241,8 +241,10 @@ genericize_cp_loop (tree *stmt_p, location_t start_locus, tree cond, tree body,
   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, location_t start_locus, tree cond, tree body,
   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, location_t start_locus, tree cond, tree body,
     }
 
   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);