1e8d8bef9SDimitry Andric //===-- memprof_interceptors.h ---------------------------------*- C++ -*-===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric // 9e8d8bef9SDimitry Andric // This file is a part of MemProfiler, a memory profiler. 10e8d8bef9SDimitry Andric // 11e8d8bef9SDimitry Andric // MemProf-private header for memprof_interceptors.cpp 12e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 13e8d8bef9SDimitry Andric #ifndef MEMPROF_INTERCEPTORS_H 14e8d8bef9SDimitry Andric #define MEMPROF_INTERCEPTORS_H 15e8d8bef9SDimitry Andric 16e8d8bef9SDimitry Andric #include "interception/interception.h" 17e8d8bef9SDimitry Andric #include "memprof_interceptors_memintrinsics.h" 18e8d8bef9SDimitry Andric #include "memprof_internal.h" 19e8d8bef9SDimitry Andric #include "sanitizer_common/sanitizer_platform_interceptors.h" 20e8d8bef9SDimitry Andric 21e8d8bef9SDimitry Andric namespace __memprof { 22e8d8bef9SDimitry Andric 23e8d8bef9SDimitry Andric void InitializeMemprofInterceptors(); 24e8d8bef9SDimitry Andric void InitializePlatformInterceptors(); 25e8d8bef9SDimitry Andric 26e8d8bef9SDimitry Andric #define ENSURE_MEMPROF_INITED() \ 27e8d8bef9SDimitry Andric do { \ 28e8d8bef9SDimitry Andric CHECK(!memprof_init_is_running); \ 29e8d8bef9SDimitry Andric if (UNLIKELY(!memprof_inited)) { \ 30e8d8bef9SDimitry Andric MemprofInitFromRtl(); \ 31e8d8bef9SDimitry Andric } \ 32e8d8bef9SDimitry Andric } while (0) 33e8d8bef9SDimitry Andric 34e8d8bef9SDimitry Andric } // namespace __memprof 35e8d8bef9SDimitry Andric 36e8d8bef9SDimitry Andric DECLARE_REAL(int, memcmp, const void *a1, const void *a2, uptr size) 37e8d8bef9SDimitry Andric DECLARE_REAL(char *, strchr, const char *str, int c) 38e8d8bef9SDimitry Andric DECLARE_REAL(SIZE_T, strlen, const char *s) 39e8d8bef9SDimitry Andric DECLARE_REAL(char *, strncpy, char *to, const char *from, uptr size) 40e8d8bef9SDimitry Andric DECLARE_REAL(uptr, strnlen, const char *s, uptr maxlen) 41e8d8bef9SDimitry Andric DECLARE_REAL(char *, strstr, const char *s1, const char *s2) 42e8d8bef9SDimitry Andric 43e8d8bef9SDimitry Andric #define MEMPROF_INTERCEPT_FUNC(name) \ 44e8d8bef9SDimitry Andric do { \ 45e8d8bef9SDimitry Andric if (!INTERCEPT_FUNCTION(name)) \ 46e8d8bef9SDimitry Andric VReport(1, "MemProfiler: failed to intercept '%s'\n'", #name); \ 47e8d8bef9SDimitry Andric } while (0) 48e8d8bef9SDimitry Andric #define MEMPROF_INTERCEPT_FUNC_VER(name, ver) \ 49e8d8bef9SDimitry Andric do { \ 50e8d8bef9SDimitry Andric if (!INTERCEPT_FUNCTION_VER(name, ver)) \ 51349cc55cSDimitry Andric VReport(1, "MemProfiler: failed to intercept '%s@@%s'\n", #name, ver); \ 52e8d8bef9SDimitry Andric } while (0) 53fe6060f1SDimitry Andric #define MEMPROF_INTERCEPT_FUNC_VER_UNVERSIONED_FALLBACK(name, ver) \ 54fe6060f1SDimitry Andric do { \ 55fe6060f1SDimitry Andric if (!INTERCEPT_FUNCTION_VER(name, ver) && !INTERCEPT_FUNCTION(name)) \ 56fe6060f1SDimitry Andric VReport(1, "MemProfiler: failed to intercept '%s@@%s' or '%s'\n", #name, \ 57349cc55cSDimitry Andric ver, #name); \ 58fe6060f1SDimitry Andric } while (0) 59e8d8bef9SDimitry Andric 60*06c3fb27SDimitry Andric #define MEMPROF_INTERCEPTOR_ENTER(ctx, func) \ 61*06c3fb27SDimitry Andric ctx = 0; \ 62*06c3fb27SDimitry Andric (void)ctx; 63*06c3fb27SDimitry Andric 64*06c3fb27SDimitry Andric #define COMMON_INTERCEPT_FUNCTION(name) MEMPROF_INTERCEPT_FUNC(name) 65*06c3fb27SDimitry Andric 66e8d8bef9SDimitry Andric #endif // MEMPROF_INTERCEPTORS_H 67