1 | //===-- sanitizer_redefine_builtins.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 | // Redefine builtin functions to use internal versions. This is needed where |
10 | // compiler optimizations end up producing unwanted libcalls! |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | #ifndef SANITIZER_COMMON_NO_REDEFINE_BUILTINS |
14 | # ifndef SANITIZER_REDEFINE_BUILTINS_H |
15 | # define SANITIZER_REDEFINE_BUILTINS_H |
16 | |
17 | // The asm hack only works with GCC and Clang. |
18 | # if !defined(_WIN32) |
19 | |
20 | asm(R"( |
21 | .set memcpy, __sanitizer_internal_memcpy |
22 | .set memmove, __sanitizer_internal_memmove |
23 | .set memset, __sanitizer_internal_memset |
24 | )" ); |
25 | |
26 | # if defined(__cplusplus) && \ |
27 | !defined(SANITIZER_COMMON_REDEFINE_BUILTINS_IN_STD) |
28 | |
29 | // The builtins should not be redefined in source files that make use of C++ |
30 | // standard libraries, in particular where C++STL headers with inline functions |
31 | // are used. The redefinition in such cases would lead to ODR violations. |
32 | // |
33 | // Try to break the build in common cases where builtins shouldn't be redefined. |
34 | namespace std { |
35 | class Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file { |
36 | Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file( |
37 | const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; |
38 | Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file& operator=( |
39 | const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; |
40 | }; |
41 | using array = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
42 | using atomic = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
43 | using function = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
44 | using map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
45 | using set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
46 | using shared_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
47 | using string = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
48 | using unique_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
49 | using unordered_map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
50 | using unordered_set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
51 | using vector = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
52 | } // namespace std |
53 | |
54 | # endif // __cpluplus |
55 | # endif // !_WIN32 |
56 | |
57 | # endif // SANITIZER_REDEFINE_BUILTINS_H |
58 | #endif // SANITIZER_COMMON_NO_REDEFINE_BUILTINS |
59 | |