Add initial support for Mac OS X 10.7 (Lion). Tracked by bug #275168.
* configure.in support
* new supp file darwin11.supp
* comment out many intercepts in mc_replace_strmem.c and
vg_replace_malloc.c that are apparently unnecessary for Darwin
* add minimal handling for the following new syscalls and mach traps:
mach_port_set_context
task_get_exception_ports
getaudit_addr
psynch_mutexwait
psynch_mutexdrop
psynch_cvbroad
psynch_cvsignal
psynch_cvwait
psynch_rw_rdlock
psynch_rw_wrlock
psynch_rw_unlock
psynch_cvclrprepost
* wqthread_hijack on amd64-darwin: deal with
tst->os_state.pthread having an apparently different offset,
which caused an assertion failure
* m_debuginfo: for 32 bit processes on Lion, use the DebugInfoFSM
cleanup added in r12041/12042 to handle apparently new dyld
behaviour, which is to map text areas r-- first and only
vm_protect them later to r-x.
The following cleanups remain to be done
* remove apparently pointless, commented out wrapper macro
invokations in mc_replace_strmem.c, eg
//MEMMOVE(VG_Z_DYLD, memmove)
(or determine that they are still necessary, and uncomment)
* ditto in vg_replace_malloc.c, plus general VGO_darwin cleanups
there
* write proper syscall wrappers for
mach_port_set_context
task_get_exception_ports
getaudit_addr
psynch_mutexwait
psynch_mutexdrop
psynch_cvbroad
psynch_cvsignal
psynch_cvwait
psynch_rw_rdlock
psynch_rw_wrlock
psynch_rw_unlock
psynch_cvclrprepost
These are currently just no-ops and may be causing Memcheck to
report false undef-value errors
* figure out why it doesn't work properly unless built with gcc-4.2 on
Lion.
gcc-4.2 is the "normal" gcc (i686-apple-darwin11-gcc-4.2.1). Plain
gcc is the hybrid gcc-front-end clang-back-end thing
(i686-apple-darwin11-llvm-gcc-4.2). Whereas on Snow Leopard, plain
gcc is the normal gcc.
The symptoms of the failure are that wqthread_hijack in
syswrap-amd64-linux.c hits this /*NOTREACHED*/ vg_assert(0); right
at the end (you need a pretty complex threaded app to trigger this),
which makes me think that either ML_(wqthread_continue_NORETURN) or
call_on_new_stack_0_1 do return, which they are not expected to.
* figure out if some of the uninitialised value errors reported in
system libraries on are caused by Memcheck being confused by LLVM
generated code, as per bug #242137
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12043 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/Makefile.am b/Makefile.am
index 8526048..5966e61 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@
exp-sgcheck.supp \
darwin9.supp darwin9-drd.supp \
darwin10.supp darwin10-drd.supp \
+ darwin11.supp \
bionic.supp
DEFAULT_SUPP_FILES = @DEFAULT_SUPP@
@@ -116,4 +117,5 @@
clean-local:
rm -rf $(inplacedir)
-
+# Need config.h in the installed tree, since some files depend on it
+pkginclude_HEADERS = config.h
diff --git a/configure.in b/configure.in
index 334e3f4..1c6560d 100644
--- a/configure.in
+++ b/configure.in
@@ -246,11 +246,19 @@
# Nb: for Darwin we set DEFAULT_SUPP here. That's because Darwin
# has only one relevant version, the OS version. The `uname` check
# is a good way to get that version (i.e. "Darwin 9.6.0" is Mac OS
- # X 10.5.6, and "Darwin 10.x" is Mac OS X 10.6.x Snow Leopard),
+ # X 10.5.6, and "Darwin 10.x" is Mac OS X 10.6.x Snow Leopard,
+ # and possibly "Darwin 11.x" is Mac OS X 10.7.x Lion),
# and we don't know of an macros similar to __GLIBC__ to get that info.
#
# XXX: `uname -r` won't do the right thing for cross-compiles, but
# that's not a problem yet.
+ #
+ # jseward 21 Sept 2011: I seriously doubt whether V 3.7.0 will work
+ # on OS X 10.5.x; I haven't tested yet, and only plan to test 3.7.0
+ # on 10.6.8 and 10.7.1. Although tempted to delete the configure
+ # time support for 10.5 (the 9.* pattern just below), I'll leave it
+ # in for now, just in case anybody wants to give it a try. But I'm
+ # assuming that 3.7.0 is a Snow Leopard and Lion-only release.
case "${kernel}" in
9.*)
AC_MSG_RESULT([Darwin 9.x (${kernel}) / Mac OS X 10.5 Leopard])
@@ -264,9 +272,16 @@
DEFAULT_SUPP="darwin10.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
;;
- *)
+ 11.*)
+ AC_MSG_RESULT([Darwin 11.x (${kernel}) / Mac OS X 10.7 Lion])
+ AC_DEFINE([DARWIN_VERS], DARWIN_10_7, [Darwin / Mac OS X version])
+ # FIXME: change these to xx11.supp
+ DEFAULT_SUPP="darwin11.supp ${DEFAULT_SUPP}"
+ DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
+ ;;
+ *)
AC_MSG_RESULT([unsupported (${kernel})])
- AC_MSG_ERROR([Valgrind works on Darwin 9.x and 10.x (Mac OS X 10.5 and 10.6)])
+ AC_MSG_ERROR([Valgrind works on Darwin 10.x and 11.x (Mac OS X 10.6/7)])
;;
esac
;;
diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c
index 6a9c177..97373e8 100644
--- a/coregrind/m_debuginfo/debuginfo.c
+++ b/coregrind/m_debuginfo/debuginfo.c
@@ -571,10 +571,87 @@
#if defined(VGO_linux) || defined(VGO_darwin)
/* The debug info system is driven by notifications that a text
- segment has been mapped in, or unmapped. When that happens it
- tries to acquire/discard whatever info is available for the
- corresponding object. This section contains the notification
- handlers. */
+ segment has been mapped in, or unmapped, or when sections change
+ permission. It's all a bit kludgey and basically means watching
+ syscalls, trying to second-guess when the system's dynamic linker
+ is done with mapping in a new object for execution. This is all
+ tracked using the DebugInfoFSM struct for the object. Anyway, once
+ we finally decide we've got to an accept state, this section then
+ will acquire whatever info is available for the corresponding
+ object. This section contains the notification handlers, which
+ update the FSM and determine when an accept state has been reached.
+*/
+
+/* When the sequence of observations causes a DebugInfoFSM to move
+ into the accept state, call here to actually get the debuginfo read
+ in. Returns a ULong whose purpose is described in comments
+ preceding VG_(di_notify_mmap) just below.
+*/
+static ULong di_notify_ACHIEVE_ACCEPT_STATE ( struct _DebugInfo* di )
+{
+ ULong di_handle;
+ Bool ok;
+
+ vg_assert(di->fsm.filename);
+ TRACE_SYMTAB("\n");
+ TRACE_SYMTAB("------ start ELF OBJECT "
+ "------------------------------\n");
+ TRACE_SYMTAB("------ name = %s\n", di->fsm.filename);
+ TRACE_SYMTAB("\n");
+
+ /* We're going to read symbols and debug info for the avma
+ ranges [rx_map_avma, +rx_map_size) and [rw_map_avma,
+ +rw_map_size). First get rid of any other DebugInfos which
+ overlap either of those ranges (to avoid total confusion). */
+ discard_DebugInfos_which_overlap_with( di );
+
+ /* .. and acquire new info. */
+# if defined(VGO_linux)
+ ok = ML_(read_elf_debug_info)( di );
+# elif defined(VGO_darwin)
+ ok = ML_(read_macho_debug_info)( di );
+# else
+# error "unknown OS"
+# endif
+
+ if (ok) {
+
+ TRACE_SYMTAB("\n------ Canonicalising the "
+ "acquired info ------\n");
+ /* invalidate the CFI unwind cache. */
+ cfsi_cache__invalidate();
+ /* prepare read data for use */
+ ML_(canonicaliseTables)( di );
+ /* notify m_redir about it */
+ TRACE_SYMTAB("\n------ Notifying m_redir ------\n");
+ VG_(redir_notify_new_DebugInfo)( di );
+ /* Note that we succeeded */
+ di->have_dinfo = True;
+ tl_assert(di->handle > 0);
+ di_handle = di->handle;
+ /* Check invariants listed in
+ Comment_on_IMPORTANT_REPRESENTATIONAL_INVARIANTS in
+ priv_storage.h. */
+ check_CFSI_related_invariants(di);
+
+ } else {
+ TRACE_SYMTAB("\n------ ELF reading failed ------\n");
+ /* Something went wrong (eg. bad ELF file). Should we delete
+ this DebugInfo? No - it contains info on the rw/rx
+ mappings, at least. */
+ di_handle = 0;
+ vg_assert(di->have_dinfo == False);
+ }
+
+ TRACE_SYMTAB("\n");
+ TRACE_SYMTAB("------ name = %s\n", di->fsm.filename);
+ TRACE_SYMTAB("------ end ELF OBJECT "
+ "------------------------------\n");
+ TRACE_SYMTAB("\n");
+
+ return di_handle;
+}
+
/* Notify the debuginfo system about a new mapping. This is the way
new debug information gets loaded. If allow_SkFileV is True, it
@@ -594,9 +671,8 @@
{
NSegment const * seg;
HChar* filename;
- Bool ok, is_rx_map, is_rw_map;
+ Bool is_rx_map, is_rw_map, is_ro_map;
DebugInfo* di;
- ULong di_handle;
SysRes fd;
Int nread, oflags;
HChar buf1k[1024];
@@ -707,6 +783,8 @@
*/
is_rx_map = False;
is_rw_map = False;
+ is_ro_map = False;
+
# if defined(VGA_x86) || defined(VGA_ppc32)
is_rx_map = seg->hasR && seg->hasX;
is_rw_map = seg->hasR && seg->hasW;
@@ -720,12 +798,16 @@
# error "Unknown platform"
# endif
+# if defined(VGP_x86_darwin) && DARWIN_VERS == DARWIN_10_7
+ is_ro_map = seg->hasR && !seg->hasW && !seg->hasX;
+# endif
+
if (debug)
VG_(printf)("di_notify_mmap-3: is_rx_map %d, is_rw_map %d\n",
(Int)is_rx_map, (Int)is_rw_map);
- /* If it is neither text-ish nor data-ish, we're not interested. */
- if (!(is_rx_map || is_rw_map))
+ /* Ignore mappings with permissions we can't possibly be interested in. */
+ if (!(is_rx_map || is_rw_map || is_ro_map))
return 0;
/* Peer at the first few bytes of the file, to see if it is an ELF */
@@ -799,71 +881,30 @@
}
}
- /* If we don't have an rx and rw mapping, or if we already have
- debuginfo for this mapping for whatever reason, go no
- further. */
- if ( ! (di->fsm.have_rx_map && di->fsm.have_rw_map && !di->have_dinfo) )
- return 0;
-
- /* Ok, so, finally, let's try to read the debuginfo. */
- vg_assert(di->fsm.filename);
- TRACE_SYMTAB("\n");
- TRACE_SYMTAB("------ start ELF OBJECT "
- "------------------------------\n");
- TRACE_SYMTAB("------ name = %s\n", di->fsm.filename);
- TRACE_SYMTAB("\n");
-
- /* We're going to read symbols and debug info for the avma
- ranges [rx_map_avma, +rx_map_size) and [rw_map_avma,
- +rw_map_size). First get rid of any other DebugInfos which
- overlap either of those ranges (to avoid total confusion). */
- discard_DebugInfos_which_overlap_with( di );
-
- /* .. and acquire new info. */
-# if defined(VGO_linux)
- ok = ML_(read_elf_debug_info)( di );
-# elif defined(VGO_darwin)
- ok = ML_(read_macho_debug_info)( di );
-# else
-# error "unknown OS"
-# endif
-
- if (ok) {
-
- TRACE_SYMTAB("\n------ Canonicalising the "
- "acquired info ------\n");
- /* invalidate the CFI unwind cache. */
- cfsi_cache__invalidate();
- /* prepare read data for use */
- ML_(canonicaliseTables)( di );
- /* notify m_redir about it */
- TRACE_SYMTAB("\n------ Notifying m_redir ------\n");
- VG_(redir_notify_new_DebugInfo)( di );
- /* Note that we succeeded */
- di->have_dinfo = True;
- tl_assert(di->handle > 0);
- di_handle = di->handle;
- /* Check invariants listed in
- Comment_on_IMPORTANT_REPRESENTATIONAL_INVARIANTS in
- priv_storage.h. */
- check_CFSI_related_invariants(di);
-
- } else {
- TRACE_SYMTAB("\n------ ELF reading failed ------\n");
- /* Something went wrong (eg. bad ELF file). Should we delete
- this DebugInfo? No - it contains info on the rw/rx
- mappings, at least. */
- di_handle = 0;
- vg_assert(di->have_dinfo == False);
+ if (is_ro_map) {
+ /* We have a r-- mapping. Note the details (OSX 10.7, 32-bit only) */
+ if (!di->fsm.have_ro_map) {
+ di->fsm.have_ro_map = True;
+ di->fsm.ro_map_avma = a;
+ di->fsm.ro_map_size = seg->end + 1 - seg->start;
+ di->fsm.ro_map_foff = seg->offset;
+ } else {
+ /* FIXME: complain about a second r-- mapping */
+ }
}
- TRACE_SYMTAB("\n");
- TRACE_SYMTAB("------ name = %s\n", di->fsm.filename);
- TRACE_SYMTAB("------ end ELF OBJECT "
- "------------------------------\n");
- TRACE_SYMTAB("\n");
-
- return di_handle;
+ /* So, finally, are we in an accept state? */
+ if (di->fsm.have_rx_map && di->fsm.have_rw_map && !di->have_dinfo) {
+ /* Ok, so, finally, we found what we need, and we haven't
+ already read debuginfo for this object. So let's do so now.
+ Yee-ha! */
+ return di_notify_ACHIEVE_ACCEPT_STATE ( di );
+ } else {
+ /* If we don't have an rx and rw mapping, or if we already have
+ debuginfo for this mapping for whatever reason, go no
+ further. */
+ return 0;
+ }
}
@@ -896,6 +937,72 @@
}
}
+
+/* This is a MacOSX 10.7 32-bit only special. See comments on the
+ declaration of struct _DebugInfoFSM for details. */
+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
+ do_nothing = False;
+# endif
+ if (do_nothing /* wrong platform */)
+ return;
+
+ Bool r_ok = toBool(prot & VKI_PROT_READ);
+ Bool w_ok = toBool(prot & VKI_PROT_WRITE);
+ Bool x_ok = toBool(prot & VKI_PROT_EXEC);
+ if (! (r_ok && !w_ok && x_ok))
+ return; /* not an upgrade to r-x */
+
+ /* Find a DebugInfo containing a FSM that has [a, +len) previously
+ observed as a r-- mapping, plus some other rw- mapping. If such
+ is found, conclude we're in an accept state and read debuginfo
+ accordingly. */
+ DebugInfo* di;
+ for (di = debugInfo_list; di; di = di->next) {
+ vg_assert(di->fsm.filename);
+ if (di->have_dinfo)
+ continue; /* already have debuginfo for this object */
+ if (!di->fsm.have_ro_map)
+ continue; /* need to have a r-- mapping for this object */
+ if (di->fsm.have_rx_map)
+ continue; /* rx- mapping already exists */
+ if (!di->fsm.have_rw_map)
+ continue; /* need to have a rw- mapping */
+ if (di->fsm.ro_map_avma != a || di->fsm.ro_map_size != len)
+ continue; /* this isn't an upgrade of the r-- mapping */
+ /* looks like we're in luck! */
+ break;
+ }
+ if (di == NULL)
+ return; /* didn't find anything */
+
+ /* Do the upgrade. Copy the RO map info into the RX map info and
+ pretend we never saw the RO map at all. */
+ vg_assert(di->fsm.have_rw_map);
+ vg_assert(di->fsm.have_ro_map);
+ vg_assert(!di->fsm.have_rx_map);
+
+ di->fsm.have_rx_map = True;
+ di->fsm.rx_map_avma = di->fsm.ro_map_avma;
+ di->fsm.rx_map_size = di->fsm.ro_map_size;
+ di->fsm.rx_map_foff = di->fsm.ro_map_foff;
+
+ di->fsm.have_ro_map = False;
+ di->fsm.ro_map_avma = 0;
+ di->fsm.ro_map_size = 0;
+ di->fsm.ro_map_foff = 0;
+
+ /* And since we're now in an accept state, read debuginfo. Finally. */
+ ULong di_handle __attribute__((unused))
+ = di_notify_ACHIEVE_ACCEPT_STATE( di );
+ /* di_handle is ignored. That's not a problem per se -- it just
+ means nobody will ever be able to refer to this debuginfo by
+ handle since nobody will know what the handle value is. */
+}
+
+
/*--------- PDB (windows debug info) reading --------- */
/* this should really return ULong, as per VG_(di_notify_mmap). */
diff --git a/coregrind/m_debuginfo/priv_storage.h b/coregrind/m_debuginfo/priv_storage.h
index fa57d99..740e6f7 100644
--- a/coregrind/m_debuginfo/priv_storage.h
+++ b/coregrind/m_debuginfo/priv_storage.h
@@ -402,7 +402,8 @@
reaches an accept state, signals that we should now read debug info
from the object into the associated struct _DebugInfo. The accept
state is arrived at when have_rx_map and have_rw_map both become
- true.
+ true. The initial state is one in which we have no observations,
+ so have_rx_map and have_rw_map are both false.
This is all rather ad-hoc; for example it has no way to record more
than one rw or rx mapping for a given object, not because such
@@ -411,9 +412,25 @@
read debug info. It may be that in future we need to track more
state in order to make the decision, so this struct would then get
expanded.
+
+ The normal sequence of events is one of
+
+ start --> r-x mapping --> rw- mapping --> accept
+ start --> rw- mapping --> r-x mapping --> accept
+
+ that is, take the first r-x and rw- mapping we see, and we're done.
+
+ On MacOSX 10.7, 32-bit, there appears to be a new variant:
+
+ start --> r-- mapping --> rw- mapping
+ --> upgrade r-- mapping to r-x mapping --> accept
+
+ where the upgrade is done by a call to vm_protect. Hence we
+ need to also track this possibility.
*/
struct _DebugInfoFSM
{
+ /* --- all targets --- */
UChar* filename; /* in mallocville (VG_AR_DINFO) */
Bool have_rx_map; /* did we see a r?x mapping yet for the file? */
@@ -426,6 +443,13 @@
Addr rw_map_avma; /* ditto, for the rw? mapping we believe is the */
SizeT rw_map_size; /* .data segment mapping */
OffT rw_map_foff;
+
+ /* --- OSX 10.7, 32-bit only --- */
+ Bool have_ro_map; /* did we see a r-- mapping yet for the file? */
+
+ Addr ro_map_avma; /* file offset, length, avma for said mapping */
+ SizeT ro_map_size;
+ OffT ro_map_foff;
};
diff --git a/coregrind/m_replacemalloc/vg_replace_malloc.c b/coregrind/m_replacemalloc/vg_replace_malloc.c
index f75bc7c..0ee96d8 100644
--- a/coregrind/m_replacemalloc/vg_replace_malloc.c
+++ b/coregrind/m_replacemalloc/vg_replace_malloc.c
@@ -263,7 +263,6 @@
ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc);
#elif defined(VGO_darwin)
- ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, malloc, malloc);
ALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc, malloc);
ZONEALLOC_or_NULL(VG_Z_LIBC_SONAME, malloc_zone_malloc, malloc);
@@ -292,13 +291,13 @@
#elif defined(VGO_darwin)
// operator new(unsigned int), GNU mangling
#if VG_WORDSIZE == 4
- ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj, __builtin_new);
- ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znwj, __builtin_new);
+ //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwj, __builtin_new);
+ //ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znwj, __builtin_new);
#endif
// operator new(unsigned long), GNU mangling
#if 1 // FIXME: is this right?
- ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm, __builtin_new);
- ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znwm, __builtin_new);
+ //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znwm, __builtin_new);
+ //ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znwm, __builtin_new);
#endif
#endif
@@ -321,13 +320,13 @@
#elif defined(VGO_darwin)
// operator new(unsigned, std::nothrow_t const&), GNU mangling
#if VG_WORDSIZE == 4
- ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t, __builtin_new);
- ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnwjRKSt9nothrow_t, __builtin_new);
+ //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwjRKSt9nothrow_t, __builtin_new);
+ //ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnwjRKSt9nothrow_t, __builtin_new);
#endif
// operator new(unsigned long, std::nothrow_t const&), GNU mangling
#if 1 // FIXME: is this right?
- ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t, __builtin_new);
- ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnwmRKSt9nothrow_t, __builtin_new);
+ //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnwmRKSt9nothrow_t, __builtin_new);
+ //ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnwmRKSt9nothrow_t, __builtin_new);
#endif
#endif
@@ -353,13 +352,13 @@
#elif defined(VGO_darwin)
// operator new[](unsigned int), GNU mangling
#if VG_WORDSIZE == 4
- ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj, __builtin_vec_new );
- ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znaj, __builtin_vec_new );
+ //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znaj, __builtin_vec_new );
+ //ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znaj, __builtin_vec_new );
#endif
// operator new[](unsigned long), GNU mangling
#if 1 // FIXME: is this right?
- ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam, __builtin_vec_new );
- ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znam, __builtin_vec_new );
+ //ALLOC_or_BOMB(VG_Z_LIBSTDCXX_SONAME, _Znam, __builtin_vec_new );
+ //ALLOC_or_BOMB(VG_Z_LIBC_SONAME, _Znam, __builtin_vec_new );
#endif
#endif
@@ -382,13 +381,13 @@
#elif defined(VGO_darwin)
// operator new[](unsigned, std::nothrow_t const&), GNU mangling
#if VG_WORDSIZE == 4
- ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
- ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
+ //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
+ //ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnajRKSt9nothrow_t, __builtin_vec_new );
#endif
// operator new[](unsigned long, std::nothrow_t const&), GNU mangling
#if 1 // FIXME: is this right?
- ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
- ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
+ //ALLOC_or_NULL(VG_Z_LIBSTDCXX_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
+ //ALLOC_or_NULL(VG_Z_LIBC_SONAME, _ZnamRKSt9nothrow_t, __builtin_vec_new );
#endif
#endif
@@ -405,7 +404,7 @@
void VG_REPLACE_FUNCTION_EZU(10040,soname,fnname) (void *zone, void *p) \
{ \
if (!init_done) init(); \
- MALLOC_TRACE(#vg_replacement "(%p, %p)\n", zone, p ); \
+ MALLOC_TRACE(#fnname "(%p, %p)\n", zone, p ); \
if (p == NULL) \
return; \
(void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
@@ -417,19 +416,17 @@
void VG_REPLACE_FUNCTION_EZU(10050,soname,fnname) (void *p) \
{ \
if (!init_done) init(); \
- MALLOC_TRACE(#vg_replacement "(%p)\n", p ); \
+ MALLOC_TRACE(#fnname "(%p)\n", p ); \
if (p == NULL) \
return; \
(void)VALGRIND_NON_SIMD_CALL1( info.tl_##vg_replacement, p ); \
}
-// free
#if defined(VGO_linux)
FREE(VG_Z_LIBSTDCXX_SONAME, free, free );
FREE(VG_Z_LIBC_SONAME, free, free );
#elif defined(VGO_darwin)
- FREE(VG_Z_LIBSTDCXX_SONAME, free, free );
FREE(VG_Z_LIBC_SONAME, free, free );
ZONEFREE(VG_Z_LIBC_SONAME, malloc_zone_free, free );
@@ -444,8 +441,8 @@
FREE(VG_Z_LIBC_SONAME, cfree, free );
#elif defined(VGO_darwin)
- FREE(VG_Z_LIBSTDCXX_SONAME, cfree, free );
- FREE(VG_Z_LIBC_SONAME, cfree, free );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, cfree, free );
+ //FREE(VG_Z_LIBC_SONAME, cfree, free );
#endif
@@ -462,8 +459,8 @@
#elif defined(VGO_darwin)
// operator delete(void*), GNU mangling
- FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete );
- FREE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPv, __builtin_delete );
+ //FREE(VG_Z_LIBC_SONAME, _ZdlPv, __builtin_delete );
#endif
@@ -477,8 +474,8 @@
#elif defined(VGO_darwin)
// operator delete(void*, std::nothrow_t const&), GNU mangling
- FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete );
- FREE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete );
+ //FREE(VG_Z_LIBC_SONAME, _ZdlPvRKSt9nothrow_t, __builtin_delete );
#endif
@@ -495,11 +492,11 @@
#elif defined(VGO_darwin)
// operator delete[](void*), not mangled (for gcc 2.96)
- FREE(VG_Z_LIBSTDCXX_SONAME, __builtin_vec_delete, __builtin_vec_delete );
- FREE(VG_Z_LIBC_SONAME, __builtin_vec_delete, __builtin_vec_delete );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, __builtin_vec_delete, __builtin_vec_delete );
+ //FREE(VG_Z_LIBC_SONAME, __builtin_vec_delete, __builtin_vec_delete );
// operator delete[](void*), GNU mangling
- FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete );
- FREE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPv, __builtin_vec_delete );
+ //FREE(VG_Z_LIBC_SONAME, _ZdaPv, __builtin_vec_delete );
#endif
@@ -513,8 +510,8 @@
#elif defined(VGO_darwin)
// operator delete[](void*, std::nothrow_t const&), GNU mangling
- FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
- FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
+ //FREE(VG_Z_LIBSTDCXX_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
+ //FREE(VG_Z_LIBC_SONAME, _ZdaPvRKSt9nothrow_t, __builtin_vec_delete );
#endif
@@ -531,7 +528,7 @@
void* v; \
\
if (!init_done) init(); \
- MALLOC_TRACE("calloc(%p, %llu,%llu)", zone, (ULong)nmemb, (ULong)size ); \
+ MALLOC_TRACE("zone_calloc(%p, %llu,%llu)", zone, (ULong)nmemb, (ULong)size ); \
\
v = (void*)VALGRIND_NON_SIMD_CALL2( info.tl_calloc, nmemb, size ); \
MALLOC_TRACE(" = %p\n", v ); \
@@ -587,7 +584,7 @@
void* v; \
\
if (!init_done) init(); \
- MALLOC_TRACE("realloc(%p,%p,%llu)", zone, ptrV, (ULong)new_size ); \
+ MALLOC_TRACE("zone_realloc(%p,%p,%llu)", zone, ptrV, (ULong)new_size ); \
\
if (ptrV == NULL) \
/* We need to call a malloc-like function; so let's use \
@@ -653,7 +650,7 @@
void* v; \
\
if (!init_done) init(); \
- MALLOC_TRACE("memalign(%p, al %llu, size %llu)", \
+ MALLOC_TRACE("zone_memalign(%p, al %llu, size %llu)", \
zone, (ULong)alignment, (ULong)n ); \
\
/* Round up to minimum alignment if necessary. */ \
@@ -759,7 +756,7 @@
MALLOPT(VG_Z_LIBC_SONAME, mallopt);
#elif defined(VGO_darwin)
- MALLOPT(VG_Z_LIBC_SONAME, mallopt);
+ //MALLOPT(VG_Z_LIBC_SONAME, mallopt);
#endif
@@ -801,7 +798,7 @@
MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
#elif defined(VGO_darwin)
- MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
+ //MALLOC_TRIM(VG_Z_LIBC_SONAME, malloc_trim);
#endif
@@ -838,7 +835,7 @@
POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
#elif defined(VGO_darwin)
- POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
+ //POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
#endif
@@ -868,7 +865,7 @@
MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
#elif defined(VGO_darwin)
- MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
+ //MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_usable_size);
MALLOC_USABLE_SIZE(VG_Z_LIBC_SONAME, malloc_size);
#endif
@@ -918,7 +915,7 @@
MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
#elif defined(VGO_darwin)
- MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
+ //MALLOC_STATS(VG_Z_LIBC_SONAME, malloc_stats);
#endif
@@ -944,34 +941,36 @@
MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
#elif defined(VGO_darwin)
- MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
+ //MALLINFO(VG_Z_LIBC_SONAME, mallinfo);
#endif
+/*------------------ Darwin zone stuff ------------------*/
+
#if defined(VGO_darwin)
static vki_malloc_zone_t vg_default_zone = {
- NULL, // reserved
- NULL, // reserved
- NULL, // GrP fixme malloc_size
+ NULL, // reserved1
+ NULL, // reserved2
+ NULL, // GrP fixme: malloc_size
(void*)VG_REPLACE_FUNCTION_EZU(10020,VG_Z_LIBC_SONAME,malloc_zone_malloc),
(void*)VG_REPLACE_FUNCTION_EZU(10060,VG_Z_LIBC_SONAME,malloc_zone_calloc),
(void*)VG_REPLACE_FUNCTION_EZU(10130,VG_Z_LIBC_SONAME,malloc_zone_valloc),
(void*)VG_REPLACE_FUNCTION_EZU(10040,VG_Z_LIBC_SONAME,malloc_zone_free),
(void*)VG_REPLACE_FUNCTION_EZU(10080,VG_Z_LIBC_SONAME,malloc_zone_realloc),
- NULL, // GrP fixme destroy
+ NULL, // GrP fixme: destroy
"ValgrindMallocZone",
NULL, // batch_malloc
NULL, // batch_free
- NULL, // GrP fixme introspect
+ NULL, // GrP fixme: introspect
2, // version (GrP fixme 3?)
- // DDD: this field exists in Mac OS 10.6, but not 10.5.
- #if 0
- (void*)VG_REPLACE_FUNCTION_ZU(VG_Z_LIBC_SONAME, malloc_zone_memalign)
- #endif
+ NULL, /* memalign */ // DDD: this field exists in Mac OS 10.6, but not 10.5.
+ NULL, /* free_definite_size */
+ NULL, /* pressure_relief */
};
+
#define DEFAULT_ZONE(soname, fnname) \
\
void *VG_REPLACE_FUNCTION_EZU(10210,soname,fnname) ( void ); \
@@ -980,23 +979,36 @@
return &vg_default_zone; \
}
-DEFAULT_ZONE(VG_Z_LIBC_SONAME, malloc_zone_from_ptr);
DEFAULT_ZONE(VG_Z_LIBC_SONAME, malloc_default_zone);
+
+#define ZONE_FROM_PTR(soname, fnname) \
+ \
+ void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname) ( void* ptr ); \
+ void *VG_REPLACE_FUNCTION_EZU(10220,soname,fnname) ( void* ptr ) \
+ { \
+ return &vg_default_zone; \
+ }
+
+ZONE_FROM_PTR(VG_Z_LIBC_SONAME, malloc_zone_from_ptr);
+
+
// GrP fixme bypass libc's use of zone->introspect->check
#define ZONE_CHECK(soname, fnname) \
\
- int VG_REPLACE_FUNCTION_EZU(10220,soname,fnname)(void* zone); \
- int VG_REPLACE_FUNCTION_EZU(10220,soname,fnname)(void* zone) \
+ int VG_REPLACE_FUNCTION_EZU(10230,soname,fnname)(void* zone); \
+ int VG_REPLACE_FUNCTION_EZU(10230,soname,fnname)(void* zone) \
{ \
return 1; \
}
-ZONE_CHECK(VG_Z_LIBC_SONAME, malloc_zone_check);
+//ZONE_CHECK(VG_Z_LIBC_SONAME, malloc_zone_check);
#endif /* defined(VGO_darwin) */
+/*------------------ (startup related) ------------------*/
+
/* All the code in here is unused until this function is called */
__attribute__((constructor))
diff --git a/coregrind/m_syswrap/priv_syswrap-darwin.h b/coregrind/m_syswrap/priv_syswrap-darwin.h
index ec99d8b..8d058b0 100644
--- a/coregrind/m_syswrap/priv_syswrap-darwin.h
+++ b/coregrind/m_syswrap/priv_syswrap-darwin.h
@@ -358,18 +358,18 @@
// old new_system_shared_regions
// old shared_region_map_file_np
// old shared_region_make_private_np
-// NYI __pthread_mutex_destroy 301
-// NYI __pthread_mutex_init 302
-// NYI __pthread_mutex_lock 303
-// NYI __pthread_mutex_trylock 304
-// NYI __pthread_mutex_unlock 305
-// NYI __pthread_cond_init 306
-// NYI __pthread_cond_destroy 307
-// NYI __pthread_cond_broadcast 308
+DECL_TEMPLATE(darwin, psynch_mutexwait); // 301 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_mutexdrop); // 302 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_cvbroad); // 303 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_cvsignal); // 304 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_cvwait); // 305 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_rw_rdlock); // 306 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_rw_wrlock); // 307 // new in 10.7 ?
+DECL_TEMPLATE(darwin, psynch_rw_unlock); // 308 // new in 10.7 ?
// NYI __pthread_cond_signal 309
// NYI getsid 310
// NYI settid_with_pid 311
-// NYI __pthread_cond_timedwait 312
+DECL_TEMPLATE(darwin, psynch_cvclrprepost); // 312 // new in 10.7 ?
// NYI aio_fsync 313
DECL_TEMPLATE(darwin, aio_return); // 314
DECL_TEMPLATE(darwin, aio_suspend); // 315
@@ -416,7 +416,9 @@
// NYI setauid 354
// NYI getaudit 355
// NYI setaudit 356
-// NYI getaudit_addr 357
+#if DARWIN_VERS >= DARWIN_10_7
+DECL_TEMPLATE(darwin, getaudit_addr) // 357
+#endif
// NYI setaudit_addr 358
// NYI auditctl 359
DECL_TEMPLATE(darwin, bsdthread_create); // 360
@@ -491,6 +493,7 @@
// NYI audit_session_join 429
// Mach message helpers
+DECL_TEMPLATE(darwin, mach_port_set_context);
DECL_TEMPLATE(darwin, host_info);
DECL_TEMPLATE(darwin, host_page_size);
DECL_TEMPLATE(darwin, host_get_io_master);
@@ -512,6 +515,7 @@
DECL_TEMPLATE(darwin, mach_port_set_attributes);
DECL_TEMPLATE(darwin, mach_port_insert_member);
DECL_TEMPLATE(darwin, task_get_special_port);
+DECL_TEMPLATE(darwin, task_get_exception_ports);
DECL_TEMPLATE(darwin, semaphore_create);
DECL_TEMPLATE(darwin, semaphore_destroy);
DECL_TEMPLATE(darwin, mach_ports_lookup);
diff --git a/coregrind/m_syswrap/syswrap-amd64-darwin.c b/coregrind/m_syswrap/syswrap-amd64-darwin.c
index 03bad5e..20ff97d 100644
--- a/coregrind/m_syswrap/syswrap-amd64-darwin.c
+++ b/coregrind/m_syswrap/syswrap-amd64-darwin.c
@@ -30,6 +30,7 @@
#if defined(VGP_amd64_darwin)
+#include "config.h" // DARWIN_VERS
#include "pub_core_basics.h"
#include "pub_core_vki.h"
#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy
@@ -282,7 +283,7 @@
// other values stay where they are in registers
" push $0\n" // fake return address
" jmp _pthread_hijack\n"
- );
+);
@@ -372,7 +373,7 @@
// other values stay where they are in registers
" push $0\n" // fake return address
" jmp _wqthread_hijack\n"
- );
+);
/* wqthread note: The kernel may create or destroy pthreads in the
@@ -401,12 +402,26 @@
lock. */
VG_(acquire_BigLock_LL)("wqthread_hijack");
+ if (0) VG_(printf)("wqthread_hijack: self %#lx, kport %#lx, "
+ "stackaddr %#lx, workitem %#lx, reuse %d, sp %#lx\n",
+ self, kport, stackaddr, workitem, reuse, sp);
+
/* Start the thread with all signals blocked. VG_(scheduler) will
set the mask correctly when we finally get there. */
VG_(sigfillset)(&blockall);
VG_(sigprocmask)(VKI_SIG_SETMASK, &blockall, NULL);
if (reuse) {
+
+ /* For whatever reason, tst->os_state.pthread appear to have a
+ constant offset of 96 on 10.7, but zero on 10.6 and 10.5. No
+ idea why. */
+# if DARWIN_VERS <= DARWIN_10_6
+ UWord magic_delta = 0;
+# elif DARWIN_VERS == DARWIN_10_7
+ UWord magic_delta = 0x60;
+# endif
+
// This thread already exists; we're merely re-entering
// after leaving via workq_ops(WQOPS_THREAD_RETURN).
// Don't allocate any V thread resources.
@@ -416,8 +431,14 @@
vg_assert(mach_thread_self() == kport);
tst = VG_(get_ThreadState)(tid);
+
+ if (0) VG_(printf)("wqthread_hijack reuse %s: tid %d, tst %p, "
+ "tst->os_state.pthread %#lx\n",
+ tst->os_state.pthread == self ? "SAME" : "DIFF",
+ tid, tst, tst->os_state.pthread);
+
vex = &tst->arch.vex;
- vg_assert(tst->os_state.pthread == self);
+ vg_assert(tst->os_state.pthread - magic_delta == self);
}
else {
// This is a new thread.
diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c
index aa43e97..5bb1a60 100644
--- a/coregrind/m_syswrap/syswrap-darwin.c
+++ b/coregrind/m_syswrap/syswrap-darwin.c
@@ -4316,6 +4316,79 @@
mach_msg: messages to a task
------------------------------------------------------------------ */
+// JRS 2011-Aug-25: just guessing here. I have no clear idea how
+// these structs are derived. They obviously relate to the various
+// .def files in the xnu sources, and can also be found in some
+// form in /usr/include/mach/*.h, but not sure how these all
+// relate to each other.
+
+PRE(mach_port_set_context)
+{
+#pragma pack(4)
+ typedef struct {
+ mach_msg_header_t Head;
+ NDR_record_t NDR;
+ mach_port_name_t name;
+ mach_vm_address_t context;
+ } Request;
+#pragma pack()
+
+ Request *req = (Request *)ARG1;
+
+ PRINT("mach_port_set_context(%s, %s, 0x%llx)",
+ name_for_port(MACH_REMOTE),
+ name_for_port(req->name), req->context);
+
+ AFTER = POST_FN(mach_port_set_context);
+}
+
+POST(mach_port_set_context)
+{
+#pragma pack(4)
+ typedef struct {
+ mach_msg_header_t Head;
+ NDR_record_t NDR;
+ kern_return_t RetCode;
+ } Reply;
+#pragma pack()
+}
+
+
+// JRS 2011-Aug-25 FIXME completely bogus
+PRE(task_get_exception_ports)
+{
+#pragma pack(4)
+ typedef struct {
+ mach_msg_header_t Head;
+ NDR_record_t NDR;
+ exception_mask_t exception_mask;
+ } Request;
+#pragma pack()
+
+ PRINT("task_get_exception_ports(BOGUS)");
+ AFTER = POST_FN(task_get_exception_ports);
+}
+
+POST(task_get_exception_ports)
+{
+#pragma pack(4)
+ typedef struct {
+ mach_msg_header_t Head;
+ /* start of the kernel processed data */
+ mach_msg_body_t msgh_body;
+ mach_msg_port_descriptor_t old_handlers[32];
+ /* end of the kernel processed data */
+ NDR_record_t NDR;
+ mach_msg_type_number_t masksCnt;
+ exception_mask_t masks[32];
+ exception_behavior_t old_behaviors[32];
+ thread_state_flavor_t old_flavors[32];
+ } Reply;
+#pragma pack()
+}
+
+
+///////////////////////////////////////////////////
PRE(mach_port_type)
{
@@ -5332,6 +5405,7 @@
//VG_(mprotect_max_range)(start, end-start, prot);
} else {
ML_(notify_core_and_tool_of_mprotect)(start, end-start, prot);
+ VG_(di_notify_vm_protect)(start, end-start, prot);
}
}
} else {
@@ -6752,6 +6826,9 @@
}
}
+// JRS 2011-Aug-25: these magic numbers (3201 etc) come from
+// /usr/include/mach/mach_port.h et al (grep in /usr/include
+// for them)
PRE(mach_msg_task)
{
// message to a task port
@@ -6804,7 +6881,11 @@
case 3227:
CALL_PRE(mach_port_extract_member);
return;
-
+
+ case 3229:
+ CALL_PRE(mach_port_set_context);
+ return;
+
case 3402:
CALL_PRE(task_threads);
return;
@@ -6828,6 +6909,10 @@
case 3412:
CALL_PRE(thread_create_running);
return;
+
+ case 3414:
+ CALL_PRE(task_get_exception_ports);
+ return;
case 3418:
CALL_PRE(semaphore_create);
@@ -7630,6 +7715,103 @@
/* ---------------------------------------------------------------------
+ Added for OSX 10.7 (Lion)
+ ------------------------------------------------------------------ */
+
+PRE(getaudit_addr)
+{
+ PRINT("getaudit_addr(%#lx, %lu)", ARG1, ARG2);
+ PRE_REG_READ1(void*, "auditinfo_addr", int, "length");
+ PRE_MEM_WRITE("getaudit_addr(auditinfo_addr)", ARG1, ARG2);
+}
+POST(getaudit_addr)
+{
+ POST_MEM_WRITE(ARG1, ARG2);
+}
+
+PRE(psynch_mutexwait)
+{
+ PRINT("psynch_mutexwait(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_mutexwait)
+{
+}
+
+PRE(psynch_mutexdrop)
+{
+ PRINT("psynch_mutexdrop(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_mutexdrop)
+{
+}
+
+PRE(psynch_cvbroad)
+{
+ PRINT("psynch_cvbroad(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_cvbroad)
+{
+}
+
+PRE(psynch_cvsignal)
+{
+ PRINT("psynch_cvsignal(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_cvsignal)
+{
+}
+
+PRE(psynch_cvwait)
+{
+ PRINT("psynch_cvwait(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_cvwait)
+{
+}
+
+PRE(psynch_rw_rdlock)
+{
+ PRINT("psynch_rw_rdlock(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_rw_rdlock)
+{
+}
+
+PRE(psynch_rw_wrlock)
+{
+ PRINT("psynch_rw_wrlock(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_rw_wrlock)
+{
+}
+
+PRE(psynch_rw_unlock)
+{
+ PRINT("psynch_rw_unlock(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_rw_unlock)
+{
+}
+
+PRE(psynch_cvclrprepost)
+{
+ PRINT("psynch_cvclrprepost(BOGUS)\n");
+ *flags |= SfMayBlock;
+}
+POST(psynch_cvclrprepost)
+{
+}
+
+
+/* ---------------------------------------------------------------------
syscall tables
------------------------------------------------------------------ */
@@ -7970,18 +8152,18 @@
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(298)), // old new_system_shared_regions
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(299)), // old shared_region_map_file_np
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(300)), // old shared_region_make_private_np
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(301)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(302)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(303)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(304)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(305)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(306)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(307)), // ???
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(308)), // ???
+ MACXY(__NR_psynch_mutexwait, psynch_mutexwait), // 301
+ MACXY(__NR_psynch_mutexdrop, psynch_mutexdrop), // 302
+ MACXY(__NR_psynch_cvbroad, psynch_cvbroad), // 303
+ MACXY(__NR_psynch_cvsignal, psynch_cvsignal), // 304
+ MACXY(__NR_psynch_cvwait, psynch_cvwait), // 305
+ MACXY(__NR_psynch_rw_rdlock, psynch_rw_rdlock), // 306
+ MACXY(__NR_psynch_rw_wrlock, psynch_rw_wrlock), // 307
+ MACXY(__NR_psynch_rw_unlock, psynch_rw_unlock), // 308
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(309)), // ???
// _____(__NR_getsid),
// _____(__NR_settid_with_pid),
- _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(312)), // ???
+ MACXY(__NR_psynch_cvclrprepost, psynch_cvclrprepost), // 312
// _____(__NR_aio_fsync),
MACXY(__NR_aio_return, aio_return),
MACX_(__NR_aio_suspend, aio_suspend),
@@ -8028,7 +8210,9 @@
// _____(__NR_setauid),
// _____(__NR_getaudit),
// _____(__NR_setaudit),
-// _____(__NR_getaudit_addr),
+#if DARWIN_VERS >= DARWIN_10_7
+ MACXY(__NR_getaudit_addr, getaudit_addr),
+#endif
// _____(__NR_setaudit_addr),
// _____(__NR_auditctl),
MACXY(__NR_bsdthread_create, bsdthread_create), // 360
diff --git a/coregrind/pub_core_debuginfo.h b/coregrind/pub_core_debuginfo.h
index 876eac1..da9ec3e 100644
--- a/coregrind/pub_core_debuginfo.h
+++ b/coregrind/pub_core_debuginfo.h
@@ -67,6 +67,9 @@
extern void VG_(di_notify_pdb_debuginfo)( Int fd, Addr avma,
SizeT total_size,
PtrdiffT unknown_purpose__reloc );
+
+/* this should also really return ULong */
+extern void VG_(di_notify_vm_protect)( Addr a, SizeT len, UInt prot );
#endif
extern void VG_(di_discard_ALL_debuginfo)( void );
diff --git a/darwin11.supp b/darwin11.supp
new file mode 100644
index 0000000..8c5caef
--- /dev/null
+++ b/darwin11.supp
@@ -0,0 +1,122 @@
+
+# Suppressions for Darwin 11.x / Mac OS X 10.7 Lion
+
+##----------------------------------------------------------------------##
+# Memcheck
+##----------------------------------------------------------------------##
+
+# Dunno where this is a real bug, or due to borked 10.7-specific syscall
+# wrappers. 64-bit mode; not sure if occurs in 32-bit mode.
+# Anyway, for the tine being:
+#
+# Conditional jump or move depends on uninitialised value(s)
+# at 0x1973E6: __mtx_droplock (in /usr/lib/system/libsystem_c.dylib)
+# by 0x1976AA: pthread_mutex_unlock (in /usr/lib/system/libsystem_c.dylib)
+# by 0x100B3D: unlock_node (in /usr/lib/system/libkeymgr.dylib)
+{
+ OSX107:__mtx_droplock
+ Memcheck:Cond
+ fun:__mtx_droplock
+ fun:pthread_mutex_unlock
+ fun:unlock_node
+}
+
+# Conditional jump or move depends on uninitialised value(s)
+# at 0x2EB883: ??? (in /usr/lib/system/libxpc.dylib)
+# by 0x237C6: ??? (in /usr/lib/libSystem.B.dylib)
+# by 0x8FE1115A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ obj:/usr/lib/system/libxpc.dylib
+ obj:/usr/lib/libSystem.B.dylib
+ fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE
+}
+
+# ZLib stuff. How come this wasn't necessary in 10.6 ?
+{
+ OSX107:zlib-C
+ Memcheck:Cond
+ obj:/usr/lib/libz.*dylib
+ obj:/usr/lib/libz.*dylib
+}
+{
+ OSX107:zlib-8
+ Memcheck:Value8
+ obj:/usr/lib/libz.*dylib
+ obj:/usr/lib/libz.*dylib
+}
+
+# Really a bug? I don't know.
+# Conditional jump or move depends on uninitialised value(s)
+# at 0x3A322FE: __mtx_droplock (in /usr/lib/system/libsystem_c.dylib)
+# by 0x3A326AA: pthread_mutex_unlock (in /usr/lib/system/libsystem_c.dylib)
+# by 0x26382: load_images (in /usr/lib/libobjc.A.dylib)
+{
+ OSX107:blah
+ Memcheck:Cond
+ fun:__mtx_droplock
+ fun:pthread_mutex_unlock
+}
+
+{
+ OSX107:blah
+ Memcheck:Cond
+ fun:pthread_mutex_lock
+}
+
+
+
+##########################################################################
+### The ones below are from darwin10.supp (for Snow Leopard). I don't
+### know whether they are still necessary.
+
+# afaict this is legit. Might be caused by setenv("VAR=")
+# where the value string is empty (not sure)
+{
+ macos-Cond-7
+ Memcheck:Cond
+ fun:__setenv
+}
+
+# From Jesse Ruderman.
+#{
+# Mac OS X 10.6.4. rdar://8145289. "new[]" paired with "delete" in the DesktopServicesPriv framework.
+# Memcheck:Free
+# fun:_ZdlPv
+# fun:_ZN5TChar18RemovePtrReferenceEv
+# }
+
+# From Jesse Ruderman.
+#{
+# Mac OS X 10.6.4. rdar://8145318. Uninitialized memory from HIMenuBarView::MeasureAppMenus is used in HIMenuBarView::SetAdjustTextTitleBoundsAtIndex.
+# Memcheck:Cond
+# fun:_ZN13HIMenuBarView31SetAdjustTextTitleBoundsAtIndexEih
+# fun:_ZN13HIMenuBarView15MeasureAppMenusEv
+#}
+
+#{
+# TFontFeatures::TFontFeatures(CGFont*) (in CoreText.framework)
+# Memcheck:Cond
+# fun:_ZN13TFontFeaturesC2EP6CGFont
+# fun:_ZNK9TBaseFont12CopyFeaturesEv
+#}
+
+# See https://bugs.kde.org/show_bug.cgi?id=188572 about this; it's
+# unavoidable due to BSD setenv() semantics.
+#{
+# macos-__setenv-leak-see-our-bug-188572
+# Memcheck:Leak
+# fun:malloc_zone_malloc
+# fun:__setenv
+#}
+
+#{
+# libSystem-keymgr-leak-at-exit
+# Memcheck:Leak
+# fun:malloc
+# fun:get_or_create_key_element
+# fun:_keymgr_get_and_lock_processwide_ptr_2
+# fun:__keymgr_initializer
+# fun:libSystem_initializer
+#}
diff --git a/include/pub_tool_redir.h b/include/pub_tool_redir.h
index 4ca8358..1649f8c 100644
--- a/include/pub_tool_redir.h
+++ b/include/pub_tool_redir.h
@@ -31,6 +31,8 @@
#ifndef __PUB_TOOL_REDIR_H
#define __PUB_TOOL_REDIR_H
+#include "config.h" /* DARWIN_VERS */
+
/* The following macros facilitate function replacement and wrapping.
Function wrapping and function replacement are similar but not
@@ -240,10 +242,16 @@
#if defined(VGO_linux)
# define VG_Z_LIBC_SONAME libcZdsoZa // libc.so*
-#elif defined(VGO_darwin)
+
+#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)
+# define VG_Z_LIBC_SONAME libsystemZucZaZddylib // libsystem_c*.dylib
+
#else
# error "Unknown platform"
+
#endif
/* --- Soname of the GNU C++ library. --- */
diff --git a/include/vki/vki-scnums-darwin.h b/include/vki/vki-scnums-darwin.h
index f39f28e..30a8380 100644
--- a/include/vki/vki-scnums-darwin.h
+++ b/include/vki/vki-scnums-darwin.h
@@ -515,18 +515,18 @@
/* 298 old new_system_shared_regions */
/* 299 old shared_region_map_file_np */
/* 300 old shared_region_make_private_np */
- /* 301 */
- /* 302 */
- /* 303 */
- /* 304 */
- /* 305 */
- /* 306 */
- /* 307 */
- /* 308 */
+#define __NR_psynch_mutexwait VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(301)
+#define __NR_psynch_mutexdrop VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(302)
+#define __NR_psynch_cvbroad VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(303)
+#define __NR_psynch_cvsignal VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(304)
+#define __NR_psynch_cvwait VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(305)
+#define __NR_psynch_rw_rdlock VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(306)
+#define __NR_psynch_rw_wrlock VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(307)
+#define __NR_psynch_rw_unlock VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(308)
/* 309 */
#define __NR_getsid VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(310)
#define __NR_settid_with_pid VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(311)
- /* 312 */
+#define __NR_psynch_cvclrprepost VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(312)
#define __NR_aio_fsync VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(313)
#define __NR_aio_return VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(314)
#define __NR_aio_suspend VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(315)
diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c
index ddaf512..1fdb7eb 100644
--- a/memcheck/mc_replace_strmem.c
+++ b/memcheck/mc_replace_strmem.c
@@ -178,10 +178,11 @@
STRRCHR(VG_Z_LD_LINUX_SO_2, rindex)
#elif defined(VGO_darwin)
- STRRCHR(VG_Z_LIBC_SONAME, strrchr)
- STRRCHR(VG_Z_LIBC_SONAME, rindex)
- STRRCHR(VG_Z_DYLD, strrchr)
- STRRCHR(VG_Z_DYLD, rindex)
+ //STRRCHR(VG_Z_LIBC_SONAME, strrchr)
+ //STRRCHR(VG_Z_LIBC_SONAME, rindex)
+ //STRRCHR(VG_Z_DYLD, strrchr)
+ //STRRCHR(VG_Z_DYLD, rindex)
+ STRRCHR(VG_Z_LIBC_SONAME, strrchr)
#endif
@@ -214,10 +215,11 @@
# endif
#elif defined(VGO_darwin)
- STRCHR(VG_Z_LIBC_SONAME, strchr)
- STRCHR(VG_Z_LIBC_SONAME, index)
- STRCHR(VG_Z_DYLD, strchr)
- STRCHR(VG_Z_DYLD, index)
+ //STRCHR(VG_Z_LIBC_SONAME, strchr)
+ //STRCHR(VG_Z_LIBC_SONAME, index)
+ //STRCHR(VG_Z_DYLD, strchr)
+ //STRCHR(VG_Z_DYLD, index)
+ STRCHR(VG_Z_LIBC_SONAME, strchr)
#endif
@@ -252,7 +254,7 @@
STRCAT(VG_Z_LIBC_SONAME, __GI_strcat)
#elif defined(VGO_darwin)
- STRCAT(VG_Z_LIBC_SONAME, strcat)
+ //STRCAT(VG_Z_LIBC_SONAME, strcat)
#endif
@@ -288,8 +290,8 @@
STRNCAT(VG_Z_LIBC_SONAME, strncat)
#elif defined(VGO_darwin)
- STRNCAT(VG_Z_LIBC_SONAME, strncat)
- STRNCAT(VG_Z_DYLD, strncat)
+ //STRNCAT(VG_Z_LIBC_SONAME, strncat)
+ //STRNCAT(VG_Z_DYLD, strncat)
#endif
@@ -335,8 +337,9 @@
#if defined(VGO_linux)
#elif defined(VGO_darwin)
+ //STRLCAT(VG_Z_LIBC_SONAME, strlcat)
+ //STRLCAT(VG_Z_DYLD, strlcat)
STRLCAT(VG_Z_LIBC_SONAME, strlcat)
- STRLCAT(VG_Z_DYLD, strlcat)
#endif
@@ -359,7 +362,7 @@
STRNLEN(VG_Z_LIBC_SONAME, __GI_strnlen)
#elif defined(VGO_darwin)
- STRNLEN(VG_Z_LIBC_SONAME, strnlen)
+ //STRNLEN(VG_Z_LIBC_SONAME, strnlen)
#endif
@@ -387,7 +390,8 @@
STRLEN(VG_Z_LIBC_SONAME, __GI_strlen)
#elif defined(VGO_darwin)
- STRLEN(VG_Z_LIBC_SONAME, strlen)
+ //STRLEN(VG_Z_LIBC_SONAME, strlen)
+ STRLEN(VG_Z_LIBC_SONAME, strlen)
#endif
@@ -422,8 +426,9 @@
STRCPY(VG_Z_LIBC_SONAME, __GI_strcpy)
#elif defined(VGO_darwin)
+ //STRCPY(VG_Z_LIBC_SONAME, strcpy)
+ //STRCPY(VG_Z_DYLD, strcpy)
STRCPY(VG_Z_LIBC_SONAME, strcpy)
- STRCPY(VG_Z_DYLD, strcpy)
#endif
@@ -455,8 +460,9 @@
STRNCPY(VG_Z_LIBC_SONAME, __GI_strncpy)
#elif defined(VGO_darwin)
+ //STRNCPY(VG_Z_LIBC_SONAME, strncpy)
+ //STRNCPY(VG_Z_DYLD, strncpy)
STRNCPY(VG_Z_LIBC_SONAME, strncpy)
- STRNCPY(VG_Z_DYLD, strncpy)
#endif
@@ -491,8 +497,9 @@
#if defined(VGO_linux)
#elif defined(VGO_darwin)
+ //STRLCPY(VG_Z_LIBC_SONAME, strlcpy)
+ //STRLCPY(VG_Z_DYLD, strlcpy)
STRLCPY(VG_Z_LIBC_SONAME, strlcpy)
- STRLCPY(VG_Z_DYLD, strlcpy)
#endif
@@ -524,8 +531,9 @@
STRNCMP(VG_Z_LIBC_SONAME, __GI_strncmp)
#elif defined(VGO_darwin)
- STRNCMP(VG_Z_LIBC_SONAME, strncmp)
- STRNCMP(VG_Z_DYLD, strncmp)
+ //STRNCMP(VG_Z_LIBC_SONAME, strncmp)
+ //STRNCMP(VG_Z_DYLD, strncmp)
+ STRNCMP(VG_Z_LIBC_SONAME, strncmp)
#endif
@@ -560,7 +568,7 @@
# endif
#elif defined(VGO_darwin)
- STRCASECMP(VG_Z_LIBC_SONAME, strcasecmp)
+ //STRCASECMP(VG_Z_LIBC_SONAME, strcasecmp)
#endif
@@ -597,8 +605,8 @@
# endif
#elif defined(VGO_darwin)
- STRNCASECMP(VG_Z_LIBC_SONAME, strncasecmp)
- STRNCASECMP(VG_Z_DYLD, strncasecmp)
+ //STRNCASECMP(VG_Z_LIBC_SONAME, strncasecmp)
+ //STRNCASECMP(VG_Z_DYLD, strncasecmp)
#endif
@@ -632,7 +640,7 @@
STRCASECMP_L(VG_Z_LIBC_SONAME, __GI___strcasecmp_l)
#elif defined(VGO_darwin)
- STRCASECMP_L(VG_Z_LIBC_SONAME, strcasecmp_l)
+ //STRCASECMP_L(VG_Z_LIBC_SONAME, strcasecmp_l)
#endif
@@ -667,8 +675,8 @@
STRNCASECMP_L(VG_Z_LIBC_SONAME, __GI_strncasecmp_l)
#elif defined(VGO_darwin)
- STRNCASECMP_L(VG_Z_LIBC_SONAME, strncasecmp_l)
- STRNCASECMP_L(VG_Z_DYLD, strncasecmp_l)
+ //STRNCASECMP_L(VG_Z_LIBC_SONAME, strncasecmp_l)
+ //STRNCASECMP_L(VG_Z_DYLD, strncasecmp_l)
#endif
@@ -702,7 +710,8 @@
STRCMP(VG_Z_LD64_SO_1, strcmp)
#elif defined(VGO_darwin)
- STRCMP(VG_Z_LIBC_SONAME, strcmp)
+ //STRCMP(VG_Z_LIBC_SONAME, strcmp)
+ STRCMP(VG_Z_LIBC_SONAME, strcmp)
#endif
@@ -727,8 +736,8 @@
MEMCHR(VG_Z_LIBC_SONAME, memchr)
#elif defined(VGO_darwin)
- MEMCHR(VG_Z_LIBC_SONAME, memchr)
- MEMCHR(VG_Z_DYLD, memchr)
+ //MEMCHR(VG_Z_LIBC_SONAME, memchr)
+ //MEMCHR(VG_Z_DYLD, memchr)
#endif
@@ -833,8 +842,10 @@
MEMCPY(NONE, ZuintelZufastZumemcpy)
#elif defined(VGO_darwin)
- MEMCPY(VG_Z_LIBC_SONAME, memcpy)
- MEMCPY(VG_Z_DYLD, memcpy)
+ //MEMCPY(VG_Z_LIBC_SONAME, memcpy)
+ //MEMCPY(VG_Z_DYLD, memcpy)
+ MEMCPY(VG_Z_LIBC_SONAME, memcpyZDVARIANTZDsse3x) /* memcpy$VARIANT$sse3x */
+ MEMCPY(VG_Z_LIBC_SONAME, memcpyZDVARIANTZDsse42) /* memcpy$VARIANT$sse42 */
#endif
@@ -872,10 +883,10 @@
MEMCMP(VG_Z_LD_SO_1, bcmp)
#elif defined(VGO_darwin)
- MEMCMP(VG_Z_LIBC_SONAME, memcmp)
- MEMCMP(VG_Z_LIBC_SONAME, bcmp)
- MEMCMP(VG_Z_DYLD, memcmp)
- MEMCMP(VG_Z_DYLD, bcmp)
+ //MEMCMP(VG_Z_LIBC_SONAME, memcmp)
+ //MEMCMP(VG_Z_LIBC_SONAME, bcmp)
+ //MEMCMP(VG_Z_DYLD, memcmp)
+ //MEMCMP(VG_Z_DYLD, bcmp)
#endif
@@ -914,8 +925,8 @@
STPCPY(VG_Z_LD_LINUX_X86_64_SO_2, stpcpy)
#elif defined(VGO_darwin)
- STPCPY(VG_Z_LIBC_SONAME, stpcpy)
- STPCPY(VG_Z_DYLD, stpcpy)
+ //STPCPY(VG_Z_LIBC_SONAME, stpcpy)
+ //STPCPY(VG_Z_DYLD, stpcpy)
#endif
@@ -924,6 +935,7 @@
/* Why are we bothering to intercept this? It seems entirely
pointless. */
+
#define MEMSET(soname, fnname) \
void* VG_REPLACE_FUNCTION_EZU(20210,soname,fnname) \
(void *s, Int c, SizeT n); \
@@ -947,8 +959,9 @@
MEMSET(VG_Z_LIBC_SONAME, memset)
#elif defined(VGO_darwin)
+ //MEMSET(VG_Z_LIBC_SONAME, memset)
+ //MEMSET(VG_Z_DYLD, memset)
MEMSET(VG_Z_LIBC_SONAME, memset)
- MEMSET(VG_Z_DYLD, memset)
#endif
@@ -956,12 +969,15 @@
/*---------------------- memmove ----------------------*/
/* memmove -- use the MEMMOVE defn above. */
+
#if defined(VGO_linux)
MEMMOVE(VG_Z_LIBC_SONAME, memmove)
#elif defined(VGO_darwin)
- MEMMOVE(VG_Z_LIBC_SONAME, memmove)
- MEMMOVE(VG_Z_DYLD, memmove)
+ //MEMMOVE(VG_Z_LIBC_SONAME, memmove)
+ //MEMMOVE(VG_Z_DYLD, memmove)#
+ MEMMOVE(VG_Z_LIBC_SONAME, memmoveZDVARIANTZDsse3x) /* memmove$VARIANT$sse3x */
+ MEMMOVE(VG_Z_LIBC_SONAME, memmoveZDVARIANTZDsse42) /* memmove$VARIANT$sse42 */
#endif
@@ -991,8 +1007,8 @@
#if defined(VGO_linux)
#elif defined(VGO_darwin)
- BCOPY(VG_Z_LIBC_SONAME, bcopy)
- BCOPY(VG_Z_DYLD, bcopy)
+ //BCOPY(VG_Z_LIBC_SONAME, bcopy)
+ //BCOPY(VG_Z_DYLD, bcopy)
#endif
@@ -1198,7 +1214,7 @@
GLIBC25_MEMPCPY(VG_Z_LD_SO_1, mempcpy) /* ld.so.1 */
#elif defined(VGO_darwin)
- GLIBC25_MEMPCPY(VG_Z_LIBC_SONAME, mempcpy)
+ //GLIBC25_MEMPCPY(VG_Z_LIBC_SONAME, mempcpy)
#endif