]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin: many fixes for OSX 10.13
authorPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 27 Nov 2025 06:22:18 +0000 (07:22 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 27 Nov 2025 12:26:57 +0000 (13:26 +0100)
Most of these changes are from Louis Brunner's GitHub repo.
The most imortant changes are to the memory space and to the code
related to getting the host filename during startup. This means
that when Valgrind crashes or hits an assert we now get a legible
host stacktrrace.

This also fixes none/tests/darwin/bug228343

14 files changed:
NEWS
coregrind/m_aspacemgr/aspacemgr-linux.c
coregrind/m_aspacemgr/priv_aspacemgr.h
coregrind/m_initimg/initimg-darwin.c
coregrind/m_main.c
coregrind/m_syswrap/syswrap-darwin.c
coregrind/pub_core_mach.h
docs/internals/Darwin-notes.txt
include/vki/vki-darwin.h
memcheck/mc_main.c
none/tests/darwin/bug228343.c
none/tests/darwin/bug228343.stdout.exp
none/tests/pth_term_signal.vgtest
tests/filter_stderr_basic.in

diff --git a/NEWS b/NEWS
index b944b1fb989878f6fb0dd55060d668b42c37f882..2cedad448a950a7f8c1a5153a2f34d6789ceb161 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,10 +25,11 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather
 than mailing the developers (or mailing lists) directly -- bugs that
 are not entered into bugzilla tend to get forgotten about or ignored.
 
-510864  Add SSE4.1 PMAXSD and PMINSD instructions support for 32-bit x86
+228343  none/tests/darwin/bug228343 fails on OS X
 413369  unhandled amd64-darwin syscall: unix:151 (getpgid)
 487055  memcheck/tests/x86-linux/scalar fails running in Docker
 510416  Missing syswraps for file_getattr and file_setattr
+510864  Add SSE4.1 PMAXSD and PMINSD instructions support for 32-bit x86
 511329  Darwin and FreeBSD: Move setting of carry flag out of
         ML_(do_syscall_for_client_WRK)
 511713  Refactor syscall argument handling
index 214b4a8087a55280d181564f8a77e124bcebd599..d5715c44484b4214d5f8052c0ce233650619b082 100644 (file)
@@ -631,7 +631,10 @@ static Bool sane_NSegment ( const NSegment* s )
       case SkAnonC: case SkAnonV: case SkShmC:
          return 
             s->smode == SmFixed 
-            && s->dev == 0 && s->ino == 0 && s->offset == 0 && s->fnIdx == -1
+#if !defined(VGO_darwin) // on macOS we use ino as the vm_tag holder
+            && s->ino == 0
+#endif
+            && s->dev == 0 && s->offset == 0 && s->fnIdx == -1
             && (s->kind==SkAnonC ? True : !s->isCH);
 
       case SkFileC: case SkFileV:
@@ -1451,6 +1454,11 @@ void split_nsegments_lo_and_hi ( Addr sLo, Addr sHi,
    /* Not that I'm overly paranoid or anything, definitely not :-) */
 }
 
+#if defined(VGO_darwin)
+#include "pub_core_tooliface.h"
+
+static void fill_segment(NSegment* seg);
+#endif
 
 /* Add SEG to the collection, deleting/truncating any it overlaps.
    This deals with all the tricky cases of splitting up segments as
@@ -1464,6 +1472,11 @@ static void add_segment ( const NSegment* seg )
    Addr sStart = seg->start;
    Addr sEnd   = seg->end;
 
+#if defined(VGO_darwin)
+   // FIXME: the cast is unfortunate but I don't want to change every callsite to call 2 functions
+   fill_segment((NSegment*) (Addr) seg);
+#endif
+
    aspacem_assert(sStart <= sEnd);
    aspacem_assert(VG_IS_PAGE_ALIGNED(sStart));
    aspacem_assert(VG_IS_PAGE_ALIGNED(sEnd+1));
@@ -1659,12 +1672,12 @@ Addr VG_(am_startup) ( Addr sp_at_startup )
    // --- Darwin -------------------------------------------
 #if defined(VGO_darwin)
 
-# if VG_WORDSIZE == 4
+#if defined(VGP_x86_darwin)
    aspacem_maxAddr = (Addr) 0xffffffff;
 
    aspacem_cStart = aspacem_minAddr;
    aspacem_vStart = 0xf0000000;  // 0xc0000000..0xf0000000 available
-# else
+#elif defined(VGP_amd64_darwin)
    aspacem_maxAddr = (Addr) 0x7fffffffffff;
 
    aspacem_cStart = aspacem_minAddr;
@@ -3692,6 +3705,7 @@ static void parse_procselfmaps (
 #elif defined(VGO_darwin)
 #include <mach/mach.h>
 #include <mach/mach_vm.h>
+#include <libproc.h>
 
 static unsigned int mach2vki(unsigned int vm_prot)
 {
@@ -3701,6 +3715,353 @@ static unsigned int mach2vki(unsigned int vm_prot)
       ((vm_prot & VM_PROT_EXECUTE) ? VKI_PROT_EXEC    : 0) ;
 }
 
+static Int get_filename_for_region(int pid, Addr addr, HChar* path, SizeT path_len, ULong* vm_tag) {
+  int ret;
+  SizeT len;
+  struct proc_regionwithpathinfo info;
+  VG_(memset)(&info, 0, sizeof(info));
+  ret = sr_Res(VG_(do_syscall6)(__NR_proc_info, 2, pid, PROC_PIDREGIONPATHINFO, addr, (Addr)&info, sizeof(info)));
+  if (ret == -1) {
+    return ret;
+  }
+  if (vm_tag) {
+    *vm_tag = info.prp_prinfo.pri_user_tag;
+  }
+  len = VG_(strlen)(&info.prp_vip.vip_path[0]);
+  if (len == 0) {
+    return 0;
+  }
+  len += 1; // include the null terminator
+  if (len > path_len) {
+    len = path_len;
+  }
+  VG_(strlcpy)(path, info.prp_vip.vip_path, len);
+  return len;
+}
+
+static Bool get_name_from_tag(int tag, HChar* path, SizeT path_len) {
+  switch (tag) {
+    case VKI_VM_MEMORY_DYLD:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[internal dyld memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_OS_ALLOC_ONCE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[kernel alloc once]", path_len);
+      return True;
+    case VKI_VM_MEMORY_GENEALOGY:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[activity tracing]", path_len);
+      return True;
+    case VKI_VM_MEMORY_BRK:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[brk]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC_HUGE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (huge) memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC_LARGE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (large) memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC_SMALL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (small) memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC_TINY:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (tiny) memory]", path_len);
+      return True;
+    case VKI_VM_MEMORY_MALLOC_NANO:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (nano) memory]", path_len);
+      return True;
+    case VM_MEMORY_MACH_MSG:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[mach message]", path_len);
+      return True;
+    case VKI_VM_MEMORY_ANALYSIS_TOOL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[analysis tool]", path_len);
+      return True;
+    case VKI_VM_MEMORY_STACK:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[stack]", path_len);
+      return True;
+    case VKI_VM_MEMORY_SHARED_PMAP:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[shared pmap]", path_len);
+      return True;
+    case VKI_VM_MEMORY_UNSHARED_PMAP:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[unshared pmap]", path_len);
+      return True;
+    case VKI_VM_MEMORY_REALLOC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[realloc]", path_len);
+      break;
+    case VKI_VM_MEMORY_MALLOC_LARGE_REUSABLE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (large, reusable) memory]", path_len);
+      break;
+    case VKI_VM_MEMORY_MALLOC_LARGE_REUSED:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (large, reused) memory]", path_len);
+      break;
+    case VKI_VM_MEMORY_MALLOC_MEDIUM:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc (medium) memory]", path_len);
+      break;
+    case VKI_VM_MEMORY_MALLOC_PROB_GUARD:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[malloc prob guard]", path_len);
+      break;
+    case VKI_VM_MEMORY_IOKIT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[iokit]", path_len);
+      break;
+    case VKI_VM_MEMORY_GUARD:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[guard]", path_len);
+      break;
+    case VKI_VM_MEMORY_DYLIB:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[dylib]", path_len);
+      break;
+    case VKI_VM_MEMORY_OBJC_DISPATCHERS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[objc dispatchers]", path_len);
+      break;
+    case VKI_VM_MEMORY_APPKIT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[appkit]", path_len);
+      break;
+    case VKI_VM_MEMORY_FOUNDATION:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[foundation]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics]", path_len);
+      break;
+    case VKI_VM_MEMORY_CORESERVICES:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core services]", path_len);
+      break;
+    case VKI_VM_MEMORY_JAVA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[java]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREDATA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core data]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREDATA_OBJECTIDS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core data object ids]", path_len);
+      break;
+    case VKI_VM_MEMORY_ATS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[ats]", path_len);
+      break;
+    case VKI_VM_MEMORY_LAYERKIT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[layer kit]", path_len);
+      break;
+    case VKI_VM_MEMORY_CGIMAGE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics image]", path_len);
+      break;
+    case VKI_VM_MEMORY_TCMALLOC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[tcmalloc]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS_DATA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics data]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS_SHARED:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics shared]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS_FRAMEBUFFERS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics framebuffers]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS_BACKINGSTORES:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics backing stores]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREGRAPHICS_XALLOC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core graphics xalloc]", path_len);
+      break;
+    case VKI_VM_MEMORY_DYLD_MALLOC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[dyld malloc]", path_len);
+      break;
+    case VKI_VM_MEMORY_SQLITE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[sqlite]", path_len);
+      break;
+    case VKI_VM_MEMORY_JAVASCRIPT_CORE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[javascript core]", path_len);
+      break;
+    case VKI_VM_MEMORY_JAVASCRIPT_JIT_EXECUTABLE_ALLOCATOR:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[javascript jit executable allocator]", path_len);
+      break;
+    case VKI_VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[javascript jit register file]", path_len);
+      break;
+    case VKI_VM_MEMORY_GLSL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[glsl]", path_len);
+      break;
+    case VKI_VM_MEMORY_OPENCL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[opencl]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREIMAGE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core image]", path_len);
+      break;
+    case VKI_VM_MEMORY_WEBCORE_PURGEABLE_BUFFERS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[webcore purgeable buffers]", path_len);
+      break;
+    case VKI_VM_MEMORY_IMAGEIO:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[imageio]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREPROFILE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core profile]", path_len);
+      break;
+    case VKI_VM_MEMORY_ASSETSD:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[assetsd]", path_len);
+      break;
+    case VKI_VM_MEMORY_LIBDISPATCH:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[libdispatch]", path_len);
+      break;
+    case VKI_VM_MEMORY_ACCELERATE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[accelerate]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREUI:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core ui]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREUIFILE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core ui file]", path_len);
+      break;
+    case VKI_VM_MEMORY_RAWCAMERA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[raw camera]", path_len);
+      break;
+    case VKI_VM_MEMORY_CORPSEINFO:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[corpse info]", path_len);
+      break;
+    case VKI_VM_MEMORY_ASL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[asl]", path_len);
+      break;
+    case VKI_VM_MEMORY_SWIFT_RUNTIME:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[swift runtime]", path_len);
+      break;
+    case VKI_VM_MEMORY_SWIFT_METADATA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[swift metadata]", path_len);
+      break;
+    case VKI_VM_MEMORY_DHMM:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[dhmm]", path_len);
+      break;
+    case VKI_VM_MEMORY_SCENEKIT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[scene kit]", path_len);
+      break;
+    case VKI_VM_MEMORY_SKYWALK:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[skywalk]", path_len);
+      break;
+    case VKI_VM_MEMORY_IOSURFACE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[io surface]", path_len);
+      break;
+    case VKI_VM_MEMORY_LIBNETWORK:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[libnetwork]", path_len);
+      break;
+    case VKI_VM_MEMORY_AUDIO:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[audio]", path_len);
+      break;
+    case VKI_VM_MEMORY_VIDEOBITSTREAM:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[video bitstream]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_XPC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm xpc]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_RPC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm rpc]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_MEMORYPOOL:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm memory pool]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_READCACHE:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm read cache]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_CRABS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm crabs]", path_len);
+      break;
+    case VKI_VM_MEMORY_QUICKLOOK_THUMBNAILS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[quicklook thumbnails]", path_len);
+      break;
+    case VKI_VM_MEMORY_ACCOUNTS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[accounts]", path_len);
+      break;
+    case VKI_VM_MEMORY_SANITIZER:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[sanitizer]", path_len);
+      break;
+    case VKI_VM_MEMORY_IOACCELERATOR:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[io accelerator]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_REGWARP:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm regwarp]", path_len);
+      break;
+    case VKI_VM_MEMORY_EAR_DECODER:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[ear decoder]", path_len);
+      break;
+    case VKI_VM_MEMORY_COREUI_CACHED_IMAGE_DATA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[core ui cached image data]", path_len);
+      break;
+    case VKI_VM_MEMORY_COLORSYNC:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[color sync]", path_len);
+      break;
+    case VKI_VM_MEMORY_BTINFO:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[bt info]", path_len);
+      break;
+    case VKI_VM_MEMORY_CM_HLS:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[cm hls]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_THREAD_CONTEXT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta thread context]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_INDIRECT_BRANCH_MAP:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta indirect branch map]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_RETURN_STACK:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta return stack]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_EXECUTABLE_HEAP:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta executable heap]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_USER_LDT:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta user ldt]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_ARENA:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta arena]", path_len);
+      break;
+    case VKI_VM_MEMORY_ROSETTA_10:
+      VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[rosetta 10]", path_len);
+      break;
+    case VKI_VM_MEMORY_VALGRIND:
+    case 0:
+      return False;
+    default:
+      if (tag >= VKI_VM_MEMORY_APPLICATION_SPECIFIC_1 && tag <= VKI_VM_MEMORY_APPLICATION_SPECIFIC_16) {
+        VG_(strlcpy)(path, DARWIN_FAKE_MEMORY_PATH "[application specific]", path_len);
+        return True;
+      }
+      VG_(debugLog)(0, "aspacem", "unknown vm tag: %d\n", tag);
+      return False;
+  }
+  return True;
+}
+
+static void fill_segment(NSegment* seg) {
+  Int pid;
+  HChar name[VKI_PATH_MAX];
+  Int ret;
+
+  if (seg->fnIdx != -1 || seg->kind == SkFree || seg->kind == SkResvn) {
+    return;
+  }
+
+  pid = sr_Res(VG_(do_syscall0)(__NR_getpid));
+  ret = get_filename_for_region(pid, seg->start, name, sizeof(name), &seg->ino);
+  if (ret != 0) {
+    if (ret == -1) {
+      return;
+    }
+  } else if (get_name_from_tag(seg->ino, name, sizeof(name))) {
+    // these are owned by the kernel and are already initialized
+    // we flag them as client so m_main.c track them correctly
+    seg->kind = SkFileC;
+  } else {
+    return;
+  }
+  seg->fnIdx = ML_(am_allocate_segname)( name );
+}
+
+static Bool endswith(const HChar* str, const HChar* suffix) {
+  SizeT str_len = VG_(strlen)(str);
+  SizeT suffix_len = VG_(strlen)(suffix);
+  if (str_len < suffix_len) {
+    return False;
+  }
+  return VG_(strcmp)(str + str_len - suffix_len, suffix) == 0;
+}
+
 static UInt stats_machcalls = 0;
 
 static void parse_procselfmaps (
@@ -3713,13 +4074,16 @@ static void parse_procselfmaps (
    vm_address_t iter;
    unsigned int depth;
    vm_address_t last;
+   HChar name[VKI_PATH_MAX];
+   Bool ret;
+   Int pid = sr_Res(VG_(do_syscall0)(__NR_getpid));
 
    iter = 0;
    depth = 0;
    last = 0;
    while (1) {
       mach_vm_address_t addr = iter;
-      mach_vm_size_t size;
+      mach_vm_size_t size = 0;
       vm_region_submap_short_info_data_64_t info;
       kern_return_t kr;
 
@@ -3739,12 +4103,19 @@ static void parse_procselfmaps (
       }
       iter = addr + size;
 
+      // FIXME: not sure we should fill up anything here as it will added later anyway
+      ret = get_filename_for_region(pid, addr, name, sizeof(name), NULL);
+      if (!ret) {
+        ret = get_name_from_tag(info.user_tag, name, sizeof(name));
+      }
+
+
       if (addr > last  &&  record_gap) {
          (*record_gap)(last, addr - last);
       }
       if (record_mapping) {
          (*record_mapping)(addr, size, mach2vki(info.protection),
-                           0, 0, info.offset, NULL, False);
+                           0, info.user_tag, info.offset, ret ? name : NULL, False);
       }
       last = addr + size;
    }
index 978c58b98758469ccbdb89dbd27033ee8b0cf3b5..338b3545b595c4833c650251b8e41446fe66aaf5 100644 (file)
@@ -58,6 +58,9 @@
 #endif
 
 #include "pub_core_aspacemgr.h"  // self
+#if defined(VGO_darwin)
+#include "pub_core_mach.h"       // macos support
+#endif
 
 
 /* --------------- Implemented in aspacemgr-common.c ---------------*/
index d4452fd9d53f120a72ff74460833e16822d7228b..3ddc9806c68b330dcef3ec4a9fa821c78dac7f52 100644 (file)
@@ -48,6 +48,7 @@
 #include "pub_core_threadstate.h"     /* ThreadArchState */
 #include "pub_core_pathscan.h"        /* find_executable */
 #include "pub_core_initimg.h"         /* self */
+#include "pub_core_mach.h"
 
 
 /*====================================================================*/
@@ -63,6 +64,7 @@ static void load_client ( /*OUT*/ExeInfo* info,
    Int    ret;
 
    vg_assert( VG_(args_the_exename) != NULL);
+   vg_assert( VG_(strlen)(VG_(args_the_exename)) >= 1 );
    exe_name = VG_(find_executable)( VG_(args_the_exename) );
 
    if (!exe_name) {
@@ -338,6 +340,9 @@ Addr setup_client_stack( void*  init_sp,
       stringsize += VG_(strlen)(info->interp_args) + 1;
    }
 
+   vg_assert( VG_(args_the_exename) );
+   vg_assert( VG_(strlen)( VG_(args_the_exename) ) >= 1 );
+
    /* now scan the args we're given... */
    stringsize += VG_(strlen)( VG_(args_the_exename) ) + 1;
 
@@ -355,8 +360,16 @@ Addr setup_client_stack( void*  init_sp,
       stringsize += VG_(strlen)(*cpp) + 1;
    }
 
+   // @todo PJF there is a bug in the size calculation or rounding
+   // somewhere. This should be "+= 2" (one of the pointer to exec
+   // path and one for the terminating NULL pointer). When I run
+   // "./tests/vg_regtest none/tests" from a Korn shell script
+   // then the allexec32/64 tests fail because they print out "argv[0]".
+   // I think that what happens is that writing to "ptr" overwrites the
+   // start of strtab resulting in the argv[0] the exe name being a
+   // string starting with 8 \0s (not tested)
    /* Darwin executable_path + NULL */
-   auxsize += 2 * sizeof(Word);
+   auxsize += 3 * sizeof(Word);
    if (info->executable_path) {
        stringsize += 1 + VG_(strlen)(info->executable_path);
    }
@@ -367,8 +380,8 @@ Addr setup_client_stack( void*  init_sp,
    /* OK, now we know how big the client stack is */
    stacksize =
       sizeof(Word) +                          /* argc */
-      sizeof(HChar **) +                      /* argc[0] == exename */
-      sizeof(HChar **)*argc +                 /* argv */
+      sizeof(HChar **) +                      /* argv[0] == exename */
+      sizeof(HChar **)*argc +                 /* argv guest args */
       sizeof(HChar **) +                      /* terminal NULL */
       sizeof(HChar **)*envc +                 /* envp */
       sizeof(HChar **) +                      /* terminal NULL */
@@ -441,9 +454,9 @@ Addr setup_client_stack( void*  init_sp,
 
    /* --- executable_path + NULL --- */
    if (info->executable_path) 
-       *ptr++ = (Addr)copy_str(&strtab, info->executable_path);
+      *ptr++ = (Addr)copy_str(&strtab, info->executable_path);
    else 
-       *ptr++ = 0;
+      *ptr++ = 0;
    *ptr++ = 0;
 
    vg_assert((strtab-stringbase) == stringsize);
@@ -470,6 +483,38 @@ Addr setup_client_stack( void*  init_sp,
 /*=== Record system memory regions                                 ===*/
 /*====================================================================*/
 
+void VG_(mach_record_system_memory)(void) {
+    /* Darwin only: tell the tools where the client's kernel commpage
+      is.  It would be better to do this by telling aspacemgr about
+      it -- see the now disused record_system_memory() below --
+      but that causes the sync checker to fail,
+      since the mapping doesn't appear in the kernel-supplied
+      process map.  So do it here instead. */
+
+#if defined(VGA_amd64)
+  VG_TRACK( new_mem_startup,
+            0x7fffffe00000, 0x7ffffffff000-0x7fffffe00000,
+            True, False, True, /* r-x */
+            0 /* di_handle: no associated debug info */ );
+#elif defined(VGA_x86)
+  VG_TRACK( new_mem_startup,
+            0xfffec000, 0xfffff000-0xfffec000,
+            True, False, True, /* r-x */
+            0 /* di_handle: no associated debug info */ );
+#elif defined(VGA_arm64)
+  VG_TRACK( new_mem_startup,
+            0xfffff4000, 0x1000,
+            True, False, True, /* r-- */
+            0 /* di_handle: no associated debug info */ );
+  VG_TRACK( new_mem_startup,
+            0xfffffc000, 0x1000,
+            True, False, True, /* r-x */
+            0 /* di_handle: no associated debug info */ );
+#else
+# error "Unknown Darwin architecture"
+#endif
+}
+
 static void record_system_memory(void)
 {
   /* JRS 2014-Jul-08: this messes up the sync checker, because the
index ce8a7ae6a3b5d28c6015c547b6ebffc028a4bb54..ecd159e97399b9150153f59a18743aff32121a13 100644 (file)
@@ -1910,7 +1910,7 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
    addr2dihandle = VG_(newXA)( VG_(malloc), "main.vm.2",
                                VG_(free), sizeof(Addr_n_ULong) );
 
-#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd)
+#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_darwin) || defined(VGO_freebsd)
    { Addr* seg_starts;
      Int   n_seg_starts;
      Addr_n_ULong anu;
@@ -1932,22 +1932,6 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
         }
      }
 
-     VG_(free)( seg_starts );
-   }
-#  elif defined(VGO_darwin)
-   { Addr* seg_starts;
-     Int   n_seg_starts;
-     seg_starts = VG_(get_segment_starts)( SkFileC, &n_seg_starts );
-     vg_assert(seg_starts && n_seg_starts >= 0);
-
-     /* show them all to the debug info reader.
-        Don't read from V segments (unlike Linux) */
-     // GrP fixme really?
-     for (i = 0; i < n_seg_starts; i++) {
-        VG_(di_notify_mmap)( seg_starts[i], False/*don't allow_SkFileV*/,
-                             -1/*don't use_fd*/);
-     }
-
      VG_(free)( seg_starts );
    }
 #  else
@@ -2101,22 +2085,8 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
                True   /* executable? */,
                0 /* di_handle: no associated debug info */ );
 
-     /* Darwin only: tell the tools where the client's kernel commpage
-        is.  It would be better to do this by telling aspacemgr about
-        it -- see the now disused record_system_memory() in
-        initimg-darwin.c -- but that causes the sync checker to fail,
-        since the mapping doesn't appear in the kernel-supplied
-        process map.  So do it here instead. */
-#    if defined(VGP_amd64_darwin)
-     VG_TRACK( new_mem_startup,
-               0x7fffffe00000, 0x7ffffffff000-0x7fffffe00000,
-               True, False, True, /* r-x */
-               0 /* di_handle: no associated debug info */ );
-#    elif defined(VGP_x86_darwin)
-     VG_TRACK( new_mem_startup,
-               0xfffec000, 0xfffff000-0xfffec000,
-               True, False, True, /* r-x */
-               0 /* di_handle: no associated debug info */ );
+#if defined(VGO_darwin)
+     VG_(mach_record_system_memory)();
 #    endif
 
      /* Clear the running thread indicator */
index 987e7ee0ffa0c73de2dd60bbd325f07ac32e48be..606fbccff110a7c9268cc50a957ffe94d44c1c53 100644 (file)
@@ -247,8 +247,6 @@ static void run_a_thread_NORETURN ( Word tidW )
 
    } else {
 
-      mach_msg_header_t msg;
-
       VG_(debugLog)(1, "syswrap-darwin", 
                        "run_a_thread_NORETURN(tid=%u): "
                           "not last one standing\n",
@@ -262,6 +260,8 @@ static void run_a_thread_NORETURN ( Word tidW )
 
       /* tid is now invalid. */
 
+#  if DARWIN_VERS < DARWIN_10_14
+      mach_msg_header_t msg;
       // GrP fixme exit race
       msg.msgh_bits = MACH_MSGH_BITS(17, MACH_MSG_TYPE_MAKE_SEND_ONCE);
       msg.msgh_request_port = VG_(gettid)();
@@ -274,6 +274,51 @@ static void run_a_thread_NORETURN ( Word tidW )
       // GrP fixme use bsdthread_terminate for safe cleanup?
       mach_msg(&msg, MACH_SEND_MSG|MACH_MSG_OPTION_NONE, 
                sizeof(msg), 0, 0, MACH_MSG_TIMEOUT_NONE, 0);
+
+#else
+      /* We have to use this sequence to terminate the thread to
+         prevent a subtle race.  If VG_(exit_thread)() had left the
+         ThreadState as Empty, then it could have been reallocated,
+         reusing the stack while we're doing these last cleanups.
+         Instead, VG_(exit_thread) leaves it as Zombie to prevent
+         reallocation.  We need to make sure we don't touch the stack
+         between marking it Empty and exiting.  Hence the
+         assembler. */
+#if defined(VGP_x86_darwin)
+      asm volatile (
+         "movl %1, %0\n"       /* set tst->status = VgTs_Empty */
+         "movl %2, %%eax\n" /* set %eax = __NR_bsdthread_terminate */
+         "movl $0, %%ebx\n"
+         "pushl %%ebx\n" /* args on stack */
+         "pushl %%ebx\n"
+         "pushl %%ebx\n"
+         "pushl %%ebx\n"
+         "int  $0x81\n" /* bsdthread_terminate(0, 0, 0, 0) */
+         "popl %%ebx\n" /* pop args */
+         "popl %%ebx\n"
+         "popl %%ebx\n"
+         "popl %%ebx\n"
+         : "=m" (tst->status)
+         : "n" (VgTs_Empty), "n" (__NR_bsdthread_terminate)
+         : "eax", "ebx"
+      );
+#elif defined(VGP_amd64_darwin)
+      asm volatile (
+         "movl %1, %0\n"       /* set tst->status = VgTs_Empty */
+         "movq %2, %%rax\n"    /* set %rax = __NR_bsdthread_terminate */
+         "movq $0, %%rdi\n"
+         "movq $0, %%rsi\n"
+         "movq $0, %%rdx\n"
+         "movq $0, %%r10\n"
+         "syscall\n"           /* bsdthread_terminate(0, 0, 0, 0) */
+         : "=m" (tst->status)
+         : "n" (VgTs_Empty), "n" (__NR_bsdthread_terminate)
+         : "rax", "rdi", "rsi", "rdx", "r10"
+      );
+#else
+# error Unknown platform
+#endif
+#endif
       
       // DDD: This is reached sometimes on none/tests/manythreads, maybe
       // because of the race above.
@@ -2143,6 +2188,7 @@ PRE(workq_ops)
       // GrP fixme may block?
       break;
    case VKI_WQOPS_THREAD_KEVENT_RETURN:
+   case VKI_WQOPS_THREAD_WORKLOOP_RETURN:
    case VKI_WQOPS_THREAD_RETURN: {
       // The interesting case. The kernel will do one of two things:
       // 1. Return normally. We continue; libc proceeds to stop the thread.
@@ -2176,7 +2222,6 @@ PRE(workq_ops)
       // RK fixme this just sets scheduling priorities - don't think we need
       // to do anything here
       break;
-   case VKI_WQOPS_THREAD_WORKLOOP_RETURN:
    case VKI_WQOPS_SHOULD_NARROW:
       // RK fixme need anything here?
       // RK fixme may block?
index 8ab46417a29c0946fa88146aff36ae8b367676c6..694bbee3761adaf89bbc5eb1ee8b004a6bb86889 100644 (file)
@@ -31,6 +31,8 @@
 #ifndef __PUB_CORE_MACH_H
 #define __PUB_CORE_MACH_H
 
+#define DARWIN_FAKE_MEMORY_PATH "/dev/macos/internals/"
+
 //--------------------------------------------------------------------
 // PURPOSE: This module contains the Mach kernel interface, 
 // for operating systems like Darwin / Mac OS X that use it.
@@ -39,6 +41,9 @@
 // Call this early in Valgrind's main(). It depends on nothing.
 extern void VG_(mach_init)(void);
 
+// Record system memory after aspace has been init'd
+extern void VG_(mach_record_system_memory)(void);
+
 #endif // __PUB_CORE_MACH_H
 
 #endif // defined(VGO_darwin)
index 8c320a35be554b8dab8c2d907530093d8d19f7f7..61d1931ad52c5999cc7ddaa61f0aff534e656d79 100644 (file)
@@ -61,10 +61,6 @@ machinery was removed in r10155.
 Valgrind-developer notes, todos re the MacOSX port
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-* m_syswrap/syscall-amd64-darwin.S
-  - correct signal mask is not applied during syscall
-  - restart-labels are completely bogus
-
 * m_syswrap/syswrap-darwin.c:
   - PRE(sys_posix_spawn) completely ignores signal issues, and
     also ignores the file_actions argument
@@ -95,12 +91,6 @@ Valgrind-developer notes, todos re the MacOSX port
 
 --------
 
-m_main doesn't read symbols for the valgrind exe itself, which is
-annoying.  On minimal investigation it seems that the executable isn't
-even listed by aspacem.  This is very strange and not in accordance
-with the Linux or AIX ports.
-
-
 m_main: relatedly, Darwin version does not collect/give out
 initial debuginfo handles; hence ptrcheck won't work
 
index 93433d4f0bfc77959308b07fb6110131db25250d..5cffcd1b643a3b0cff56cfcc89481e7ab828230a 100644 (file)
 // magic mmap() flags
 #define        VKI_MAP_ANONYMOUS MAP_ANON      // linux synonym
 
+// See xnu/osfmk/mach/vm_statistics.h
+#define VKI_VM_MEMORY_MALLOC 1
+#define VKI_VM_MEMORY_MALLOC_SMALL 2
+#define VKI_VM_MEMORY_MALLOC_LARGE 3
+#define VKI_VM_MEMORY_MALLOC_HUGE 4
+#define VKI_VM_MEMORY_BRK 5
+#define VKI_VM_MEMORY_REALLOC 6
+#define VKI_VM_MEMORY_MALLOC_TINY 7
+#define VKI_VM_MEMORY_MALLOC_LARGE_REUSABLE 8
+#define VKI_VM_MEMORY_MALLOC_LARGE_REUSED 9
+#define VKI_VM_MEMORY_ANALYSIS_TOOL 10
+#define VKI_VM_MEMORY_MALLOC_NANO 11
+#define VKI_VM_MEMORY_MALLOC_MEDIUM 12
+#define VKI_VM_MEMORY_MALLOC_PROB_GUARD 13
+#define VKI_VM_MEMORY_MACH_MSG 20
+#define VKI_VM_MEMORY_IOKIT 21
+#define VKI_VM_MEMORY_STACK 30
+#define VKI_VM_MEMORY_GUARD  31
+#define VKI_VM_MEMORY_SHARED_PMAP 32
+#define VKI_VM_MEMORY_DYLIB 33
+#define VKI_VM_MEMORY_OBJC_DISPATCHERS 34
+#define VKI_VM_MEMORY_UNSHARED_PMAP 35
+#define VKI_VM_MEMORY_APPKIT 40
+#define VKI_VM_MEMORY_FOUNDATION 41
+#define VKI_VM_MEMORY_COREGRAPHICS 42
+#define VKI_VM_MEMORY_CORESERVICES 43
+#define VKI_VM_MEMORY_JAVA 44
+#define VKI_VM_MEMORY_COREDATA 45
+#define VKI_VM_MEMORY_COREDATA_OBJECTIDS 46
+#define VKI_VM_MEMORY_ATS 50
+#define VKI_VM_MEMORY_LAYERKIT 51
+#define VKI_VM_MEMORY_CGIMAGE 52
+#define VKI_VM_MEMORY_TCMALLOC 53
+#define VKI_VM_MEMORY_COREGRAPHICS_DATA     54
+#define VKI_VM_MEMORY_COREGRAPHICS_SHARED   55
+#define VKI_VM_MEMORY_COREGRAPHICS_FRAMEBUFFERS     56
+#define VKI_VM_MEMORY_COREGRAPHICS_BACKINGSTORES    57
+#define VKI_VM_MEMORY_COREGRAPHICS_XALLOC 58
+#define VKI_VM_MEMORY_DYLD 60
+#define VKI_VM_MEMORY_DYLD_MALLOC 61
+#define VKI_VM_MEMORY_SQLITE 62
+#define VKI_VM_MEMORY_JAVASCRIPT_CORE 63
+#define VKI_VM_MEMORY_JAVASCRIPT_JIT_EXECUTABLE_ALLOCATOR 64
+#define VKI_VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE 65
+#define VKI_VM_MEMORY_GLSL  66
+#define VKI_VM_MEMORY_OPENCL    67
+#define VKI_VM_MEMORY_COREIMAGE 68
+#define VKI_VM_MEMORY_WEBCORE_PURGEABLE_BUFFERS 69
+#define VKI_VM_MEMORY_IMAGEIO       70
+#define VKI_VM_MEMORY_COREPROFILE   71
+#define VKI_VM_MEMORY_ASSETSD       72
+#define VKI_VM_MEMORY_OS_ALLOC_ONCE 73
+#define VKI_VM_MEMORY_LIBDISPATCH 74
+#define VKI_VM_MEMORY_ACCELERATE 75
+#define VKI_VM_MEMORY_COREUI 76
+#define VKI_VM_MEMORY_COREUIFILE 77
+#define VKI_VM_MEMORY_GENEALOGY 78
+#define VKI_VM_MEMORY_RAWCAMERA 79
+#define VKI_VM_MEMORY_CORPSEINFO 80
+#define VKI_VM_MEMORY_ASL 81
+#define VKI_VM_MEMORY_SWIFT_RUNTIME 82
+#define VKI_VM_MEMORY_SWIFT_METADATA 83
+#define VKI_VM_MEMORY_DHMM 84
+#define VKI_VM_MEMORY_SCENEKIT 86
+#define VKI_VM_MEMORY_SKYWALK 87
+#define VKI_VM_MEMORY_IOSURFACE 88
+#define VKI_VM_MEMORY_LIBNETWORK 89
+#define VKI_VM_MEMORY_AUDIO 90
+#define VKI_VM_MEMORY_VIDEOBITSTREAM 91
+#define VKI_VM_MEMORY_CM_XPC 92
+#define VKI_VM_MEMORY_CM_RPC 93
+#define VKI_VM_MEMORY_CM_MEMORYPOOL 94
+#define VKI_VM_MEMORY_CM_READCACHE 95
+#define VKI_VM_MEMORY_CM_CRABS 96
+#define VKI_VM_MEMORY_QUICKLOOK_THUMBNAILS 97
+#define VKI_VM_MEMORY_ACCOUNTS 98
+#define VKI_VM_MEMORY_SANITIZER 99
+#define VKI_VM_MEMORY_IOACCELERATOR 100
+#define VKI_VM_MEMORY_CM_REGWARP 101
+#define VKI_VM_MEMORY_EAR_DECODER 102
+#define VKI_VM_MEMORY_COREUI_CACHED_IMAGE_DATA 103
+#define VKI_VM_MEMORY_COLORSYNC 104
+#define VKI_VM_MEMORY_BTINFO 105
+#define VKI_VM_MEMORY_CM_HLS 106
+#define VKI_VM_MEMORY_ROSETTA 230
+#define VKI_VM_MEMORY_ROSETTA_THREAD_CONTEXT 231
+#define VKI_VM_MEMORY_ROSETTA_INDIRECT_BRANCH_MAP 232
+#define VKI_VM_MEMORY_ROSETTA_RETURN_STACK 233
+#define VKI_VM_MEMORY_ROSETTA_EXECUTABLE_HEAP 234
+#define VKI_VM_MEMORY_ROSETTA_USER_LDT 235
+#define VKI_VM_MEMORY_ROSETTA_ARENA 236
+#define VKI_VM_MEMORY_ROSETTA_10 239
+#define VKI_VM_MEMORY_APPLICATION_SPECIFIC_1 240
+#define VKI_VM_MEMORY_VALGRIND 242
+#define VKI_VM_MEMORY_APPLICATION_SPECIFIC_16 255
+
 // fds for mmap(MAP_ANON), displayed by vmmap
-#define VM_TAG_VALGRIND VM_MAKE_TAG(239)  // SkAnonV
+#define VM_TAG_VALGRIND VM_MAKE_TAG(VKI_VM_MEMORY_VALGRIND)  // SkAnonV
 
 // page sizes
 #define VKI_MAX_PAGE_SHIFT VKI_PAGE_SHIFT
 #define VKI_MAX_PAGE_SIZE VKI_PAGE_SIZE
 
+// pthread
+#define VKI_PTHREAD_START_CUSTOM 0x01000000
+
 // types
 typedef uint32_t vki_u32;
 
index 9a14f84360b95e989da42362f684b564b63cffae..d4ac9fc202be823c5a60df9f45c4a2c1f5a63da4 100644 (file)
@@ -1664,6 +1664,18 @@ void mc_STOREVn_slow ( Addr a, SizeT nBits, ULong vbytes, Bool bigendian )
 /*--- Setting permissions over address ranges.             ---*/
 /*------------------------------------------------------------*/
 
+#if defined(VGO_darwin)
+#if DARWIN_VERS >= DARWIN_26_00 && 0
+// The new xzm_main_malloc_zone_create makes a 25GB (0x600000000) map in memory so, no choice but to raise the limit...
+# define VA_LARGE_RANGE ( 25UL * 1024 * 1024 * 1024)
+# else
+// Now that we parse the DSC, we might get mmap which are up to 4GB, put 2GB to be safe for now
+# define VA_LARGE_RANGE ( 2UL * 1024 * 1024 * 1024)
+#endif
+#else
+#define VA_LARGE_RANGE 256UL * 1024 * 1024
+#endif
+
 static void set_address_range_perms ( Addr a, SizeT lenT, UWord vabits16,
                                       UWord dsm_num )
 {
@@ -1689,8 +1701,8 @@ static void set_address_range_perms ( Addr a, SizeT lenT, UWord vabits16,
    if (lenT == 0)
       return;
 
-   if (lenT > 256 * 1024 * 1024) {
-      if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
+   if ((ULong)lenT > VA_LARGE_RANGE) {
+      if (VG_(clo_verbosity) > 1 && !VG_(clo_xml)) {
          const HChar* s = "unknown???";
          if (vabits16 == VA_BITS16_NOACCESS ) s = "noaccess";
          if (vabits16 == VA_BITS16_UNDEFINED) s = "undefined";
@@ -5881,7 +5893,21 @@ Bool MC_(is_within_valid_secondary) ( Addr a )
 Bool MC_(is_valid_aligned_word) ( Addr a )
 {
    tl_assert(sizeof(UWord) == 4 || sizeof(UWord) == 8);
+#if defined(VGO_darwin)
+   // on Darwin some of the memcheck/tests/leak-autofreepool-*
+   // tests are failing here. VALGRIND_MALLOCLIKE_BLOCK is passed
+   // an address that is not word aligned. But that's also the case
+   // on other platforms, on FreeBSD leak-autofreepool 0 uses addresses
+   // that are only 2 aligned. The problem is more likely that Darwin
+   // should not be looking at this chunk of memory.
+   if (!VG_IS_WORD_ALIGNED(a) && VG_(clo_verbosity) > 1)
+   {
+      VG_(printf)("In %s, invariant violation, pointer %p should be word aligned\n", __func__, (void*)a);
+      MC_(pp_describe_addr) (VG_(current_DiEpoch)(), a);
+   }
+#else
    tl_assert(VG_IS_WORD_ALIGNED(a));
+#endif
    if (get_vabits8_for_aligned_word32 (a) != VA_BITS8_DEFINED)
       return False;
    if (sizeof(UWord) == 8) {
index f25f99e2243354391ef6117399720321412b3fd0..266c8dd4b85353f47ffff5e2cae8316d1e76f62f 100644 (file)
@@ -55,6 +55,7 @@ int main() {
  pthread_create(&w_2, NULL, Worker, NULL);
  pthread_join(w_1, NULL);
  pthread_join(w_2, NULL);
- printf("\tGLOB=%d\n", GLOB);
+ if (GLOB)
+  printf("\tGLOB was incremented\n");
  return 0;
 }
index f2b5cc1d5733fcefff6c46b7686e82ea0a0cc377..2bf105714df2c25ddd19ecd0f3e89c5ba77869fa 100644 (file)
@@ -1 +1 @@
-       GLOB=0
+       GLOB was incremented
index 9591605767584908a42379c59f7596e0fcab24a5..05f0d3fb40a0dae281a0af15a3222072aff97ece 100644 (file)
@@ -1,2 +1,3 @@
+prereq: ! ../../tests/os_test darwin
 prog: pth_term_signal
 vgopts: -q
index 90d8993195addb8839da5544d482b0c9ff2af413..8f9a0e200da53f62f468d4c2bbb9f78ea2a56e7c 100644 (file)
@@ -82,4 +82,7 @@ $SED '/warning: evaluate_Dwarf3_Expr: unhandled DW_OP_/d' |
 # Suppress Darwin dyld errors
 $SED '/^used_suppression:.*OSX.*dyld.*default.supp:*/d' |
 # Suppress Darwin running dsymutil
-$SED -e '/^run: \/usr\/bin\/dsymutil.*/d' \
+$SED -e '/run: \/usr\/bin\/dsymutil.*/d' |
+# Suppress Darwin unknown mach ports
+$SED -e '/UNKNOWN Mach port modified/d'
+