https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91611

--- Comment #2 from Tom de Vries <vries at gcc dot gnu.org> ---
Also, consider test2.c (as test2.c in PR91610, but with register keyword for
variable l in wack_signed_char):
...
#include <stdio.h>

signed char
add_signed_char (signed char u, signed char v)
{
  return u + v;
}

signed char
wack_signed_char (signed char u, signed char v)
{
  register signed char l = u, r = v;
  l = add_signed_char (l, r);
  return l + r;
}

int
main ()
{
  signed char res = wack_signed_char (-1, -2);
  printf ("%d\n", res);
  return 0;
}
...

With Og:
...
$ gcc test2.c -g -Og
...

we have the expected l == 2 result:
...
$ gdb -q a.out -ex "b test2.c:13" -ex run
Reading symbols from a.out...done.
Breakpoint 1 at 0x400527: file test2.c, line 13.
Starting program: /data/gdb_versions/devel/a.out 

Breakpoint 1, wack_signed_char (u=u@entry=-1 '\377', v=v@entry=-2 '\376') at
test2.c:13
13        l = add_signed_char (l, r);
(gdb) p l
$1 = -1 '\377'
(gdb) p r
$2 = -2 '\376'
(gdb) set variable l = 4
(gdb) p l
$3 = 4 '\004'
(gdb) n
14        return l + r;
(gdb) p l
$4 = 2 '\002'
...

However, when we use -O0 plus all the debug flags that are enabled at > O0
according to the docs:
...
$gcc test2.c -g -O0 -fvar-tracking -fvar-tracking-assignments
-gstatement-frontiers
...
we get:
...
$ gdb -q a.out -ex "b test2.c:13" -ex run
Reading symbols from a.out...done.
Breakpoint 1 at 0x400558: file test2.c, line 13.
Starting program: /data/gdb_versions/devel/a.out 

Breakpoint 1, wack_signed_char (u=u@entry=-1 '\377', v=v@entry=-2 '\376') at
test2.c:13
13        l = add_signed_char (l, r);
(gdb) p l
$1 = -1 '\377'
(gdb)  p r
$2 = -2 '\376'
(gdb) set variable l = 4
(gdb) p l
$3 = 4 '\004'
(gdb) n
14        return l + r;
(gdb) p l
$4 = -3 '\375'
...

Reply via email to