From fc402eec4b203f2fba90abd57805174d4101d618 Mon Sep 17 00:00:00 2001 From: Andreas Arnez Date: Mon, 9 Nov 2015 15:35:10 +0000 Subject: [PATCH] [PR debug/67192] Further fix C loops' back-jump location 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 | 6 ++++++ gcc/c/c-typeck.c | 10 ++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/guality/pr67192.c | 26 ++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 7e22943f4e9..a666a3e32a3 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-11-09 Andreas Arnez + + 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 PR debug/67192 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 2080db95ebc..9ee26814245 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a23420e34f4..7408f52bd07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-11-09 Andreas Arnez + + PR debug/67192 + * gcc.dg/guality/pr67192.c (f3, f4): New functions. + (main): Invoke them. + 2015-11-09 Andreas Arnez PR debug/67192 diff --git a/gcc/testsuite/gcc.dg/guality/pr67192.c b/gcc/testsuite/gcc.dg/guality/pr67192.c index f6382ef98c1..946e68f8faa 100644 --- a/gcc/testsuite/gcc.dg/guality/pr67192.c +++ b/gcc/testsuite/gcc.dg/guality/pr67192.c @@ -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; } -- 2.30.2