2011-11-30 09:07:02 +08:00
|
|
|
//===-- asan_mac.h ----------------------------------------------*- C++ -*-===//
|
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file is a part of AddressSanitizer, an address sanity checker.
|
|
|
|
//
|
|
|
|
// ASan-private header for asan_mac.cc
|
|
|
|
//===----------------------------------------------------------------------===//
|
2011-12-02 05:40:52 +08:00
|
|
|
#ifdef __APPLE__
|
|
|
|
|
2011-11-30 09:07:02 +08:00
|
|
|
#ifndef ASAN_MAC_H
|
|
|
|
#define ASAN_MAC_H
|
|
|
|
|
|
|
|
#include "asan_interceptors.h"
|
|
|
|
|
|
|
|
// TODO(glider): need to check if the OS X version is 10.6 or greater.
|
|
|
|
#include <dispatch/dispatch.h>
|
|
|
|
#include <setjmp.h>
|
2012-01-23 18:09:54 +08:00
|
|
|
#include <CoreFoundation/CFString.h>
|
2011-11-30 09:07:02 +08:00
|
|
|
|
2012-01-31 21:19:18 +08:00
|
|
|
enum {
|
|
|
|
MACOS_VERSION_UNKNOWN = 0,
|
|
|
|
MACOS_VERSION_LEOPARD,
|
|
|
|
MACOS_VERSION_SNOW_LEOPARD,
|
|
|
|
MACOS_VERSION_LION,
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace __asan {
|
|
|
|
int GetMacosVersion();
|
|
|
|
}
|
|
|
|
|
2011-11-30 09:07:02 +08:00
|
|
|
typedef void* pthread_workqueue_t;
|
|
|
|
typedef void* pthread_workitem_handle_t;
|
|
|
|
|
|
|
|
typedef void (*dispatch_function_t)(void *block);
|
|
|
|
typedef void* (*worker_t)(void *block);
|
2012-02-02 18:39:40 +08:00
|
|
|
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(void, dispatch_async_f, dispatch_queue_t dq,
|
|
|
|
void *ctxt,
|
|
|
|
dispatch_function_t func);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(void, dispatch_sync_f, dispatch_queue_t dq,
|
|
|
|
void *ctxt,
|
|
|
|
dispatch_function_t func);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(void, dispatch_after_f, dispatch_time_t when,
|
|
|
|
dispatch_queue_t dq,
|
|
|
|
void *ctxt,
|
|
|
|
dispatch_function_t func);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(void, dispatch_barrier_async_f,
|
|
|
|
dispatch_queue_t dq,
|
|
|
|
void *ctxt,
|
|
|
|
dispatch_function_t func);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(void, dispatch_group_async_f,
|
|
|
|
dispatch_group_t group,
|
|
|
|
dispatch_queue_t dq,
|
|
|
|
void *ctxt,
|
|
|
|
dispatch_function_t func);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(int, pthread_workqueue_additem_np,
|
|
|
|
pthread_workqueue_t workq,
|
|
|
|
void *(*workitem_func)(void *),
|
|
|
|
void * workitem_arg,
|
|
|
|
pthread_workitem_handle_t * itemhandlep,
|
|
|
|
unsigned int *gencountp);
|
|
|
|
DECLARE_REAL_AND_INTERCEPTOR(CFStringRef, CFStringCreateCopy,
|
|
|
|
CFAllocatorRef alloc,
|
|
|
|
CFStringRef str);
|
2011-11-30 09:07:02 +08:00
|
|
|
|
|
|
|
// A wrapper for the ObjC blocks used to support libdispatch.
|
|
|
|
typedef struct {
|
|
|
|
void *block;
|
|
|
|
dispatch_function_t func;
|
|
|
|
int parent_tid;
|
|
|
|
} asan_block_context_t;
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
// dispatch_barrier_async_f() is not declared in <dispatch/dispatch.h>.
|
|
|
|
void dispatch_barrier_async_f(dispatch_queue_t dq,
|
|
|
|
void *ctxt, dispatch_function_t func);
|
|
|
|
// Neither is pthread_workqueue_additem_np().
|
|
|
|
int pthread_workqueue_additem_np(pthread_workqueue_t workq,
|
|
|
|
void *(*workitem_func)(void *), void * workitem_arg,
|
|
|
|
pthread_workitem_handle_t * itemhandlep, unsigned int *gencountp);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // ASAN_MAC_H
|
2011-12-02 05:40:52 +08:00
|
|
|
|
|
|
|
#endif // __APPLE__
|