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