diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt
--- a/compiler-rt/CMakeLists.txt
+++ b/compiler-rt/CMakeLists.txt
@@ -364,8 +364,10 @@
   # Build with optimization, unless we're in debug mode.
   if(COMPILER_RT_DEBUG)
     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 -O2)
   endif()
 endif()
 
@@ -402,8 +404,10 @@
   endforeach()
 elseif(COMPILER_RT_HAS_GLINE_TABLES_ONLY_FLAG AND NOT COMPILER_RT_DEBUG)
   list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only)
+  list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -gline-tables-only)
 elseif(COMPILER_RT_HAS_G_FLAG)
   list(APPEND SANITIZER_COMMON_CFLAGS -g)
+  list(APPEND COMPILER_RT_TEST_COMPILER_CFLAGS -g3)
 endif()
 
 if(LLVM_ENABLE_MODULES)
diff --git a/compiler-rt/lib/asan/tests/CMakeLists.txt b/compiler-rt/lib/asan/tests/CMakeLists.txt
--- a/compiler-rt/lib/asan/tests/CMakeLists.txt
+++ b/compiler-rt/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,8 +39,10 @@
   ${COMPILER_RT_UNITTEST_LINK_FLAGS})
 
 # -gline-tables-only must be enough for ASan, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
+if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang" AND NOT COMPILER_RT_DEBUG)
   list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -gline-tables-only)
+elseif(COMPILER_RT_DEBUG)
+  # -g3 already in COMPILER_RT_UNITEST_CFLAGS.
 else()
   list(APPEND ASAN_UNITTEST_COMMON_CFLAGS -g)
 endif()
diff --git a/compiler-rt/lib/fuzzer/tests/CMakeLists.txt b/compiler-rt/lib/fuzzer/tests/CMakeLists.txt
--- a/compiler-rt/lib/fuzzer/tests/CMakeLists.txt
+++ b/compiler-rt/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/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
--- a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
@@ -4,7 +4,6 @@
   ${COMPILER_RT_UNITTEST_CFLAGS}
   ${COMPILER_RT_GTEST_CFLAGS}
   -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
--- a/compiler-rt/lib/interception/tests/CMakeLists.txt
+++ b/compiler-rt/lib/interception/tests/CMakeLists.txt
@@ -17,15 +17,16 @@
   -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
   ${COMPILER_RT_UNITTEST_LINK_FLAGS})
 
 # -gline-tables-only must be enough for these tests, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
+if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang" AND NOT COMPILER_RT_DEBUG)
   list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -gline-tables-only)
+elseif(COMPILER_RT_DEBUG)
+  # -g3 already in COMPILER_RT_UNITEST_CFLAGS.
 else()
   list(APPEND INTERCEPTION_TEST_CFLAGS_COMMON -g)
 endif()
diff --git a/compiler-rt/lib/msan/tests/CMakeLists.txt b/compiler-rt/lib/msan/tests/CMakeLists.txt
--- a/compiler-rt/lib/msan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/msan/tests/CMakeLists.txt
@@ -32,7 +32,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/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
--- a/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
+++ b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt
@@ -57,7 +57,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
   )
@@ -65,8 +64,10 @@
 set(SANITIZER_TEST_LINK_FLAGS_COMMON ${COMPILER_RT_UNITTEST_LINK_FLAGS})
 
 # -gline-tables-only must be enough for these tests, so use it if possible.
-if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang")
+if(COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang" AND NOT COMPILER_RT_DEBUG)
   list(APPEND SANITIZER_TEST_CFLAGS_COMMON -gline-tables-only)
+elseif(COMPILER_RT_DEBUG)
+  # -g3 already in COMPILER_RT_UNITEST_CFLAGS.
 else()
   list(APPEND SANITIZER_TEST_CFLAGS_COMMON -g)
 endif()
diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp
--- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp
+++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp
@@ -68,6 +68,9 @@
   UnmapOrDie(mapping, 2 * ps);
 }
 
+void BufferedStackTrace::UnwindImpl(uptr, uptr, void *, bool, u32) {
+}
+
 #if SANITIZER_CAN_FAST_UNWIND && !defined(__sparc__)
 // Fake stacks don't meet SPARC UnwindFast requirements.