[compiler-rt] 255c3e3 - Reland "[compiler-rt][test] Heed COMPILER_RT_DEBUG when compiling unittests"

Rainer Orth via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 13 01:59:19 PST 2022


Author: Rainer Orth
Date: 2022-12-13T10:58:58+01:00
New Revision: 255c3e3dcb06299aa2365f70817322a8a381c351

URL: https://github.com/llvm/llvm-project/commit/255c3e3dcb06299aa2365f70817322a8a381c351
DIFF: https://github.com/llvm/llvm-project/commit/255c3e3dcb06299aa2365f70817322a8a381c351.diff

LOG: Reland "[compiler-rt][test] Heed COMPILER_RT_DEBUG when compiling unittests"

When trying to debug some `compiler-rt` unittests, I initially had a hard
time because

- even in a `Debug` build one needs to set `COMPILER_RT_DEBUG` to get
  debugging info for some of the code and
- even so the unittests used a hardcoded `-O2` which often makes debugging
  impossible.

This patch addresses this by instead using `-O0` if `COMPILER_RT_DEBUG`.

Changes relative to the previous commit:

- Use `string(APPEND)` for `COMPILER_RT_TEST_COMPILER_CFLAGS`.
- Omit `-O3` from `COMPILER_RT_TEST_COMPILER_CFLAGS` in non-debug builds for now.
- Provide `__sanitizer::integral_constant<bool, true>::value` instantiation
  for `sanitizer_type_traits_test.cpp` in debug builds.
- Disable subtests of `tsan/tests/unit/tsan_trace_test.cpp` that deadlock
  in debug builds.
- `XFAIL` `tsan/Linux/check_memcpy.c` in debug builds.

Tested on `sparcv9-sun-solaris2.11`, `amd64-pc-solaris2.11`, and
`x86_64-pc-linux-gnu`.

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

Added: 
    

Modified: 
    compiler-rt/CMakeLists.txt
    compiler-rt/lib/asan/tests/CMakeLists.txt
    compiler-rt/lib/fuzzer/tests/CMakeLists.txt
    compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
    compiler-rt/lib/interception/tests/CMakeLists.txt
    compiler-rt/lib/msan/tests/CMakeLists.txt
    compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h
    compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
    compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
    compiler-rt/lib/tsan/tests/unit/tsan_trace_test.cpp
    compiler-rt/test/tsan/Linux/check_memcpy.c

Removed: 
    


################################################################################
diff  --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt
index 77ba6d07b4f89..b95cc4bf53d62 100644
--- a/compiler-rt/CMakeLists.txt
+++ b/compiler-rt/CMakeLists.txt
@@ -436,9 +436,12 @@ if (NOT MSVC)
 
   # Build with optimization, unless we're in debug mode.
   if(COMPILER_RT_DEBUG)
-    list(APPEND SANITIZER_COMMON_CFLAGS -O1)
+    list(APPEND SANITIZER_COMMON_CFLAGS -O0)
+    string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " -O0")
   else()
     list(APPEND SANITIZER_COMMON_CFLAGS -O3)
+    # FIXME: Omit for now, causes testsuite failures.
+    #string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " -O3")
   endif()
 endif()
 
@@ -473,6 +476,7 @@ if(MSVC)
     string(REGEX REPLACE "(^| )/Z[i7I]($| )" " /Z7 "
            "${var_to_update}" "${${var_to_update}}")
   endforeach()
+  list(APPEND COMPILER_RT_UNITTEST_CFLAGS -gcodeview)
 elseif(APPLE)
   # On Apple platforms use full debug info (i.e. not `-gline-tables-only`)
   # for all build types so that the runtime can be debugged.
@@ -482,8 +486,13 @@ elseif(APPLE)
   list(APPEND SANITIZER_COMMON_CFLAGS -g)
 elseif(COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG AND NOT COMPILER_RT_DEBUG)
   list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only)
+  # -gline-tables-only must be enough for these tests, so use it if possible.
+  string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " -gline-tables-only")
+  list(APPEND COMPILER_RT_UNITTEST_CFLAGS -gline-tables-only)
 elseif(COMPILER_RT_HAS_G_FLAG)
   list(APPEND SANITIZER_COMMON_CFLAGS -g)
+  string(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS " -g")
+  list(APPEND COMPILER_RT_UNITTEST_CFLAGS -g)
 endif()
 
 if(LLVM_ENABLE_MODULES)

diff  --git a/compiler-rt/lib/asan/tests/CMakeLists.txt b/compiler-rt/lib/asan/tests/CMakeLists.txt
index a0c6d2910d6f8..22e99dfad6220 100644
--- a/compiler-rt/lib/asan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/asan/tests/CMakeLists.txt
@@ -29,7 +29,6 @@ set(ASAN_UNITTEST_COMMON_CFLAGS
   -I${COMPILER_RT_SOURCE_DIR}/lib/asan
   -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common/tests
   -fno-rtti
-  -O2
   -Wno-format
   -Werror=sign-compare)
 append_list_if(COMPILER_RT_HAS_WVARIADIC_MACROS_FLAG -Wno-variadic-macros ASAN_UNITTEST_COMMON_CFLAGS)
