|
From: Paul F. <pa...@so...> - 2025-12-14 17:30:14
|
https://sourceware.org/cgit/valgrind/commit/?id=2802b31ae644301ee641dcae20d1f84373615d54 commit 2802b31ae644301ee641dcae20d1f84373615d54 Author: Paul Floyd <pj...@wa...> Date: Sun Dec 14 18:21:19 2025 +0100 Darwin helgrind: redirs for semaphore functions The semaphore functions are not in the pthread library (similar to FreeBSD). Change the redirs to use libsystem_kernel.dylib Unfortunately this doesn't help much. Darwin has deprecated these functions so the tests will compile (with a warning) but at runtime they all fail with errors like ENOSYS and EBADF. Diff: --- helgrind/hg_intercepts.c | 22 ++++++++++++++-------- helgrind/tests/tc17_sembar.c | 4 ++++ helgrind/tests/tc24_nonzero_sem.c | 6 +++++- include/pub_tool_redir.h | 1 + 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/helgrind/hg_intercepts.c b/helgrind/hg_intercepts.c index 4bef0ab959..09e3bea179 100644 --- a/helgrind/hg_intercepts.c +++ b/helgrind/hg_intercepts.c @@ -119,6 +119,12 @@ #include <osreldate.h> #endif +#if defined(VGO_darwin) +#define LIBC_FUNC(ret_ty, f, args...) \ + ret_ty I_WRAP_SONAME_FNNAME_ZZ(VG_Z_LIBSYSTEM_KERNEL_SONAME,f)(args); \ + ret_ty I_WRAP_SONAME_FNNAME_ZZ(VG_Z_LIBSYSTEM_KERNEL_SONAME,f)(args) +#endif + // Do a client request. These are macros rather than a functions so // as to avoid having an extra frame in stack traces. @@ -3112,7 +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) - PTH_FUNC(int, semZuinit, // sem_init + LIBC_FUNC(int, semZuinit, // sem_init sem_t* sem, int pshared, unsigned long value) { return sem_init_WRK(sem, pshared, value); } @@ -3200,7 +3206,7 @@ static int sem_destroy_WRK(sem_t* sem) return sem_destroy_WRK(sem); } #elif defined(VGO_darwin) - PTH_FUNC(int, semZudestroy, // sem_destroy + LIBC_FUNC(int, semZudestroy, // sem_destroy sem_t* sem) { return sem_destroy_WRK(sem); } @@ -3268,10 +3274,10 @@ static int sem_wait_WRK(sem_t* sem) return sem_wait_WRK(sem); } #elif defined(VGO_darwin) - PTH_FUNC(int, semZuwait, sem_t* sem) { /* sem_wait */ + LIBC_FUNC(int, semZuwait, sem_t* sem) { /* sem_wait */ return sem_wait_WRK(sem); } - PTH_FUNC(int, semZuwaitZDZa, sem_t* sem) { /* sem_wait$* */ + LIBC_FUNC(int, semZuwaitZDZa, sem_t* sem) { /* sem_wait$* */ return sem_wait_WRK(sem); } #elif defined(VGO_freebsd) @@ -3334,7 +3340,7 @@ PTH_FUNC(int, semZutrywaitZAZa, sem_t* sem) { /* sem_trywait@* */ return sem_trywait_WRK(sem); } #elif defined(VGO_darwin) -PTH_FUNC(int, semZutrywait, sem_t* sem) { /* sem_trywait */ +LIBC_FUNC(int, semZutrywait, sem_t* sem) { /* sem_trywait */ return sem_trywait_WRK(sem); } #elif defined(VGO_freebsd) @@ -3511,7 +3517,7 @@ static int sem_post_WRK(sem_t* sem) return sem_post_WRK(sem); } #elif defined(VGO_darwin) - PTH_FUNC(int, semZupost, sem_t* sem) { /* sem_post */ + LIBC_FUNC(int, semZupost, sem_t* sem) { /* sem_post */ return sem_post_WRK(sem); } #elif defined(VGO_freebsd) @@ -3533,7 +3539,7 @@ static int sem_post_WRK(sem_t* sem) // Solaris: sem_open // FreeBSD: sem_open // -#if defined(VGO_freebsd) +#if defined(VGO_freebsd) || defined(VGO_DARWIN) LIBC_FUNC(sem_t*, semZuopen, const char* name, long oflag, long mode, unsigned long value) @@ -3578,7 +3584,7 @@ PTH_FUNC(sem_t*, semZuopen, // darwin: sem_close // Solaris: sem_close // FreeBSD: sem_close -#if defined (VGO_freebsd) +#if defined (VGO_freebsd) || defined(VGO_darwin) LIBC_FUNC(int, sem_close, sem_t* sem) #else PTH_FUNC(int, sem_close, sem_t* sem) diff --git a/helgrind/tests/tc17_sembar.c b/helgrind/tests/tc17_sembar.c index ee40160b08..9f8d3fa8c0 100644 --- a/helgrind/tests/tc17_sembar.c +++ b/helgrind/tests/tc17_sembar.c @@ -253,7 +253,11 @@ static sem_t* my_sem_init (char* identity, int pshared, unsigned count) static int my_sem_destroy ( sem_t* s ) { +#if defined(VGO_darwin) +return 0; +#else return sem_destroy(s); +#endif } static int my_sem_wait(sem_t* s) diff --git a/helgrind/tests/tc24_nonzero_sem.c b/helgrind/tests/tc24_nonzero_sem.c index 2fe4081913..9b08adee45 100644 --- a/helgrind/tests/tc24_nonzero_sem.c +++ b/helgrind/tests/tc24_nonzero_sem.c @@ -45,7 +45,11 @@ int main ( void ) } r= my_sem_destroy(sem); -#if !defined(VGO_darwin) +#if defined(VGO_darwin) + // This outputs "function not implemented" if uncommented + //if (r != 0) + // perror("sem_destroy"); +#else assert(!r); #endif return 0; diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h index f2d7681087..e2cbac44fb 100644 --- a/include/pub_tool_redir.h +++ b/include/pub_tool_redir.h @@ -267,6 +267,7 @@ /* Not tested on systems older than OSX 10.13 */ #define VG_Z_LIBSYSTEM_C_SONAME libsystemZucZddylib #define VG_Z_LIBSYSTEM_PLATFORM_SONAME libsystemZuplatformZddylib +#define VG_Z_LIBSYSTEM_KERNEL_SONAME libsystemZukernelZddylib #else # error "Unknown platform" |