1//===-- sanitizer_mac.h -----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is shared between various sanitizers' runtime libraries and
10// provides definitions for OSX-specific functions.
11//===----------------------------------------------------------------------===//
12#ifndef SANITIZER_APPLE_H
13#define SANITIZER_APPLE_H
14
15#include "sanitizer_common.h"
16#include "sanitizer_platform.h"
17#if SANITIZER_APPLE
18#include "sanitizer_posix.h"
19
20namespace __sanitizer {
21
22struct MemoryMappingLayoutData {
23 int current_image;
24 u32 current_magic;
25 u32 current_filetype;
26 ModuleArch current_arch;
27 u8 current_uuid[kModuleUUIDSize];
28 int current_load_cmd_count;
29 const char *current_load_cmd_addr;
30 bool current_instrumented;
31};
32
33template <typename VersionType>
34struct VersionBase {
35 u16 major;
36 u16 minor;
37
38 VersionBase(u16 major, u16 minor) : major(major), minor(minor) {}
39
40 bool operator==(const VersionType &other) const {
41 return major == other.major && minor == other.minor;
42 }
43 bool operator>=(const VersionType &other) const {
44 return major > other.major ||
45 (major == other.major && minor >= other.minor);
46 }
47 bool operator<(const VersionType &other) const { return !(*this >= other); }
48};
49
50struct MacosVersion : VersionBase<MacosVersion> {
51 MacosVersion(u16 major, u16 minor) : VersionBase(major, minor) {}
52};
53
54struct DarwinKernelVersion : VersionBase<DarwinKernelVersion> {
55 DarwinKernelVersion(u16 major, u16 minor) : VersionBase(major, minor) {}
56};
57
58MacosVersion GetMacosAlignedVersion();
59DarwinKernelVersion GetDarwinKernelVersion();
60
61char **GetEnviron();
62
63void RestrictMemoryToMaxAddress(uptr max_address);
64
65using ThreadEventCallback = void (*)(uptr thread);
66using ThreadCreateEventCallback = void (*)(uptr thread, bool gcd_worker);
67struct ThreadEventCallbacks {
68 ThreadCreateEventCallback create;
69 ThreadEventCallback start;
70 ThreadEventCallback terminate;
71 ThreadEventCallback destroy;
72};
73
74void InstallPthreadIntrospectionHook(const ThreadEventCallbacks &callbacks);
75
76} // namespace __sanitizer
77
78#endif // SANITIZER_APPLE
79#endif // SANITIZER_APPLE_H
80