[compiler-rt] 2f856a3 - [msan] Blacklist __gxx_personality_v0.

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 31 10:23:03 PDT 2019


Author: Evgenii Stepanov
Date: 2019-10-31T10:22:52-07:00
New Revision: 2f856a36e0b270b184051d10a18d4b4238b4c033

URL: https://github.com/llvm/llvm-project/commit/2f856a36e0b270b184051d10a18d4b4238b4c033
DIFF: https://github.com/llvm/llvm-project/commit/2f856a36e0b270b184051d10a18d4b4238b4c033.diff

LOG: [msan] Blacklist __gxx_personality_v0.

Summary:
Fixes https://bugs.llvm.org/show_bug.cgi?id=31877.
Fixes https://github.com/google/sanitizers/issues/1155.

Enables exceptions in msan/tsan buid of libcxx, and in msan tests.

-fdepfile-entry stuff is a workaround for
https://reviews.llvm.org/D69290 (default blacklist missing from -MMD
output).

Reviewers: pcc, dvyukov

Subscribers: mgorny, christof, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D69587

Added: 
    

Modified: 
    compiler-rt/cmake/Modules/AddCompilerRT.cmake
    compiler-rt/cmake/Modules/CustomLibcxx/CMakeLists.txt
    compiler-rt/lib/msan/CMakeLists.txt
    compiler-rt/lib/msan/msan_blacklist.txt
    compiler-rt/lib/msan/tests/CMakeLists.txt
    compiler-rt/lib/msan/tests/msan_test.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/cmake/Modules/AddCompilerRT.cmake b/compiler-rt/cmake/Modules/AddCompilerRT.cmake
index 7c9505e66cec..b87ab6a91d42 100644
--- a/compiler-rt/cmake/Modules/AddCompilerRT.cmake
+++ b/compiler-rt/cmake/Modules/AddCompilerRT.cmake
@@ -623,6 +623,7 @@ macro(add_custom_libcxx name prefix)
     USES_TERMINAL_BUILD 1
     USES_TERMINAL_INSTALL 1
     EXCLUDE_FROM_ALL TRUE
+    BUILD_BYPRODUCTS "${prefix}/lib/libc++.a" "${prefix}/lib/libc++abi.a"
     )
 
   if (CMAKE_GENERATOR MATCHES "Make")

diff  --git a/compiler-rt/cmake/Modules/CustomLibcxx/CMakeLists.txt b/compiler-rt/cmake/Modules/CustomLibcxx/CMakeLists.txt
index 3b1eb910ec86..e61c222587e6 100644
--- a/compiler-rt/cmake/Modules/CustomLibcxx/CMakeLists.txt
+++ b/compiler-rt/cmake/Modules/CustomLibcxx/CMakeLists.txt
@@ -4,7 +4,7 @@ project(custom-libcxx C CXX)
 # Build static libcxxabi.
 set(LIBCXXABI_STANDALONE_BUILD 1)
 set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
