From: Paul Floyd Date: Sun, 14 Dec 2025 19:23:10 +0000 (+0100) Subject: Darwin DRD: redirs for semaphore functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b13afacd68bf667b50f52bfc5d0a010dc6f71e5a;p=thirdparty%2Fvalgrind.git Darwin DRD: redirs for semaphore functions Like 2802b31ae644301ee641dcae20d1f84373615d54 for Helgrind. Use the DRD script supported_sem_init in Helgrind tests that use semaphores, it's clearer than just using tests/os_test --- diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c index 0cd7c0be6..6e150ca4e 100644 --- a/drd/drd_pthread_intercepts.c +++ b/drd/drd_pthread_intercepts.c @@ -202,6 +202,13 @@ ret_ty VG_WRAP_FUNCTION_ZZ(VG_Z_LIBPTHREAD_SONAME,zf) argl_decl \ { return implf argl; } #endif +#if defined(VGO_darwin) +#define LIBC_FUNC(ret_ty, zf, implf, argl_decl, argl) \ + ret_ty VG_WRAP_FUNCTION_ZZ(VG_Z_LIBSYSTEM_KERNEL_SONAME,zf) argl_decl; \ + ret_ty VG_WRAP_FUNCTION_ZZ(VG_Z_LIBSYSTEM_KERNEL_SONAME,zf) argl_decl \ + { return implf argl; } +#endif + /** * Macro for generating three Valgrind interception functions: one with the * Z-encoded name zf, one with ZAZa ("@*") appended to the name zf and one @@ -1491,7 +1498,7 @@ int sem_init_intercept(sem_t *sem, int pshared, unsigned int value) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZuinit, sem_init_intercept, (sem_t *sem, int pshared, unsigned int value), (sem, pshared, value)); #else @@ -1534,7 +1541,7 @@ int sem_destroy_intercept(sem_t *sem) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZudestroy, sem_destroy_intercept, (sem_t *sem), (sem)); #else PTH_FUNCS(int, semZudestroy, sem_destroy_intercept, (sem_t *sem), (sem)); @@ -1570,7 +1577,7 @@ sem_t* sem_open_intercept(const char *name, int oflag, mode_t mode, return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(sem_t *, semZuopen, sem_open_intercept, (const char *name, int oflag, mode_t mode, unsigned int value), (name, oflag, mode, value)); @@ -1593,7 +1600,7 @@ static __always_inline int sem_close_intercept(sem_t *sem) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZuclose, sem_close_intercept, (sem_t *sem), (sem)); #else PTH_FUNCS(int, semZuclose, sem_close_intercept, (sem_t *sem), (sem)); @@ -1612,7 +1619,7 @@ static __always_inline int sem_wait_intercept(sem_t *sem) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZuwait, sem_wait_intercept, (sem_t *sem), (sem)); #else PTH_FUNCS(int, semZuwait, sem_wait_intercept, (sem_t *sem), (sem)); @@ -1635,7 +1642,7 @@ static __always_inline int sem_trywait_intercept(sem_t *sem) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZutrywait, sem_trywait_intercept, (sem_t *sem), (sem)); #else PTH_FUNCS(int, semZutrywait, sem_trywait_intercept, (sem_t *sem), (sem)); @@ -1658,7 +1665,7 @@ int sem_timedwait_intercept(sem_t *sem, const struct timespec *abs_timeout) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZutimedwait, sem_timedwait_intercept, (sem_t *sem, const struct timespec *abs_timeout), (sem, abs_timeout)); @@ -1711,7 +1718,7 @@ static __always_inline int sem_post_intercept(sem_t *sem) return ret; } -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, semZupost, sem_post_intercept, (sem_t *sem), (sem)); #else PTH_FUNCS(int, semZupost, sem_post_intercept, (sem_t *sem), (sem)); diff --git a/helgrind/hg_intercepts.c b/helgrind/hg_intercepts.c index 09e3bea17..aa48ce02a 100644 --- a/helgrind/hg_intercepts.c +++ b/helgrind/hg_intercepts.c @@ -3118,6 +3118,7 @@ static int sem_init_WRK(sem_t* sem, int pshared, unsigned long value) return sem_init_WRK(sem, pshared, value); } #elif defined(VGO_darwin) +// exists but fails with ENOSYS function not implemented LIBC_FUNC(int, semZuinit, // sem_init sem_t* sem, int pshared, unsigned long value) { return sem_init_WRK(sem, pshared, value); @@ -3206,6 +3207,7 @@ static int sem_destroy_WRK(sem_t* sem) return sem_destroy_WRK(sem); } #elif defined(VGO_darwin) +// exists but fails with ENOSYS function not implemented LIBC_FUNC(int, semZudestroy, // sem_destroy sem_t* sem) { return sem_destroy_WRK(sem); @@ -3274,6 +3276,7 @@ static int sem_wait_WRK(sem_t* sem) return sem_wait_WRK(sem); } #elif defined(VGO_darwin) +// exists but fails with EBADF bad file number LIBC_FUNC(int, semZuwait, sem_t* sem) { /* sem_wait */ return sem_wait_WRK(sem); } diff --git a/helgrind/tests/tc18_semabuse.vgtest b/helgrind/tests/tc18_semabuse.vgtest index fe4d22ba1..4818d739d 100644 --- a/helgrind/tests/tc18_semabuse.vgtest +++ b/helgrind/tests/tc18_semabuse.vgtest @@ -1 +1,2 @@ +prereq: ../../drd/tests/supported_sem_init prog: tc18_semabuse diff --git a/helgrind/tests/tc24_nonzero_sem.vgtest b/helgrind/tests/tc24_nonzero_sem.vgtest index 1a43121eb..87f4b8bfd 100644 --- a/helgrind/tests/tc24_nonzero_sem.vgtest +++ b/helgrind/tests/tc24_nonzero_sem.vgtest @@ -1,2 +1,3 @@ +prereq: ../../drd/tests/supported_sem_init prog: tc24_nonzero_sem vgopts: --hg-sanity-flags=111111