[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`.
Two tests in `sanitizer_type_traits_test.cpp` need to be disabled since
they have undefined references to `__sanitizer::integral_constant<bool,
true>::value`.

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

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

GitOrigin-RevId: 93b1256e38f63a81561288b9a90c5d52af63cb6e
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 689ce1a..ed49631 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -406,9 +406,11 @@
 
   # 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)
+    list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -O0)
   else()
     list(APPEND SANITIZER_COMMON_CFLAGS -O3)
+    list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -O3)
   endif()
 endif()
 
@@ -443,6 +445,7 @@
     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.
@@ -452,8 +455,13 @@
   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.
+  list(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)
+  list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -g)
+  list(APPEND COMPILER_RT_UNITTEST_CFLAGS -g)
 endif()
 
 if(LLVM_ENABLE_MODULES)
diff --git a/lib/asan/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt
index a0c6d29..22e99df 100644
--- a/lib/asan/tests/CMakeLists.txt
+++ b/lib/asan/tests/CMakeLists.txt
@@ -29,7 +29,6 @@
   -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 @@
   ${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/lib/fuzzer/tests/CMakeLists.txt b/lib/fuzzer/tests/CMakeLists.txt
index 10fcfba..3c70730 100644
--- a/lib/fuzzer/tests/CMakeLists.txt
+++ b/lib/fuzzer/tests/CMakeLists.txt
@@ -4,8 +4,7 @@
   ${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/lib/gwp_asan/tests/CMakeLists.txt b/lib/gwp_asan/tests/CMakeLists.txt
index ef7ea28..7a5dcc4 100644
--- a/lib/gwp_asan/tests/CMakeLists.txt
+++ b/lib/gwp_asan/tests/CMakeLists.txt
@@ -6,7 +6,6 @@
   ${SANITIZER_TEST_CXX_CFLAGS}
   -std=c++17
   -I${COMPILER_RT_SOURCE_DIR}/lib/
-  -O2
   -g
   -fno-omit-frame-pointer)
 
diff --git a/lib/interception/tests/CMakeLists.txt b/lib/interception/tests/CMakeLists.txt
index 37bf99e..5b41e4c 100644
--- a/lib/interception/tests/CMakeLists.txt
+++ b/lib/interception/tests/CMakeLists.txt
@@ -18,7 +18,6 @@
   -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 @@
   ${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/lib/msan/tests/CMakeLists.txt b/lib/msan/tests/CMakeLists.txt
index 6c0520d..ba78ec5 100644
--- a/lib/msan/tests/CMakeLists.txt
+++ b/lib/msan/tests/CMakeLists.txt
@@ -33,7 +33,6 @@
   -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/lib/sanitizer_common/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt
index 41b89aa..f6b49e8 100644
--- a/lib/sanitizer_common/tests/CMakeLists.txt
+++ b/lib/sanitizer_common/tests/CMakeLists.txt
@@ -67,7 +67,6 @@
   -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 @@
   ${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/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp b/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
index d6c3ad4..c28ce7a 100644
--- a/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
+++ b/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp
@@ -69,15 +69,21 @@
 };
 
 TEST(SanitizerCommon, IsTriviallyDestructible) {
+  // Causes undefined references to __sanitizer::integral_constant<bool,
+  // true>::value.
+#if !SANITIZER_DEBUG
   ASSERT_TRUE((is_trivially_destructible<int>::value));
   ASSERT_TRUE((is_trivially_destructible<TestStruct>::value));
+#endif
   ASSERT_FALSE((is_trivially_destructible<std::vector<int>>::value));
 }
 
 TEST(SanitizerCommon, IsTriviallyCopyable) {
+#if !SANITIZER_DEBUG
   ASSERT_TRUE((is_trivially_copyable<int>::value));
   ASSERT_TRUE((is_trivially_copyable<TestStruct>::value));
+#endif
   ASSERT_FALSE((is_trivially_copyable<std::vector<int>>::value));
 }
 
-}  // namespace __sanitizer
\ No newline at end of file
+}  // namespace __sanitizer