In continuous integration builds with clang (both an old clang 7
and a new clang 18 or 19-pre), I see three test failures:

  FAIL: test-call_once2
  FAIL: test-rwlock1
  FAIL: test-lock

What's happening, is that clang, in the compilation unit of
glthread/lock.c, interprets the statements

  #pragma weak pthread_rwlockattr_init
  #pragma weak pthread_rwlock_init

as if they were

  #pragma weak rpl_pthread_rwlockattr_init
  #pragma weak rpl_pthread_rwlock_init

The first consequence is that 'nm glthread/lock.c' shows

  w rpl_pthread_rwlockattr_init
  w rpl_pthread_rwlock_init

instead of

  U rpl_pthread_rwlockattr_init
  U rpl_pthread_rwlock_init

The next consequence is that at link time, pthread-rwlock.o is not included.

The final consequence is that at run time, rpl_pthread_rwlockattr_init and
rpl_pthread_rwlock_init resolve to NULL pointers, and the function
glthread_rwlock_init_for_glibc thus crashes.

This patch works around it.


2024-08-17  Bruno Haible  <br...@clisp.org>

        once: Fix pthread-rwlock crashes with clang (regr. 2024-08-07).
        * lib/glthread/once.h: Don't mark pthread_rwlock_init,
        pthread_rwlockattr_init as weak if we are overriding them.

diff --git a/lib/glthread/once.h b/lib/glthread/once.h
index fd00e42350..2452f88dc1 100644
--- a/lib/glthread/once.h
+++ b/lib/glthread/once.h
@@ -124,7 +124,10 @@ extern int glthread_in_use (void);
 #  pragma weak pthread_mutex_lock
 #  pragma weak pthread_mutex_unlock
 #  pragma weak pthread_mutex_destroy
-#  pragma weak pthread_rwlock_init
+/* Work around clang bug <https://github.com/llvm/llvm-project/issues/104670> 
*/
+#  ifndef pthread_rwlock_init
+#   pragma weak pthread_rwlock_init
+#  endif
 #  pragma weak pthread_rwlock_rdlock
 #  pragma weak pthread_rwlock_wrlock
 #  pragma weak pthread_rwlock_unlock
@@ -138,7 +141,10 @@ extern int glthread_in_use (void);
 #  pragma weak pthread_mutexattr_init
 #  pragma weak pthread_mutexattr_settype
 #  pragma weak pthread_mutexattr_destroy
-#  pragma weak pthread_rwlockattr_init
+/* Work around clang bug <https://github.com/llvm/llvm-project/issues/104670> 
*/
+#  ifndef pthread_rwlockattr_init
+#   pragma weak pthread_rwlockattr_init
+#  endif
 #  if __GNU_LIBRARY__ > 1
 #   pragma weak pthread_rwlockattr_setkind_np
 #  endif




Reply via email to