Skip to content

Instantly share code, notes, and snippets.

@mckelvin
Last active August 13, 2018 07:26
Show Gist options
  • Save mckelvin/8514475 to your computer and use it in GitHub Desktop.
Save mckelvin/8514475 to your computer and use it in GitHub Desktop.
homebrew formula for valgrind on OSX 10.9 Mavericks
# brew edit valgrind
# paste me
# brew install valgrind
require 'formula'
class Valgrind < Formula
homepage 'http://www.valgrind.org/'
url 'http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2'
sha1 '9415e28933de9d6687f993c4bb797e6bd49583f1'
depends_on 'automake'
depends_on 'autoconf'
depends_on 'libtool'
head do
url 'svn://svn.valgrind.org/valgrind/trunk'
end
depends_on :macos => :snow_leopard
# Valgrind needs vcpreload_core-*-darwin.so to have execute permissions.
# See #2150 for more information.
skip_clean 'lib/valgrind'
def patches
# 1: For Xcode-only systems, we have to patch hard-coded paths, use xcrun &
# add missing CFLAGS. See: https://bugs.kde.org/show_bug.cgi?id=295084
# 2: Fix for 10.7.4 w/XCode-4.5, duplicate symbols. Reported upstream in
# https://bugs.kde.org/show_bug.cgi?id=307415
# 3: Fix for 10.9 Mavericks
p = []
p << 'https://gist.github.com/raw/3784836/f046191e72445a2fc8491cb6aeeabe84517687d9/patch1.diff' unless MacOS::CLT.installed?
p << 'https://gist.github.com/raw/3784930/dc8473c0ac5274f6b7d2eb23ce53d16bd0e2993a/patch2.diff' if MacOS.version == :lion
p << 'https://gist.github.com/mckelvin/8514475/raw/1939e5dfeb1dfc2974582f0dbbf5e3aaeb46d17a/valgrind-3.9.0-mavericks.patch' if MacOS.version == :mavericks
return p
end
def install
args = %W[
--disable-dependency-tracking
--prefix=#{prefix}
]
if MacOS.prefer_64_bit?
args << "--enable-only64bit" << "--build=amd64-darwin"
else
args << "--enable-only32bit"
end
system "./autogen.sh"
system "./configure", *args
system "make"
system "make install"
end
def test
system "#{bin}/valgrind", "ls", "-l"
end
end
diff --git a/configure.ac b/configure.ac
index 229ab98..b9ef0c8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -301,6 +301,7 @@ case "${host_os}" in
AC_DEFINE([DARWIN_10_6], 100600, [DARWIN_VERS value for Mac OS X 10.6])
AC_DEFINE([DARWIN_10_7], 100700, [DARWIN_VERS value for Mac OS X 10.7])
AC_DEFINE([DARWIN_10_8], 100800, [DARWIN_VERS value for Mac OS X 10.8])
+ AC_DEFINE([DARWIN_10_9], 100900, [DARWIN_VERS value for Mac OS X 10.9])
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
@@ -346,9 +347,15 @@ case "${host_os}" in
DEFAULT_SUPP="darwin12.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
;;
+ 13.*)
+ AC_MSG_RESULT([Darwin 13.x (${kernel}) / Mac OS X 10.9 Mavericks])
+ AC_DEFINE([DARWIN_VERS], DARWIN_10_9, [Darwin / Mac OS X version])
+ DEFAULT_SUPP="darwin13.supp ${DEFAULT_SUPP}"
+ DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
+ ;;
*)
AC_MSG_RESULT([unsupported (${kernel})])
- AC_MSG_ERROR([Valgrind works on Darwin 10.x and 11.x (Mac OS X 10.6/7)])
+ AC_MSG_ERROR([Valgrind works on Darwin 10.x, 11.x, 12.x and 13.x (Mac OS X 10.6/7/8/9)])
;;
esac
;;
diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c
index 56fbe82..87fee8e 100644
--- a/coregrind/m_debuginfo/debuginfo.c
+++ b/coregrind/m_debuginfo/debuginfo.c
@@ -968,7 +968,7 @@ void VG_(di_notify_mprotect)( Addr a, SizeT len, UInt prot )
void VG_(di_notify_vm_protect)( Addr a, SizeT len, UInt prot )
{
Bool do_nothing = True;
-# if defined(VGP_x86_darwin) && (DARWIN_VERS == DARWIN_10_7 || DARWIN_VERS == DARWIN_10_8)
+# if defined(VGP_x86_darwin) && (DARWIN_VERS >= DARWIN_10_7)
do_nothing = False;
# endif
if (do_nothing /* wrong platform */)
diff --git a/coregrind/m_main.c b/coregrind/m_main.c
index 35c11e1..c1cc2c1 100644
--- a/coregrind/m_main.c
+++ b/coregrind/m_main.c
@@ -1347,9 +1347,9 @@ static void print_preamble ( Bool logging_to_fd,
else if (VG_(clo_verbosity) > 0)
VG_(umsg)("\n");
-# if defined(VGO_darwin) && DARWIN_VERS == DARWIN_10_8
+# if defined(VGO_darwin) && DARWIN_VERS >= DARWIN_10_8
/* Uh, this doesn't play nice with XML output. */
- umsg_or_xml( "WARNING: Support on MacOS 10.8 is experimental and mostly broken.\n");
+ umsg_or_xml( "WARNING: Support on MacOS 10.8/10.9 is experimental and mostly broken.\n");
umsg_or_xml( "WARNING: Expect incorrect results, assertions and crashes.\n");
umsg_or_xml( "WARNING: In particular, Memcheck on 32-bit programs will fail to\n");
umsg_or_xml( "WARNING: detect any errors associated with heap-allocated data.\n");
diff --git a/coregrind/m_syswrap/priv_syswrap-darwin.h b/coregrind/m_syswrap/priv_syswrap-darwin.h
index c3dba59..9a1fa80 100644
--- a/coregrind/m_syswrap/priv_syswrap-darwin.h
+++ b/coregrind/m_syswrap/priv_syswrap-darwin.h
@@ -560,7 +560,7 @@ DECL_TEMPLATE(darwin, mach_msg_task);
DECL_TEMPLATE(darwin, mach_msg_thread);
// Mach traps
-#if DARWIN_VERS == DARWIN_10_8
+#if DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9
DECL_TEMPLATE(darwin, mach__10);
DECL_TEMPLATE(darwin, mach__12);
DECL_TEMPLATE(darwin, mach__14);
@@ -569,7 +569,7 @@ DECL_TEMPLATE(darwin, mach__18);
DECL_TEMPLATE(darwin, mach__19);
DECL_TEMPLATE(darwin, mach__20);
DECL_TEMPLATE(darwin, mach__21);
-#endif /* DARWIN_VERS == DARWIN_10_8 */
+#endif /* DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9 */
DECL_TEMPLATE(darwin, mach_msg_unhandled);
DECL_TEMPLATE(darwin, mach_msg);
DECL_TEMPLATE(darwin, mach_reply_port);
diff --git a/coregrind/m_syswrap/syswrap-amd64-darwin.c b/coregrind/m_syswrap/syswrap-amd64-darwin.c
index 018c4bb..396a7a5 100644
--- a/coregrind/m_syswrap/syswrap-amd64-darwin.c
+++ b/coregrind/m_syswrap/syswrap-amd64-darwin.c
@@ -448,7 +448,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem,
out just the relevant parts. Hence: */
# if DARWIN_VERS <= DARWIN_10_7
Bool is_reuse = reuse != 0;
-# elif DARWIN_VERS == DARWIN_10_8
+# elif DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9
Bool is_reuse = (reuse & 0x20000 /* == WQ_FLAG_THREAD_REUSE */) != 0;
# endif
diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c
index 2684acd..943b033 100644
--- a/coregrind/m_syswrap/syswrap-darwin.c
+++ b/coregrind/m_syswrap/syswrap-darwin.c
@@ -1065,12 +1065,17 @@ static const char *name_for_fcntl(UWord cmd) {
F(F_PREALLOCATE);
F(F_SETSIZE);
F(F_RDADVISE);
+#if DARWIN_VERS < DARWIN_10_9
F(F_READBOOTSTRAP);
F(F_WRITEBOOTSTRAP);
+#endif
F(F_LOG2PHYS);
F(F_GETPATH);
F(F_PATHPKG_CHECK);
- F(F_ADDSIGS);
+ F(F_ADDSIGS);
+#if DARWIN_VERS >= DARWIN_10_9
+ F(F_ADDFILESIGS);
+#endif
default:
return "UNKNOWN";
}
@@ -1167,6 +1172,7 @@ PRE(fcntl)
}
break;
+#if DARWIN_VERS < DARWIN_10_9
// struct fbootstraptransfer
case VKI_F_READBOOTSTRAP:
case VKI_F_WRITEBOOTSTRAP:
@@ -1177,6 +1183,7 @@ PRE(fcntl)
PRE_MEM_READ( "fcntl(F_READ/WRITEBOOTSTRAP, bootstrap)",
ARG3, sizeof(struct vki_fbootstraptransfer) );
break;
+#endif
// struct log2phys (out)
case VKI_F_LOG2PHYS:
@@ -1227,6 +1234,21 @@ PRE(fcntl)
}
break;
+ case VKI_F_ADDFILESIGS: /* Add signature from same file (used by dyld for shared libs) */
+ PRINT("fcntl ( %ld, %s )", ARG1, name_for_fcntl(ARG2));
+ PRE_REG_READ3(long, "fcntl",
+ unsigned int, fd, unsigned int, cmd,
+ vki_fsignatures_t *, sigs);
+
+ {
+ vki_fsignatures_t *fsigs = (vki_fsignatures_t*)ARG3;
+ PRE_FIELD_READ( "fcntl(F_ADDFILESIGS, fsigs->fs_blob_start)",
+ fsigs->fs_blob_start);
+ PRE_FIELD_READ( "fcntl(F_ADDFILESIGS, fsigs->fs_blob_size)",
+ fsigs->fs_blob_size);
+ }
+ break;
+
default:
PRINT("fcntl ( %ld, %ld [??] )", ARG1, ARG2);
VG_(printf)("UNKNOWN fcntl %ld!", ARG2);
@@ -7908,6 +7930,13 @@ PRE(mach__14)
PRINT("mach__14(FIXME,ARGUMENTS_UNKNOWN)");
}
+#if DARWIN_VERS >= DARWIN_10_9
+PRE(mach__15)
+{
+ PRINT("mach__15(FIXME,ARGUMENTS_UNKNOWN)");
+}
+#endif /* DARWIN_VERS >= DARWIN_10_9 */
+
PRE(mach__16)
{
PRINT("mach__16(FIXME,ARGUMENTS_UNKNOWN)");
@@ -7948,6 +7977,13 @@ PRE(mach__23)
PRINT("mach__23(FIXME,ARGUMENTS_UNKNOWN)");
}
+#if DARWIN_VERS >= DARWIN_10_9
+PRE(mach__24)
+{
+ PRINT("mach__24(FIXME,ARGUMENTS_UNKNOWN)");
+}
+#endif /* DARWIN_VERS >= DARWIN_10_9 */
+
PRE(iopolicysys)
{
PRINT("iopolicysys(FIXME)(0x%lx, 0x%lx, 0x%lx)", ARG1, ARG2, ARG3);
@@ -8489,11 +8525,16 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
# if DARWIN_VERS >= DARWIN_10_8
MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(14), mach__14),
-# else
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(14)),
# endif
+# if DARWIN_VERS >= DARWIN_10_9
+ MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(15), mach__15),
+# endif
+
+# if DARWIN_VERS < DARWIN_10_8
+ _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(14)),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(15)),
+# endif
# if DARWIN_VERS >= DARWIN_10_8
MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(16), mach__16),
@@ -8504,6 +8545,7 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(21), mach__21),
MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(22), mach__22),
MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(23), mach__23),
+ MACX_(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(24), mach__24),
# else
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(16)),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(17)),
@@ -8513,9 +8555,9 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(21)),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(22)),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(23)),
+ _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(24)),
# endif
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(24)),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(25)),
MACXY(__NR_mach_reply_port, mach_reply_port),
MACXY(__NR_thread_self_trap, mach_thread_self),
diff --git a/coregrind/m_ume/macho.c b/coregrind/m_ume/macho.c
index 96f1525..f79a561 100644
--- a/coregrind/m_ume/macho.c
+++ b/coregrind/m_ume/macho.c
@@ -82,7 +82,7 @@ static void check_mmap(SysRes res, Addr base, SizeT len, const HChar* who)
}
}
-#if DARWIN_VERS == DARWIN_10_8
+#if DARWIN_VERS >= DARWIN_10_8
static void check_mmap_float(SysRes res, SizeT len, const HChar* who)
{
if (sr_isError(res)) {
@@ -386,7 +386,7 @@ load_unixthread(vki_uint8_t **out_stack_start, vki_uint8_t **out_stack_end,
This is a really nasty hack -- allocates 64M+stack size, then
deallocates the 64M, to guarantee that the stack is at least 64M
above zero. */
-#if DARWIN_VERS == DARWIN_10_8
+#if DARWIN_VERS >= DARWIN_10_8
static int
handle_lcmain ( vki_uint8_t **out_stack_start,
vki_uint8_t **out_stack_end,
@@ -416,7 +416,7 @@ handle_lcmain ( vki_uint8_t **out_stack_start,
return 0;
}
-#endif /* DARWIN_VERS == DARWIN_10_8 */
+#endif /* DARWIN_VERS >= DARWIN_10_8 */
@@ -558,7 +558,7 @@ load_thin_file(int fd, vki_off_t offset, vki_off_t size, unsigned long filetype,
switch (lc->cmd) {
-#if DARWIN_VERS == DARWIN_10_8
+#if DARWIN_VERS >= DARWIN_10_8
case LC_MAIN: { /* New in 10.8 */
struct entry_point_command* epcmd
= (struct entry_point_command*)lc;
diff --git a/darwin13.supp b/darwin13.supp
new file mode 100644
index 0000000..3f2b828
--- /dev/null
+++ b/darwin13.supp
@@ -0,0 +1,179 @@
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: possible
+ fun:malloc_zone_?alloc
+ ...
+ fun:_read_images
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: definite
+ fun:?alloc
+ ...
+ fun:_ZN4dyld24initializeMainExecutableEv
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: definite
+ fun:malloc_zone_?alloc
+ fun:recursive_mutex_init
+ fun:_objc_init
+ fun:_os_object_init
+ fun:libSystem_initializer
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:malloc_zone_?alloc
+ ...
+ fun:dyld_register_image_state_change_handler
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:?alloc
+ ...
+ fun:dyld_register_image_state_change_handler
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:malloc_zone_?alloc
+ ...
+ fun:map_images_nolock
+ fun:map_images
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: possible
+ fun:malloc_zone_?alloc
+ ...
+ fun:map_images_nolock
+ fun:map_images
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: indirect
+ fun:?alloc
+ ...
+ fun:libSystem_initializer
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:malloc_zone_?alloc
+ ...
+ fun:libSystem_initializer
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ match-leak-kinds: reachable
+ fun:?alloc
+ ...
+ fun:libSystem_initializer
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr1
+ ...
+ fun:libSystem_initializer
+ ...
+ fun:_dyld_start
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr4
+ ...
+ fun:libSystem_initializer
+ ...
+ fun:_dyld_start
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr8
+ ...
+ fun:libSystem_initializer
+ ...
+ fun:_dyld_start
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr8
+ ...
+ fun:libSystem_initializer
+ ...
+ fun:_ZN4dyld24initializeMainExecutableEv
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr16
+ ...
+ fun:dyld_register_image_state_change_handler
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ fun:_platform_memchr
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr16
+ obj:/usr/lib/system/libsystem_platform.dylib
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Addr16
+ obj:/usr/lib/system/libsystem_c.dylib
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ obj:/usr/lib/system/libsystem_c.dylib
+ ...
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ obj:/usr/lib/system/libsystem_platform.dylib
+ ...
+}
diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h
index 4f5f753..0a679e1 100644
--- a/include/pub_tool_redir.h
+++ b/include/pub_tool_redir.h
@@ -246,9 +246,12 @@
#elif defined(VGO_darwin) && (DARWIN_VERS <= DARWIN_10_6)
# define VG_Z_LIBC_SONAME libSystemZdZaZddylib // libSystem.*.dylib
-#elif defined(VGO_darwin) && (DARWIN_VERS >= DARWIN_10_7)
+#elif defined(VGO_darwin) && (DARWIN_VERS == DARWIN_10_7 || DARWIN_VERS == DARWIN_10_8)
# define VG_Z_LIBC_SONAME libsystemZucZaZddylib // libsystem_c*.dylib
+#elif defined(VGO_darwin) && (DARWIN_VERS >= DARWIN_10_9)
+# define VG_Z_LIBC_SONAME libsystemZumallocZddylib // libsystem_malloc.dylib
+
#else
# error "Unknown platform"
diff --git a/include/vki/vki-darwin.h b/include/vki/vki-darwin.h
index 34b0da7..12c6743 100644
--- a/include/vki/vki-darwin.h
+++ b/include/vki/vki-darwin.h
@@ -290,6 +290,9 @@ typedef uint32_t vki_u32;
#define VKI_F_LOG2PHYS F_LOG2PHYS
#define VKI_F_GETPATH F_GETPATH
#define VKI_F_ADDSIGS F_ADDSIGS
+#if DARWIN_VERS >= DARWIN_10_9
+#define VKI_F_ADDFILESIGS F_ADDFILESIGS
+#endif
#define VKI_F_FULLFSYNC F_FULLFSYNC
#define VKI_F_PATHPKG_CHECK F_PATHPKG_CHECK
#define VKI_F_FREEZE_FS F_FREEZE_FS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment