[Bug libstdc++/60758] New: Infinite backtrace in __cxa_end_cleanup

alexey.merzlyakov at samsung dot com gcc-bugzilla@gcc.gnu.org
Fri Apr 4 07:51:00 GMT 2014


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60758

            Bug ID: 60758
           Summary: Infinite backtrace in  __cxa_end_cleanup
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alexey.merzlyakov at samsung dot com
                CC: v.garbuzov at samsung dot com, y.gribov at samsung dot com
            Target: arm

Created attachment 32542
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32542&action=edit
Testcase to reproduce

While debugging a compiled testcase, the infinite backtrace appears:
  Breakpoint 1, __gnu_end_cleanup () at
../../../../gcc-src/libstdc++-v3/libsupc++/eh_arm.cc:134
  134    ../../../../gcc-src/libstdc++-v3/libsupc++/eh_arm.cc: No such file or
directory.
  (gdb) bt
  #0  __gnu_end_cleanup () at
../../../../gcc-src/libstdc++-v3/libsupc++/eh_arm.cc:134
  #1  0xb6f45b2c in __cxa_end_cleanup () from /lib/libstdc++.so.6
  #2  0xb6f45b2c in __cxa_end_cleanup () from /lib/libstdc++.so.6
  #3  0xb6f45b2c in __cxa_end_cleanup () from /lib/libstdc++.so.6
  #4  0xb6f45b2c in __cxa_end_cleanup () from /lib/libstdc++.so.6
  ...

GCC configuration:
  $ arm-linux-gnueabi-gcc -v
  Using built-in specs.
  COLLECT_GCC=./arm-linux-gnueabi-gcc
 
COLLECT_LTO_WRAPPER=/home/alexey.merzlyakov/arm/libexec/gcc/arm-linux-gnueabi/4.9.0/lto-wrapper
  Target: arm-linux-gnueabi
  Configured with: ../gcc-src/configure --host=i686-pc-linux-gnu
--target=arm-linux-gnueabi --prefix=/home/alexey.merzlyakov/arm
--with-sysroot=/home/alexey.merzlyakov/arm/arm-linux-gnueabi/sys-root
--disable-libmudflap --disable-libssp --with-mode=arm --with-fpu=vfpv3
--with-cpu=cortex-a15 --with-tune=cortex-a15 --with-float=softfp
--disable-libatomic --disable-libgomp --enable-languages=c,c++
--with-gmp=/home/alexey.merzlyakov/arm --with-mpfr=/home/alexey.merzlyakov/arm
--with-mpc=/home/alexey.merzlyakov/arm
  Thread model: posix
  gcc version 4.9.0 20140403 (experimental) (GCC)

Compiling the testcase:
  $ arm-linux-gnueabi-g++ rethrow_if_nested.ii -std=gnu++0x -g

The __cxa_end_cleanup() does not save/restore LR in function header/footer and
does not provide any unwind info:
libstdc++-v3/libsupc++/eh_arm.cc ->
  "__cxa_end_cleanup:\n"
  "       push\t{r1, r2, r3, r4}\n"
  "       bl\t__gnu_end_cleanup\n"
  "       pop\t{r1, r2, r3, r4}\n"
  "       bl\t_Unwind_Resume @ Never returns\n"
GDB uses LR saving/restoring information when making a backtrace (when unwind
info is not available). Otherwise if there are no information, the LR on
current frame will be equal to LR on previous frame. It causes GDB to generate
same backtrace-items for __cxa_end_cleanup again and again.

I would expect the same problem for other tools that unwind stacks (e.g. unwind
code in libgcc, libbacktrace, etc.).

So, it seems to be a libstdc++ bug. Adding the LR in the arguments of
save/restore instructions in __cxa_end_cleanup() code fixes it. Another option
would be to add unwind entries (.cfi_whatever).



More information about the Gcc-bugs mailing list