diff options
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_mac.cc | 30 | 
1 files changed, 27 insertions, 3 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc index 7d027130d84..70f6daeee70 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cc @@ -799,13 +799,37 @@ void MaybeReexec() {  char **GetArgv() {    return *_NSGetArgv();  } +   +#if defined(__aarch64__) && SANITIZER_IOS && !SANITIZER_IOSSIM +// The task_vm_info struct is normally provided by the macOS SDK, but we need +// fields only available in 10.12+. Declare the struct manually to be able to +// build against older SDKs. +struct __sanitizer_task_vm_info { +  uptr _unused[(SANITIZER_WORDSIZE == 32) ? 20 : 19]; +  uptr min_address; +  uptr max_address; +}; + +uptr GetTaskInfoMaxAddress() { +  __sanitizer_task_vm_info vm_info = {{0}, 0, 0}; +  mach_msg_type_number_t count = sizeof(vm_info) / sizeof(int); +  int err = task_info(mach_task_self(), TASK_VM_INFO, (int *)&vm_info, &count); +  if (err == 0) { +    return vm_info.max_address; +  } else { +    // xnu cannot provide vm address limit +    return 0x200000000 - 1; +  } +} +#endif  uptr GetMaxVirtualAddress() {  #if SANITIZER_WORDSIZE == 64  # if defined(__aarch64__) && SANITIZER_IOS && !SANITIZER_IOSSIM -  // Ideally, we would derive the upper bound from MACH_VM_MAX_ADDRESS. The -  // upper bound can change depending on the device. -  return 0x200000000 - 1; +  // Get the maximum VM address +  static uptr max_vm = GetTaskInfoMaxAddress(); +  CHECK(max_vm); +  return max_vm;  # else    return (1ULL << 47) - 1;  // 0x00007fffffffffffUL;  # endif  | 