@@ -40,16 +39,6 @@ set(ASAN_UNITTEST_COMMON_LINK_FLAGS
   ${COMPILER_RT_UNITTEST_LINK_FLAGS}
   ${COMPILER_RT_UNWINDER_LINK_LIBS}
   ${SANITIZER_TEST_CXX_LIBRARIES})
-
-# -gline-tables-only must be enough for ASan, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
-  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)
-else()
-  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)
-endif()
-if(MSVC)
-  list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gcodeview)
-endif()
 list(APPEND ASAN_UNITTEST_COMMON_LINK_FLAGS -g)
 
 # Use -D instead of definitions to please custom compile command.

diff  --git a/compiler-rt/lib/fuzzer/tests/CMakeLists.txt b/compiler-rt/lib/fuzzer/tests/CMakeLists.txt
index 10fcfbaa083e5..3c70730654c32 100644
--- a/compiler-rt/lib/fuzzer/tests/CMakeLists.txt
+++ b/compiler-rt/lib/fuzzer/tests/CMakeLists.txt
@@ -4,8 +4,7 @@ set(LIBFUZZER_UNITTEST_CFLAGS
   ${COMPILER_RT_UNITTEST_CFLAGS}
   ${COMPILER_RT_GTEST_CFLAGS}
   -I${COMPILER_RT_SOURCE_DIR}/lib/fuzzer
-  -fno-rtti
-  -O2)
+  -fno-rtti)
 
 if (APPLE)
   set(FUZZER_SUPPORTED_OS osx)

diff  --git a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
index ef7ea28b39837..7a5dcc40f834e 100644
--- a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
@@ -6,7 +6,6 @@ set(GWP_ASAN_UNITTEST_CFLAGS
   ${SANITIZER_TEST_CXX_CFLAGS}
   -std=c++17
   -I${COMPILER_RT_SOURCE_DIR}/lib/
-  -O2
   -g
   -fno-omit-frame-pointer)
 

diff  --git a/compiler-rt/lib/interception/tests/CMakeLists.txt b/compiler-rt/lib/interception/tests/CMakeLists.txt
index 37bf99edaf068..5b41e4c6b567a 100644
--- a/compiler-rt/lib/interception/tests/CMakeLists.txt
+++ b/compiler-rt/lib/interception/tests/CMakeLists.txt
@@ -18,7 +18,6 @@ set(INTERCEPTION_TEST_CFLAGS_COMMON
   -I${COMPILER_RT_SOURCE_DIR}/lib
   -I${COMPILER_RT_SOURCE_DIR}/lib/interception
   -fno-rtti
-  -O2
   -Werror=sign-compare)
 
 set(INTERCEPTION_TEST_LINK_FLAGS_COMMON
@@ -26,14 +25,7 @@ set(INTERCEPTION_TEST_LINK_FLAGS_COMMON
   ${COMPILER_RT_UNWINDER_LINK_LIBS}
   ${SANITIZER_TEST_CXX_LIBRARIES})
 
-# -gline-tables-only must be enough for these tests, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
-  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gline-tables-only)
-else()
-  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -g)
-endif()
 if(MSVC)
-  list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gcodeview)
   list(APPEND INTERCEPTION_TEST_LINK_FLAGS_COMMON
     -Wl,-largeaddressaware
     -Wl,-nodefaultlib:libcmt,-defaultlib:msvcrt,-defaultlib:oldnames

diff  --git a/compiler-rt/lib/msan/tests/CMakeLists.txt b/compiler-rt/lib/msan/tests/CMakeLists.txt
index 6c0520d984263..ba78ec50cd26e 100644
--- a/compiler-rt/lib/msan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/msan/tests/CMakeLists.txt
@@ -33,7 +33,6 @@ set(MSAN_UNITTEST_COMMON_CFLAGS
   -I${COMPILER_RT_SOURCE_DIR}/lib
   -I${COMPILER_RT_SOURCE_DIR}/lib/msan
   -g
-  -O2
   -fno-omit-frame-pointer
   -mno-omit-leaf-frame-pointer
   -Wno-deprecated-declarations

diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h b/compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h
index 06a44d1b5c7af..eb843bd31529d 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_type_traits.h
@@ -98,6 +98,11 @@ struct integral_constant {
   constexpr value_type operator()() const { return value; }
 };
 
+#if !__cpp_inline_variables
+template <typename T, T v>
+constexpr T integral_constant<T, v>::value;
+#endif
+
 #ifndef __has_builtin
 #  define __has_builtin(x) 0
 #endif

diff  --git a/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
index 41b89aa43134f..f6b49e8fc760f 100644
--- a/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
+++ b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
@@ -67,7 +67,6 @@ set(SANITIZER_TEST_CFLAGS_COMMON
   -I${COMPILER_RT_SOURCE_DIR}/lib
   -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common
   -fno-rtti
-  -O2
   -Werror=sign-compare
   -Wno-gnu-zero-variadic-macro-arguments
   )
@@ -76,16 +75,6 @@ set(SANITIZER_TEST_LINK_FLAGS_COMMON
   ${COMPILER_RT_UNITTEST_LINK_FLAGS}
   ${COMPILER_RT_UNWINDER_LINK_LIBS}
   ${SANITIZER_TEST_CXX_LIBRARIES})
-
-# -gline-tables-only must be enough for these tests, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
-  list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gline-tables-only)
-else()
-  list(APPEND SANITIZER_TEST_CFLAGS_COMMON -g)
-endif()
-if(MSVC)
-  list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gcodeview)
-endif()
 list(APPEND SANITIZER_TEST_LINK_FLAGS_COMMON -g)
 
 if(NOT MSVC)

