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