https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117320
Bug ID: 117320 Summary: wrong debug info for function with cold alternative (-g -O2) Product: gcc Version: 14.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug Assignee: unassigned at gcc dot gnu.org Reporter: eggert at cs dot ucla.edu Target Milestone: --- Created attachment 59464 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59464&action=edit wrong debug info for backtrace_function with gcc -g -O2 x86-64 We ran into a problem when debugging GNU Emacs and I reproduced it with gcc (GCC) 14.2.1 20240912 (Red Hat 14.2.1-3) on x86-64. Decompress and compile the attached file eval.i.gz and check the results with: gzip -d eval.i.gz gcc -g -O2 -c eval.i nm eval.o | grep -E 'backtrace_(next|function)' gdb -ex 'print backtrace_next' -ex 'print backtrace_function' eval.o nm outputs: 0000000000000bf0 T backtrace_function 00000000000002c8 t backtrace_function.cold 00000000000001bf t backtrace_function.part.0 0000000000000c90 T backtrace_next However, gdb outputs: $1 = {union specbinding *(union specbinding *)} 0xc90 <backtrace_next> $2 = {Lisp_Object (union specbinding *)} 0xa369 <backtrace_function> Although gdb reports the correct address for backtrace_next, it reports the wrong address for backtrace_function. The problem appears to occur because backtrace_function is optimized into cold and hot parts, in different sections, and GCC outputs incorrect debug info in this case.