diff  --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
index d6c3ad4b8661d..e4c9e993fb6ba 100644
--- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
+++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
@@ -80,4 +80,4 @@ TEST(SanitizerCommon, IsTriviallyCopyable) {
   ASSERT_FALSE((is_trivially_copyable<std::vector<int>>::value));
 }
 
-}  // namespace __sanitizer
\ No newline at end of file
+}  // namespace __sanitizer

diff  --git a/compiler-rt/lib/tsan/tests/unit/tsan_trace_test.cpp b/compiler-rt/lib/tsan/tests/unit/tsan_trace_test.cpp
index 0d354db548c48..636a5a051cbaa 100644
--- a/compiler-rt/lib/tsan/tests/unit/tsan_trace_test.cpp
+++ b/compiler-rt/lib/tsan/tests/unit/tsan_trace_test.cpp
@@ -23,8 +23,15 @@
 // There must be some 
diff erence in thread initialization
 // between normal execution and unit tests.
 #  define TRACE_TEST(SUITE, NAME) TEST(SUITE, DISABLED_##NAME)
+#  define TRACE_TEST_OPTIMIZED(SUITE, NAME) TEST(SUITE, DISABLED_##NAME)
 #else
 #  define TRACE_TEST(SUITE, NAME) TEST(SUITE, NAME)
+// Some tests deadlock in debug builds.
+#  if !SANITIZER_DEBUG
+#    define TRACE_TEST_OPTIMIZED(SUITE, NAME) TEST(SUITE, NAME)
+#  else
+#    define TRACE_TEST_OPTIMIZED(SUITE, NAME) TEST(SUITE, DISABLED_##NAME)
+#  endif
 #endif
 
 namespace __tsan {
@@ -67,7 +74,7 @@ struct ThreadArray {
   operator ThreadState *() { return threads[0]; }
 };
 
-TRACE_TEST(Trace, RestoreAccess) {
+TRACE_TEST_OPTIMIZED(Trace, RestoreAccess) {
   // A basic test with some function entry/exit events,
   // some mutex lock/unlock events and some other distracting
   // memory events.
@@ -112,7 +119,7 @@ TRACE_TEST(Trace, RestoreAccess) {
   CHECK_EQ(tag, kExternalTagNone);
 }
 
-TRACE_TEST(Trace, MemoryAccessSize) {
+TRACE_TEST_OPTIMIZED(Trace, MemoryAccessSize) {
   // Test tracing and matching of accesses of 
diff erent sizes.
   struct Params {
     uptr access_size, offset, size;
@@ -167,7 +174,7 @@ TRACE_TEST(Trace, MemoryAccessSize) {
   }
 }
 
-TRACE_TEST(Trace, RestoreMutexLock) {
+TRACE_TEST_OPTIMIZED(Trace, RestoreMutexLock) {
   // Check of restoration of a mutex lock event.
   ThreadArray<1> thr;
   TraceFunc(thr, 0x1000);
@@ -197,7 +204,7 @@ TRACE_TEST(Trace, RestoreMutexLock) {
   CHECK_EQ(mset.Get(1).write, false);
 }
 
-TRACE_TEST(Trace, MultiPart) {
+TRACE_TEST_OPTIMIZED(Trace, MultiPart) {
   // Check replay of a trace with multiple parts.
   ThreadArray<1> thr;
   FuncEntry(thr, 0x1000);

diff  --git a/compiler-rt/test/tsan/Linux/check_memcpy.c b/compiler-rt/test/tsan/Linux/check_memcpy.c
index 26f99612e50f5..899062e2ac7b2 100644
--- a/compiler-rt/test/tsan/Linux/check_memcpy.c
+++ b/compiler-rt/test/tsan/Linux/check_memcpy.c
@@ -7,6 +7,8 @@
 // tsan.
 // REQUIRES: shared_unwind
 
+// XFAIL: !compiler-rt-optimized
+
 // RUN: %clang_tsan -O1 %s -o %t
 // RUN: llvm-objdump -d -l %t | FileCheck %s
 


        


More information about the llvm-commits mailing list