interception_mac.h revision 238901
1130803Smarcel//===-- interception_mac.h --------------------------------------*- C++ -*-===//
2130803Smarcel//
3130803Smarcel//                     The LLVM Compiler Infrastructure
4130803Smarcel//
5130803Smarcel// This file is distributed under the University of Illinois Open Source
6130803Smarcel// License. See LICENSE.TXT for details.
7130803Smarcel//
8130803Smarcel//===----------------------------------------------------------------------===//
9130803Smarcel//
10130803Smarcel// This file is a part of AddressSanitizer, an address sanity checker.
11130803Smarcel//
12130803Smarcel// Mac-specific interception methods.
13130803Smarcel//===----------------------------------------------------------------------===//
14130803Smarcel
15130803Smarcel#ifdef __APPLE__
16130803Smarcel
17130803Smarcel#if !defined(INCLUDED_FROM_INTERCEPTION_LIB)
18130803Smarcel# error "interception_mac.h should be included from interception.h only"
19130803Smarcel#endif
20130803Smarcel
21130803Smarcel#ifndef INTERCEPTION_MAC_H
22130803Smarcel#define INTERCEPTION_MAC_H
23130803Smarcel
24130803Smarcel#include <mach/mach_error.h>
25130803Smarcel#include <stddef.h>
26130803Smarcel
27130803Smarcel// Allocate memory for the escape island. This cannot be moved to
28130803Smarcel// mach_override, because each user of interceptors may specify its
29130803Smarcel// own memory range for escape islands.
30130803Smarcelextern "C" {
31130803Smarcelmach_error_t __interception_allocate_island(void **ptr, size_t unused_size,
32130803Smarcel                                            void *unused_hint);
33130803Smarcelmach_error_t __interception_deallocate_island(void *ptr);
34130803Smarcel}  // extern "C"
35130803Smarcel
36130803Smarcelnamespace __interception {
37130803Smarcel// returns true if the old function existed.
38130803Smarcelbool OverrideFunction(void *old_func, void *new_func, void **orig_old_func);
39130803Smarcel}  // namespace __interception
40130803Smarcel
41130803Smarcel# define OVERRIDE_FUNCTION_MAC(old_func, new_func) \
42130803Smarcel    ::__interception::OverrideFunction((void*)old_func, (void*)new_func, \
43130803Smarcel                                       (void**)&REAL(old_func))
44130803Smarcel# define INTERCEPT_FUNCTION_MAC(func) OVERRIDE_FUNCTION_MAC(func, WRAP(func))
45130803Smarcel
46130803Smarcel#endif  // INTERCEPTION_MAC_H
47130803Smarcel#endif  // __APPLE__
48130803Smarcel