Merge the DARWIN branch onto the trunk.
I tried using 'svn merge' to do the merge but it did a terrible job and
there were bazillions of conflicts. So instead I just took the diff between
the branch and trunk at r10155, applied the diff to the trunk, 'svn add'ed
the added files (no files needed to be 'svn remove'd) and committed.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10156 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/drd/Makefile.am b/drd/Makefile.am
index 18a8844..84655f2 100644
--- a/drd/Makefile.am
+++ b/drd/Makefile.am
@@ -1,6 +1,7 @@
include $(top_srcdir)/Makefile.tool.am
noinst_PROGRAMS =
+noinst_DSYMS =
if VGCONF_PLATFORMS_INCLUDE_X86_LINUX
noinst_PROGRAMS += drd-x86-linux vgpreload_drd-x86-linux.so
endif
@@ -19,6 +20,14 @@
if VGCONF_PLATFORMS_INCLUDE_PPC64_AIX5
noinst_PROGRAMS += drd-ppc64-aix5 vgpreload_drd-ppc64-aix5.so
endif
+if VGCONF_PLATFORMS_INCLUDE_X86_DARWIN
+ noinst_PROGRAMS += drd-x86-darwin vgpreload_drd-x86-darwin.so
+ noinst_DSYMS += vgpreload_drd-x86-darwin.so
+endif
+if VGCONF_PLATFORMS_INCLUDE_AMD64_DARWIN
+ noinst_PROGRAMS += drd-amd64-darwin vgpreload_drd-amd64-darwin.so
+ noinst_DSYMS += vgpreload_drd-amd64-darwin.so
+endif
VGPRELOAD_DRD_SOURCES = \
@@ -91,6 +100,22 @@
vgpreload_drd_ppc64_aix5_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC64_AIX5)\
$(LIBREPLACEMALLOC_LDFLAGS_PPC64_AIX5)
+vgpreload_drd_x86_darwin_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
+vgpreload_drd_x86_darwin_so_CPPFLAGS = $(AM_CPPFLAGS_X86_DARWIN)
+vgpreload_drd_x86_darwin_so_CFLAGS = $(AM_CFLAGS_X86_DARWIN) $(AM_CFLAGS_PIC)
+vgpreload_drd_x86_darwin_so_CCASFLAGS = $(AM_CCASFLAGS_X86_DARWIN)
+vgpreload_drd_x86_darwin_so_DEPENDENCIES = $(LIBREPLACEMALLOC_X86_DARWIN)
+vgpreload_drd_x86_darwin_so_LDFLAGS = $(PRELOAD_LDFLAGS_X86_DARWIN)\
+ $(LIBREPLACEMALLOC_LDFLAGS_X86_DARWIN)
+
+vgpreload_drd_amd64_darwin_so_SOURCES = $(VGPRELOAD_DRD_SOURCES)
+vgpreload_drd_amd64_darwin_so_CPPFLAGS = $(AM_CPPFLAGS_AMD64_DARWIN)
+vgpreload_drd_amd64_darwin_so_CFLAGS = $(AM_CFLAGS_AMD64_DARWIN) $(AM_CFLAGS_PIC)
+vgpreload_drd_amd64_darwin_so_CCASFLAGS = $(AM_CCASFLAGS_AMD64_DARWIN)
+vgpreload_drd_amd64_darwin_so_DEPENDENCIES =
+vgpreload_drd_amd64_darwin_so_LDFLAGS = $(PRELOAD_LDFLAGS_AMD64_DARWIN)\
+ $(LIBREPLACEMALLOC_LDFLAGS_AMD64_DARWIN)
+
DRD_SOURCES = \
drd_barrier.c \
@@ -175,3 +200,19 @@
drd_ppc64_aix5_DEPENDENCIES = $(COREGRIND_LIBS_PPC64_AIX5)
drd_ppc64_aix5_LDADD = $(TOOL_LDADD_PPC64_AIX5)
drd_ppc64_aix5_LDFLAGS = $(TOOL_LDFLAGS_PPC64_AIX5)
+
+drd_x86_darwin_SOURCES = $(DRD_SOURCES)
+drd_x86_darwin_CPPFLAGS = $(AM_CPPFLAGS_X86_DARWIN)
+drd_x86_darwin_CFLAGS = $(AM_CFLAGS_X86_DARWIN)
+drd_x86_darwin_DEPENDENCIES = $(COREGRIND_LIBS_X86_DARWIN)
+drd_x86_darwin_LDADD = $(TOOL_LDADD_X86_DARWIN)
+drd_x86_darwin_LDFLAGS = $(TOOL_LDFLAGS_X86_DARWIN)
+
+drd_amd64_darwin_SOURCES = $(DRD_SOURCES)
+drd_amd64_darwin_CPPFLAGS = $(AM_CPPFLAGS_AMD64_DARWIN)
+drd_amd64_darwin_CFLAGS = $(AM_CFLAGS_AMD64_DARWIN)
+drd_amd64_darwin_DEPENDENCIES = $(COREGRIND_LIBS_AMD64_DARWIN)
+drd_amd64_darwin_LDADD = $(TOOL_LDADD_AMD64_DARWIN)
+drd_amd64_darwin_LDFLAGS = $(TOOL_LDFLAGS_AMD64_DARWIN)
+
+
diff --git a/drd/drd_main.c b/drd/drd_main.c
index 0dfb00a..3cc6348 100644
--- a/drd/drd_main.c
+++ b/drd/drd_main.c
@@ -607,8 +607,13 @@
static
void drd_pre_clo_init(void)
{
- // Basic tool stuff.
+#if defined(VGO_darwin)
+ // This makes the (all-failing) regtests run much faster.
+ VG_(printf)("DRD doesn't work on Darwin yet, sorry.\n");
+ VG_(exit)(1);
+#endif
+ // Basic tool stuff.
VG_(details_name) ("drd");
VG_(details_version) (NULL);
VG_(details_description) ("a thread error detector");
diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c
index f77569d..db33fbd 100644
--- a/drd/drd_pthread_intercepts.c
+++ b/drd/drd_pthread_intercepts.c
@@ -643,6 +643,7 @@
}
+#if defined(HAVE_PTHREAD_SPIN_LOCK)
// pthread_spin_init
PTH_FUNC(int, pthreadZuspinZuinit, // pthread_spin_init
pthread_spinlock_t *spinlock,
@@ -723,7 +724,10 @@
spinlock, 0, 0, 0, 0);
return ret;
}
+#endif // HAVE_PTHREAD_SPIN_LOCK
+
+#if defined(HAVE_PTHREAD_BARRIER_INIT)
// pthread_barrier_init
PTH_FUNC(int, pthreadZubarrierZuinit, // pthread_barrier_init
pthread_barrier_t* barrier,
@@ -775,6 +779,7 @@
ret == PTHREAD_BARRIER_SERIAL_THREAD, 0);
return ret;
}
+#endif // HAVE_PTHREAD_BARRIER_INIT
// sem_init
diff --git a/drd/tests/recursive_mutex.c b/drd/tests/recursive_mutex.c
index ad79b63..3ddfc25 100644
--- a/drd/tests/recursive_mutex.c
+++ b/drd/tests/recursive_mutex.c
@@ -10,6 +10,7 @@
#include "../../config.h"
+#if !defined(VGO_darwin)
static void lock_twice(pthread_mutex_t* const p)
{
pthread_mutex_lock(p);
@@ -17,6 +18,7 @@
pthread_mutex_unlock(p);
pthread_mutex_unlock(p);
}
+#endif
int main(int argc, char** argv)
{
@@ -60,6 +62,10 @@
pthread_mutex_destroy(&m);
}
#endif
+
+// DDD: Darwin doesn't support signals yet, so the alarm() call doesn't kick
+// in, which causes it to hang.
+#if !defined(VGO_darwin)
{
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
@@ -68,5 +74,6 @@
lock_twice(&m);
}
printf("Done.\n");
+#endif
return 0;
}