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