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("memcpy = __sanitizer_internal_memcpy"); |
21 | asm("memmove = __sanitizer_internal_memmove"); |
22 | asm("memset = __sanitizer_internal_memset"); |
23 | |
24 | # if defined(__cplusplus) && \ |
25 | !defined(SANITIZER_COMMON_REDEFINE_BUILTINS_IN_STD) |
26 | |
27 | // The builtins should not be redefined in source files that make use of C++ |
28 | // standard libraries, in particular where C++STL headers with inline functions |
29 | // are used. The redefinition in such cases would lead to ODR violations. |
30 | // |
31 | // Try to break the build in common cases where builtins shouldn't be redefined. |
32 | namespace std { |
33 | class Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file { |
34 | Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file( |
35 | const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; |
36 | Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file& operator=( |
37 | const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; |
38 | }; |
39 | using array = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
40 | using atomic = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
41 | using function = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
42 | using map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
43 | using set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
44 | using shared_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
45 | using string = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
46 | using unique_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
47 | using unordered_map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
48 | using unordered_set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
49 | using vector = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; |
50 | } // namespace std |
51 | |
52 | # endif // __cpluplus |
53 | # endif // !_WIN32 |
54 | |
55 | # endif // SANITIZER_REDEFINE_BUILTINS_H |
56 | #endif // SANITIZER_COMMON_NO_REDEFINE_BUILTINS |
57 |