[PR debug/67192] Further fix C loops' back-jump location
authorAndreas Arnez <arnez@linux.vnet.ibm.com>
Mon, 9 Nov 2015 15:35:10 +0000 (15:35 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 9 Nov 2015 15:35:10 +0000 (15:35 +0000)
gcc/c/ChangeLog:

PR debug/67192
* c-typeck.c (c_finish_loop): For unconditional loops, set the
location of the backward-goto to the start of the loop body.

gcc/testsuite/ChangeLog:

PR debug/67192
* gcc.dg/guality/pr67192.c (f3, f4): New functions.
(main): Invoke them.

From-SVN: r230024

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/pr67192.c

index 7e22943f4e9dd6b006e2ef16827e092b961f65da..a666a3e32a374375e47b79ee859c1cb4e94b581d 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-09  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       PR debug/67192
+       * c-typeck.c (c_finish_loop): For unconditional loops, set the
+       location of the backward-goto to the start of the loop body.
+
 2015-11-09  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        PR debug/67192
index 2080db95ebc888a880e09b00f0e6e5a48fa62d49..9ee2681424587048c7dd3abf8c03f29f4d138067 100644 (file)
@@ -9898,6 +9898,16 @@ c_finish_loop (location_t start_locus, tree cond, tree incr, tree body,
            exit = fold_build3_loc (input_location,
                                COND_EXPR, void_type_node, cond, exit, t);
        }
+      else
+       {
+         /* For the backward-goto's location of an unconditional loop
+            use the beginning of the body, or, if there is none, the
+            top of the loop.  */
+         location_t loc = EXPR_LOCATION (expr_first (body));
+         if (loc == UNKNOWN_LOCATION)
+           loc = start_locus;
+         SET_EXPR_LOCATION (exit, loc);
+       }
 
       add_stmt (top);
     }
index a23420e34f498639fea35e4ac2777068543bea23..7408f52bd07dc2c9d914d8137a067ddf84d8b836 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-09  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       PR debug/67192
+       * gcc.dg/guality/pr67192.c (f3, f4): New functions.
+       (main): Invoke them.
+
 2015-11-09  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        PR debug/67192
index f6382ef98c15ac7ed9a486fb7b1793d778023ae2..946e68f8faadcd0c48cac98a2e2c1a61377a01aa 100644 (file)
@@ -39,15 +39,41 @@ f2 (void)
   do_it (); /* { dg-final { gdb-test 39 "cnt" "10" } } */
 }
 
+__attribute__((noinline, noclone)) static void
+f3 (void)
+{
+  for (;; do_it())
+    if (last ())
+      break;
+  do_it (); /* { dg-final { gdb-test 48 "cnt" "15" } } */
+}
+
+__attribute__((noinline, noclone)) static void
+f4 (void)
+{
+  while (1) /* { dg-final { gdb-test 54 "cnt" "15" } } */
+    if (last ())
+      break;
+    else
+      do_it ();
+  do_it (); /* { dg-final { gdb-test 59 "cnt" "20" } } */
+}
+
 void (*volatile fnp1) (void) = f1;
 void (*volatile fnp2) (void) = f2;
+void (*volatile fnp3) (void) = f3;
+void (*volatile fnp4) (void) = f4;
 
 int
 main ()
 {
   asm volatile ("" : : "r" (&fnp1) : "memory");
   asm volatile ("" : : "r" (&fnp2) : "memory");
+  asm volatile ("" : : "r" (&fnp3) : "memory");
+  asm volatile ("" : : "r" (&fnp4) : "memory");
   fnp1 ();
   fnp2 ();
+  fnp3 ();
+  fnp4 ();
   return 0;
 }