https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91610
Bug ID: 91610 Summary: fvar-tracking degrades -O0 debug info Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug Assignee: unassigned at gcc dot gnu.org Reporter: vries at gcc dot gnu.org Target Milestone: --- Consider this test-case: ... $ cat test2.c #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) { 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; } ... When compiled with debug-info at -O0: ... $ gcc test2.c -g ... We get the expected value l == 2 out of this debug session: ... $ gdb -q a.out -ex "b test2.c:13" -ex run Reading symbols from a.out...done. Breakpoint 1 at 0x400541: file test2.c, line 13. Starting program: /data/gdb_versions/devel/a.out Breakpoint 1, wack_signed_char (u=-1 '\377', v=-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, with -fvar-tracking added: ... $ gcc test2.c -g -fvar-tracking ... we get an incorrect l == -3: ... $ gdb -q a.out -ex "b test2.c:13" -ex run Reading symbols from a.out...done. Breakpoint 1 at 0x400541: 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' ... Running -fvar-tracking at -O0 can improve debug info for local variables with register storage class. But it should not degrade debug info for local variables that have a stack location assigned.