Commit fc402eec by Andreas Arnez Committed by Andreas Krebbel

[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
parent f6b0b3db
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
* c-parser.c (c_parser_while_statement): Finish the loop before
parsing ahead for misleading indentation.
(c_parser_for_statement): Likewise.
......
......@@ -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);
}
......
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
* gcc.dg/guality/pr67192.c: New test.
2015-11-09 Richard Biener <rguenther@suse.de>
......
......@@ -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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment