xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_redefine_builtins.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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