[clang] Handle __declspec() attributes in using
[llvm-project.git] / compiler-rt / lib / sanitizer_common / sanitizer_win_weak_interception.h
blob5e4d8b8def3e7da74b9f6dcb075cf7d149f1fcc4
1 //===-- sanitizer_win_weak_interception.h ---------------------------------===//
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 // This header provide helper macros to delegate calls of weak functions to the
9 // implementation in the main executable when a strong definition is present.
10 //===----------------------------------------------------------------------===//
11 #ifndef SANITIZER_WIN_WEAK_INTERCEPTION_H
12 #define SANITIZER_WIN_WEAK_INTERCEPTION_H
13 #include "sanitizer_internal_defs.h"
15 namespace __sanitizer {
16 int interceptWhenPossible(uptr dll_function, const char *real_function);
19 // ----------------- Function interception helper macros -------------------- //
20 // Weak functions, could be redefined in the main executable, but that is not
21 // necessary, so we shouldn't die if we can not find a reference.
22 #define INTERCEPT_WEAK(Name) interceptWhenPossible((uptr) Name, #Name);
24 #define INTERCEPT_SANITIZER_WEAK_FUNCTION(Name) \
25 static int intercept_##Name() { \
26 return __sanitizer::interceptWhenPossible((__sanitizer::uptr) Name, #Name);\
27 } \
28 __pragma(section(".WEAK$M", long, read)) \
29 __declspec(allocate(".WEAK$M")) int (*__weak_intercept_##Name)() = \
30 intercept_##Name;
32 #endif // SANITIZER_WIN_WEAK_INTERCEPTION_H