2019-01-13 Jim Wilson [BZ #24040] * elf/Makefile (CFLAGS-tst-unwind-main.c): Add -DUSE_PTHREADS=0. * elf/tst-unwind-main.c: If USE_PTHEADS, include pthread.h and error.h (func): New. (main): If USE_PTHREADS, call pthread_create to run func. Otherwise call func directly. * nptl/Makefile (tests): Add tst-unwind-thread. (CFLAGS-tst-unwind-thread.c): Define. * nptl/tst-unwind-thread.c: New file. * sysdeps/unix/sysv/linux/riscv/clone.S (__thread_start): Mark ra as undefined. Index: glibc-2.29/elf/Makefile =================================================================== --- glibc-2.29.orig/elf/Makefile +++ glibc-2.29/elf/Makefile @@ -1497,4 +1497,4 @@ $(objpfx)tst-big-note: $(objpfx)tst-big- $(objpfx)tst-unwind-ctor: $(objpfx)tst-unwind-ctor-lib.so -CFLAGS-tst-unwind-main.c += -funwind-tables +CFLAGS-tst-unwind-main.c += -funwind-tables -DUSE_PTHREADS=0 Index: glibc-2.29/elf/tst-unwind-main.c =================================================================== --- glibc-2.29.orig/elf/tst-unwind-main.c +++ glibc-2.29/elf/tst-unwind-main.c @@ -20,19 +20,41 @@ #include #include +#if USE_PTHREADS +# include +# include +#endif + static _Unwind_Reason_Code callback (struct _Unwind_Context *ctx, void *arg) { return _URC_NO_REASON; } -int -main (void) +static void * +func (void *a) { /* Arrange for this test to be killed if _Unwind_Backtrace runs into an endless loop. We cannot use the test driver because the complete call chain needs to be compiled with -funwind-tables so that - _Unwind_Backtrace is able to reach _start. */ + _Unwind_Backtrace is able to reach the start routine. */ alarm (DEFAULT_TIMEOUT); _Unwind_Backtrace (callback, 0); + return a; +} + +int +main (void) +{ +#if USE_PTHREADS + pthread_t thr; + int rc = pthread_create (&thr, NULL, &func, NULL); + if (rc) + error (1, rc, "pthread_create"); + rc = pthread_join (thr, NULL); + if (rc) + error (1, rc, "pthread_join"); +#else + func (NULL); +#endif } Index: glibc-2.29/nptl/Makefile =================================================================== --- glibc-2.29.orig/nptl/Makefile +++ glibc-2.29/nptl/Makefile @@ -320,7 +320,8 @@ tests = tst-attr1 tst-attr2 tst-attr3 ts tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \ tst-mtx-recursive tst-tss-basic tst-call-once tst-mtx-timedlock \ tst-rwlock-pwn \ - tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall + tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall \ + tst-unwind-thread tests-internal := tst-rwlock19 tst-rwlock20 \ tst-sem11 tst-sem12 tst-sem13 \ @@ -710,6 +711,8 @@ $(objpfx)tst-audit-threads: $(objpfx)tst $(objpfx)tst-audit-threads.out: $(objpfx)tst-audit-threads-mod1.so tst-audit-threads-ENV = LD_AUDIT=$(objpfx)tst-audit-threads-mod1.so +CFLAGS-tst-unwind-thread.c += -funwind-tables + # The tests here better do not run in parallel ifneq ($(filter %tests,$(MAKECMDGOALS)),) .NOTPARALLEL: Index: glibc-2.29/nptl/tst-unwind-thread.c =================================================================== --- /dev/null +++ glibc-2.29/nptl/tst-unwind-thread.c @@ -0,0 +1,2 @@ +#define USE_PTHREADS 1 +#include "../elf/tst-unwind-main.c" Index: glibc-2.29/sysdeps/unix/sysv/linux/riscv/clone.S =================================================================== --- glibc-2.29.orig/sysdeps/unix/sysv/linux/riscv/clone.S +++ glibc-2.29/sysdeps/unix/sysv/linux/riscv/clone.S @@ -69,6 +69,11 @@ L (error): ENTRY (__thread_start) L (thread_start): + /* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + .cfi_label .Ldummy + cfi_undefined (ra) + /* Restore the arg for user's function. */ REG_L a1,0(sp) /* Function pointer. */ REG_L a0,SZREG(sp) /* Argument pointer. */