106c3fb27SDimitry Andric //===-- sanitizer_redefine_builtins.h ---------------------------*- C++ -*-===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric // 906c3fb27SDimitry Andric // Redefine builtin functions to use internal versions. This is needed where 1006c3fb27SDimitry Andric // compiler optimizations end up producing unwanted libcalls! 1106c3fb27SDimitry Andric // 1206c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 1306c3fb27SDimitry Andric #ifndef SANITIZER_COMMON_NO_REDEFINE_BUILTINS 1406c3fb27SDimitry Andric # ifndef SANITIZER_REDEFINE_BUILTINS_H 1506c3fb27SDimitry Andric # define SANITIZER_REDEFINE_BUILTINS_H 1606c3fb27SDimitry Andric 1706c3fb27SDimitry Andric // The asm hack only works with GCC and Clang. 1806c3fb27SDimitry Andric # if !defined(_WIN32) 1906c3fb27SDimitry Andric 2006c3fb27SDimitry Andric asm("memcpy = __sanitizer_internal_memcpy"); 2106c3fb27SDimitry Andric asm("memmove = __sanitizer_internal_memmove"); 2206c3fb27SDimitry Andric asm("memset = __sanitizer_internal_memset"); 2306c3fb27SDimitry Andric 24*5f757f3fSDimitry Andric # if defined(__cplusplus) && \ 25*5f757f3fSDimitry Andric !defined(SANITIZER_COMMON_REDEFINE_BUILTINS_IN_STD) 26*5f757f3fSDimitry Andric 2706c3fb27SDimitry Andric // The builtins should not be redefined in source files that make use of C++ 2806c3fb27SDimitry Andric // standard libraries, in particular where C++STL headers with inline functions 2906c3fb27SDimitry Andric // are used. The redefinition in such cases would lead to ODR violations. 3006c3fb27SDimitry Andric // 3106c3fb27SDimitry Andric // Try to break the build in common cases where builtins shouldn't be redefined. 3206c3fb27SDimitry Andric namespace std { 3306c3fb27SDimitry Andric class Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file { 3406c3fb27SDimitry Andric Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file( 3506c3fb27SDimitry Andric const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; 3606c3fb27SDimitry Andric Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file& operator=( 3706c3fb27SDimitry Andric const Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file&) = delete; 3806c3fb27SDimitry Andric }; 3906c3fb27SDimitry Andric using array = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4006c3fb27SDimitry Andric using atomic = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4106c3fb27SDimitry Andric using function = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4206c3fb27SDimitry Andric using map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4306c3fb27SDimitry Andric using set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4406c3fb27SDimitry Andric using shared_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4506c3fb27SDimitry Andric using string = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4606c3fb27SDimitry Andric using unique_ptr = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4706c3fb27SDimitry Andric using unordered_map = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4806c3fb27SDimitry Andric using unordered_set = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 4906c3fb27SDimitry Andric using vector = Define_SANITIZER_COMMON_NO_REDEFINE_BUILTINS_in_cpp_file; 5006c3fb27SDimitry Andric } // namespace std 5106c3fb27SDimitry Andric 52*5f757f3fSDimitry Andric # endif // __cpluplus 5306c3fb27SDimitry Andric # endif // !_WIN32 5406c3fb27SDimitry Andric 5506c3fb27SDimitry Andric # endif // SANITIZER_REDEFINE_BUILTINS_H 5606c3fb27SDimitry Andric #endif // SANITIZER_COMMON_NO_REDEFINE_BUILTINS 57