[all-commits] [llvm/llvm-project] 0a71e2: [compiler-rt] Avoid memintrinsic calls inserted by...
Marco Elver via All-commits
all-commits at lists.llvm.org
Tue Jun 6 07:12:56 PDT 2023
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 0a71e25e2448ee471b1ebe74e910c5de9b9c82b4
https://github.com/llvm/llvm-project/commit/0a71e25e2448ee471b1ebe74e910c5de9b9c82b4
Author: Marco Elver <elver at google.com>
Date: 2023-06-06 (Tue, 06 Jun 2023)
Changed paths:
M compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp
M compiler-rt/lib/asan/tests/CMakeLists.txt
M compiler-rt/lib/hwasan/hwasan_interceptors.cpp
M compiler-rt/lib/interception/tests/CMakeLists.txt
M compiler-rt/lib/memprof/memprof_interceptors_memintrinsics.cpp
M compiler-rt/lib/memprof/tests/CMakeLists.txt
M compiler-rt/lib/msan/msan_interceptors.cpp
M compiler-rt/lib/sanitizer_common/CMakeLists.txt
M compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_memintrinsics.inc
M compiler-rt/lib/sanitizer_common/sanitizer_common_interface.inc
M compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h
M compiler-rt/lib/sanitizer_common/sanitizer_libc.cpp
M compiler-rt/lib/sanitizer_common/sanitizer_libc.h
A compiler-rt/lib/sanitizer_common/sanitizer_redefine_builtins.h
M compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
M compiler-rt/lib/tsan/rtl/tsan_interceptors_memintrinsics.cpp
M compiler-rt/lib/tsan/tests/CMakeLists.txt
M compiler-rt/lib/ubsan_minimal/CMakeLists.txt
M compiler-rt/lib/xray/CMakeLists.txt
A compiler-rt/test/asan/TestCases/Linux/check_memcpy.c
A compiler-rt/test/msan/Linux/check_memcpy.c
M compiler-rt/test/tsan/Linux/check_memcpy.c
M llvm/utils/gn/secondary/compiler-rt/lib/sanitizer_common/BUILD.gn
Log Message:
-----------
[compiler-rt] Avoid memintrinsic calls inserted by the compiler
D135716 introduced -ftrivial-auto-var-init=pattern where supported.
Unfortunately this introduces unwanted memset() for large stack arrays,
as shown by the new tests added for asan and msan (tsan already had this
test).
In general, the problem of compiler-inserted memintrinsic calls
(memset/memcpy/memmove) is not new to compiler-rt, and has been a
problem before.
To avoid introducing unwanted memintrinsic calls, we redefine
memintrinsics as __sanitizer_internal_mem* at the assembly level for
most source files automatically (where sanitizer_common_internal_defs.h
is included).
In few cases, redefining a symbol in this way causes issues for
interceptors, namely the memintrinsic interceptor themselves. For such
source files we have to selectively disable the redefinition.
Other alternatives have been considered, but simply do not work well in
the context of compiler-rt:
1. Linker --wrap: this does not work because --wrap only
applies to the final link, and would not apply when building
sanitizer static libraries.
2. Changing references to memset() via objcopy: this may work,
but due to the complexities of the build system, introducing
such a post-processing step for the right object files (in
particular object files defining memset cannot be touched)
seems infeasible.
The chosen solution works well (as shown by the tests). Other libraries
have chosen the same solution where nothing else works (see e.g. glibc's
"symbol-hacks.h").
v4:
- Add interface attribute to __sanitizer_internal_mem* declarations as
well, as otherwise some compilers (MSVC) will complain.
- Add SANITIZER_COMMON_NO_REDEFINE_BUILTINS to source files using
C++STL, since this could lead to ODR violations (see added comment).
v3:
- Don't use ALIAS() to alias internal_mem*() functions to
__sanitizer_internal_mem*() functions, but just define them as
ALWAYS_INLINE functions instead. This will work on darwin and windows.
v2:
- Fix ubsan_minimal build where compiler decides to insert
memset/memcpy: ubsan_minimal has work without RTSanitizerCommonLibc,
therefore do not redefine the builtins.
- Fix definition of internal_mem* functions with compilers that want the
aliased function to already be defined before.
- Fix definition of __sanitizer_internal_mem* functions with compilers
more pedantic about attribute placement around extern "C".
Reviewed By: vitalybuka, dvyukov
Differential Revision: https://reviews.llvm.org/D151152
More information about the All-commits
mailing list