]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin helgrind: redirs for semaphore functions
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 14 Dec 2025 17:21:19 +0000 (18:21 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 14 Dec 2025 17:21:19 +0000 (18:21 +0100)
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.

helgrind/hg_intercepts.c
helgrind/tests/tc17_sembar.c
helgrind/tests/tc24_nonzero_sem.c
include/pub_tool_redir.h

index 4bef0ab95979a7af15acfb8f876f42f6ece7c7be..09e3bea17994b7ae79b5f5109cf433442534356a 100644 (file)
 #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)
index ee40160b082d899cb3469d21e385903132ff44f1..9f8d3fa8c04059d1d06924d4f5bcd806b64d437b 100644 (file)
@@ -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)
index 2fe408191337e275fba98929a44b8cda84954c76..9b08adee45f8115ad1f8bc7ef17c53af85b6e6b8 100644 (file)
@@ -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;
index f2d76810878562c76a9784c2ecbf5013a1029c6f..e2cbac44fb235b3b9f438e9684ef68fab1a44d60 100644 (file)
 /* 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"