-set(LIBCXXABI_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
+set(LIBCXXABI_ENABLE_EXCEPTIONS ON CACHE BOOL "")
 set(LIBCXXABI_HERMETIC_STATIC_LIBRARY ON CACHE STRING "")
 set(LIBCXXABI_LIBCXX_PATH ${COMPILER_RT_LIBCXX_PATH} CACHE PATH "")
 set(LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "")

diff  --git a/compiler-rt/lib/msan/CMakeLists.txt b/compiler-rt/lib/msan/CMakeLists.txt
index 9e9bf6543932..86e96a01a118 100644
--- a/compiler-rt/lib/msan/CMakeLists.txt
+++ b/compiler-rt/lib/msan/CMakeLists.txt
@@ -81,6 +81,7 @@ foreach(arch ${MSAN_SUPPORTED_ARCH})
 endforeach()
 
 add_compiler_rt_resource_file(msan_blacklist msan_blacklist.txt msan)
+list(APPEND MSAN_RUNTIME_LIBRARIES msan_blacklist)
 
 if(COMPILER_RT_INCLUDE_TESTS)
   add_subdirectory(tests)

diff  --git a/compiler-rt/lib/msan/msan_blacklist.txt b/compiler-rt/lib/msan/msan_blacklist.txt
index 44a5680d4d06..3efef5712185 100644
--- a/compiler-rt/lib/msan/msan_blacklist.txt
+++ b/compiler-rt/lib/msan/msan_blacklist.txt
@@ -5,3 +5,6 @@
 # Example usage:
 # fun:*bad_function_name*
 # src:file_with_tricky_code.cc
+
+# https://bugs.llvm.org/show_bug.cgi?id=31877
+fun:__gxx_personality_*

diff  --git a/compiler-rt/lib/msan/tests/CMakeLists.txt b/compiler-rt/lib/msan/tests/CMakeLists.txt
index 9949e81a2c12..541356fc68d8 100644
--- a/compiler-rt/lib/msan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/msan/tests/CMakeLists.txt
@@ -8,7 +8,9 @@ include_directories(../..)
 set(MSAN_LIBCXX_CFLAGS
   -fsanitize=memory
   -fsanitize-memory-track-origins
-  -Wno-pedantic)
+  -Wno-pedantic
+  -Xclang -fdepfile-entry=${COMPILER_RT_OUTPUT_DIR}/share/msan_blacklist.txt
+  )
 
 # Unittest sources and build flags.
 set(MSAN_UNITTEST_SOURCES
@@ -32,7 +34,6 @@ set(MSAN_UNITTEST_COMMON_CFLAGS
   -I${COMPILER_RT_SOURCE_DIR}/lib/msan
   -g
   -O2
-  -fno-exceptions
   -fno-omit-frame-pointer
   -mno-omit-leaf-frame-pointer
   -Wno-deprecated-declarations
@@ -114,13 +115,14 @@ macro(add_msan_tests_for_arch arch kind cflags)
 
   set(MSAN_TEST_OBJECTS ${MSAN_INST_TEST_OBJECTS} ${MSAN_INST_GTEST})
   set(MSAN_TEST_DEPS ${MSAN_TEST_OBJECTS} libcxx_msan_${arch}-build
-                     ${MSAN_LOADABLE_SO})
+                     ${MSAN_LOADABLE_SO}
+		     "${MSAN_LIBCXX_DIR}/libc++.a" "${MSAN_LIBCXX_DIR}/libc++abi.a")
   if(NOT COMPILER_RT_STANDALONE_BUILD)
     list(APPEND MSAN_TEST_DEPS msan)
   endif()
   get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
   add_compiler_rt_test(MsanUnitTests "Msan-${arch}${kind}-Test" ${arch}
-    OBJECTS ${MSAN_TEST_OBJECTS} "${MSAN_LIBCXX_DIR}/libc++.a"
+    OBJECTS ${MSAN_TEST_OBJECTS} "${MSAN_LIBCXX_DIR}/libc++.a" "${MSAN_LIBCXX_DIR}/libc++abi.a"
     DEPS ${MSAN_TEST_DEPS}
     LINK_FLAGS ${MSAN_UNITTEST_LINK_FLAGS}
                ${TARGET_LINK_FLAGS})

diff  --git a/compiler-rt/lib/msan/tests/msan_test.cpp b/compiler-rt/lib/msan/tests/msan_test.cpp
index c1cae3dad1fc..2d67b6ff645a 100644
--- a/compiler-rt/lib/msan/tests/msan_test.cpp
+++ b/compiler-rt/lib/msan/tests/msan_test.cpp
@@ -4798,3 +4798,32 @@ TEST(MemorySanitizer, Bmi) {
   }
 }
 #endif // defined(__x86_64__)
+
+namespace {
+volatile long z;
+
+__attribute__((noinline,optnone)) void f(long a, long b, long c, long d, long e, long f) {
+  z = a + b + c + d + e + f;
+}
+
+__attribute__((noinline,optnone)) void throw_stuff() {
+  throw 5;
+}
+
+TEST(MemorySanitizer, throw_catch) {
+  long x;
+  // Poison __msan_param_tls.
+  __msan_poison(&x, sizeof(x));
+  f(x, x, x, x, x, x);
+  try {
+    // This calls __gxx_personality_v0 through some libgcc_s function.
+    // __gxx_personality_v0 is instrumented, libgcc_s is not; as a result,
+    // __msan_param_tls is not updated and __gxx_personality_v0 can find
+    // leftover poison from the previous call.
+    // A suppression in msan_blacklist.txt makes it work.
+    throw_stuff();
+  } catch (const int &e) {
+    // pass
+  }
+}
+} // namespace


        


More information about the llvm-commits mailing list