[compiler-rt] [llvm] [LLVM][compiler-rt] Fix build with LLVM_USE_SANITIZER=Undefined (PR #120006)

Dmitry Chestnykh via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 15 07:00:59 PST 2024


https://github.com/chestnykh created https://github.com/llvm/llvm-project/pull/120006

Fix #120003
The patch contains fixes to all the errors described in the issue attachement

>From dec27b39d8f998acbede27d93857aed56d59b243 Mon Sep 17 00:00:00 2001
From: Dmitry Chestnykh <dm.chestnykh at gmail.com>
Date: Sun, 15 Dec 2024 18:03:01 +0300
Subject: [PATCH] [LLVM][compiler-rt] Fix build with
 LLVM_USE_SANITIZER=Undefined

Fix #120003
The patch contains fixes to all the errors described
in the issue attachement
---
 compiler-rt/cmake/config-ix.cmake             |   3 +-
 .../lib/scudo/standalone/tests/CMakeLists.txt |   2 +
 compiler-rt/test/CMakeLists.txt               | 126 +++++++++---------
 llvm/CMakeLists.txt                           |   9 +-
 llvm/cmake/modules/HandleLLVMOptions.cmake    |   3 +-
 5 files changed, 80 insertions(+), 63 deletions(-)

diff --git a/compiler-rt/cmake/config-ix.cmake b/compiler-rt/cmake/config-ix.cmake
index 6d52eecc9a91fe..25b0f6e2f3e2d5 100644
--- a/compiler-rt/cmake/config-ix.cmake
+++ b/compiler-rt/cmake/config-ix.cmake
@@ -931,7 +931,8 @@ endif()
 # calling malloc on first use.
 # TODO(hctim): Enable this on Android again. Looks like it's causing a SIGSEGV
 # for Scudo and GWP-ASan, further testing needed.
-if (GWP_ASAN_SUPPORTED_ARCH AND
+if (COMPILER_RT_HAS_SANITIZER_COMMON AND
+    GWP_ASAN_SUPPORTED_ARCH AND
     COMPILER_RT_BUILD_GWP_ASAN AND
     COMPILER_RT_BUILD_SANITIZERS AND
     "gwp_asan" IN_LIST COMPILER_RT_SANITIZERS_TO_BUILD AND
diff --git a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
index a85eb737dba0a8..d33fb051143757 100644
--- a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
+++ b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
@@ -1,5 +1,7 @@
 include_directories(..)
 
+include(CompilerRTCompile)
+
 add_custom_target(ScudoUnitTests)
 set_target_properties(ScudoUnitTests PROPERTIES
   FOLDER "Compiler-RT Tests")
diff --git a/compiler-rt/test/CMakeLists.txt b/compiler-rt/test/CMakeLists.txt
index f9e23710d3e4f7..3f87e69964f91a 100644
--- a/compiler-rt/test/CMakeLists.txt
+++ b/compiler-rt/test/CMakeLists.txt
@@ -46,75 +46,81 @@ if(NOT ANDROID)
   endif()
 endif()
 
-umbrella_lit_testsuite_begin(check-compiler-rt)
-
-function(compiler_rt_test_runtime runtime)
-  string(TOUPPER ${runtime} runtime_uppercase)
-  if(COMPILER_RT_HAS_${runtime_uppercase} AND COMPILER_RT_INCLUDE_TESTS)
-    if (${runtime} STREQUAL cfi AND NOT COMPILER_RT_HAS_UBSAN)
-      # CFI tests require diagnostic mode, which is implemented in UBSan.
-    elseif (${runtime} STREQUAL scudo_standalone)
-      add_subdirectory(scudo/standalone)
-    else()
-      add_subdirectory(${runtime})
+# XXX: Maybe more precise conditions to enable/disable tests
+# But now the below code is broken at least with LLVM_USE_SANITIZER=Undefined
+if(NOT LLVM_USE_SANITIZER)
+
+  umbrella_lit_testsuite_begin(check-compiler-rt)
+
+  function(compiler_rt_test_runtime runtime)
+    string(TOUPPER ${runtime} runtime_uppercase)
+    if(COMPILER_RT_HAS_${runtime_uppercase} AND COMPILER_RT_INCLUDE_TESTS)
+      if (${runtime} STREQUAL cfi AND NOT COMPILER_RT_HAS_UBSAN)
+        # CFI tests require diagnostic mode, which is implemented in UBSan.
+      elseif (${runtime} STREQUAL scudo_standalone)
+        add_subdirectory(scudo/standalone)
+      else()
+        add_subdirectory(${runtime})
+      endif()
     endif()
-  endif()
-endfunction()
+  endfunction()
 
-# Run sanitizer tests only if we're sure that clang would produce
-# working binaries.
-if(COMPILER_RT_CAN_EXECUTE_TESTS)
-  if(COMPILER_RT_BUILD_BUILTINS)
-    add_subdirectory(builtins)
-  endif()
-  if(COMPILER_RT_BUILD_SANITIZERS)
-    compiler_rt_test_runtime(interception)
+  # Run sanitizer tests only if we're sure that clang would produce
+  # working binaries.
+  if(COMPILER_RT_CAN_EXECUTE_TESTS)
+    if(COMPILER_RT_BUILD_BUILTINS)
+      add_subdirectory(builtins)
+    endif()
+    if(COMPILER_RT_BUILD_SANITIZERS)
+      compiler_rt_test_runtime(interception)
 
-    compiler_rt_test_runtime(lsan)
-    compiler_rt_test_runtime(ubsan)
-    compiler_rt_test_runtime(sanitizer_common)
+      compiler_rt_test_runtime(lsan)
+      compiler_rt_test_runtime(ubsan)
+      compiler_rt_test_runtime(sanitizer_common)
 
-    # OpenBSD not supporting asan, cannot run the tests
-    if(COMPILER_RT_BUILD_LIBFUZZER AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD" AND NOT ANDROID)
-      compiler_rt_test_runtime(fuzzer)
+      # OpenBSD not supporting asan, cannot run the tests
+      if(COMPILER_RT_BUILD_LIBFUZZER AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD" AND NOT ANDROID)
+        compiler_rt_test_runtime(fuzzer)
 
-      # These tests don't need an additional runtime but use asan runtime.
-      add_subdirectory(metadata)
-    endif()
+        # These tests don't need an additional runtime but use asan runtime.
+        add_subdirectory(metadata)
+      endif()
 
-    foreach(sanitizer ${COMPILER_RT_SANITIZERS_TO_BUILD})
-      compiler_rt_test_runtime(${sanitizer})
-    endforeach()
-  endif()
-  if(COMPILER_RT_BUILD_PROFILE AND COMPILER_RT_HAS_PROFILE)
-    compiler_rt_test_runtime(profile)
-  endif()
-  if(COMPILER_RT_BUILD_CTX_PROFILE)
-    compiler_rt_test_runtime(ctx_profile)
-  endif()
-  if(COMPILER_RT_BUILD_MEMPROF)
-    compiler_rt_test_runtime(memprof)
-  endif()
-  if(COMPILER_RT_BUILD_XRAY)
-    compiler_rt_test_runtime(xray)
+      foreach(sanitizer ${COMPILER_RT_SANITIZERS_TO_BUILD})
+        compiler_rt_test_runtime(${sanitizer})
+      endforeach()
+    endif()
+    if(COMPILER_RT_BUILD_PROFILE AND COMPILER_RT_HAS_PROFILE)
+      compiler_rt_test_runtime(profile)
+    endif()
+    if(COMPILER_RT_BUILD_CTX_PROFILE)
+      compiler_rt_test_runtime(ctx_profile)
+    endif()
+    if(COMPILER_RT_BUILD_MEMPROF)
+      compiler_rt_test_runtime(memprof)
+    endif()
+    if(COMPILER_RT_BUILD_XRAY)
+      compiler_rt_test_runtime(xray)
+    endif()
+    if(COMPILER_RT_BUILD_ORC)
+      compiler_rt_Test_runtime(orc)
+    endif()
+    # ShadowCallStack does not yet provide a runtime with compiler-rt, the tests
+    # include their own minimal runtime
+    add_subdirectory(shadowcallstack)
   endif()
-  if(COMPILER_RT_BUILD_ORC)
-    compiler_rt_Test_runtime(orc)
+
+  # Now that we've traversed all the directories and know all the lit testsuites,
+  # introduce a rule to run to run all of them.
+  get_property(LLVM_COMPILER_RT_LIT_DEPENDS GLOBAL PROPERTY LLVM_COMPILER_RT_LIT_DEPENDS)
+  add_custom_target(compiler-rt-test-depends)
+  set_target_properties(compiler-rt-test-depends PROPERTIES FOLDER "Compiler-RT/Tests")
+  if(LLVM_COMPILER_RT_LIT_DEPENDS)
+    add_dependencies(compiler-rt-test-depends ${LLVM_COMPILER_RT_LIT_DEPENDS})
   endif()
-  # ShadowCallStack does not yet provide a runtime with compiler-rt, the tests
-  # include their own minimal runtime
-  add_subdirectory(shadowcallstack)
-endif()
+  umbrella_lit_testsuite_end(check-compiler-rt)
 
-# Now that we've traversed all the directories and know all the lit testsuites,
-# introduce a rule to run to run all of them.
-get_property(LLVM_COMPILER_RT_LIT_DEPENDS GLOBAL PROPERTY LLVM_COMPILER_RT_LIT_DEPENDS)
-add_custom_target(compiler-rt-test-depends)
-set_target_properties(compiler-rt-test-depends PROPERTIES FOLDER "Compiler-RT/Tests")
-if(LLVM_COMPILER_RT_LIT_DEPENDS)
-  add_dependencies(compiler-rt-test-depends ${LLVM_COMPILER_RT_LIT_DEPENDS})
-endif()
-umbrella_lit_testsuite_end(check-compiler-rt)
+endif(LLVM_USE_SANITIZER)
 
 if(COMPILER_RT_STANDALONE_BUILD)
   if(NOT TARGET check-all)
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index f14065ab037990..f4bd6ceaa681d1 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -707,8 +707,15 @@ endif( LLVM_USE_PERF )
 set(LLVM_USE_SANITIZER "" CACHE STRING
   "Define the sanitizer used to build binaries and tests.")
 option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
+
+if( CMAKE_C_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
+  set(LLVM_UBSAN_FLAGS_CLANG "-fno-sanitize=function")
+else()
+  # gcc doesn't know about -fsanitize=function
+  set(LLVM_UBSAN_FLAGS_CLANG)
+endif()
 set(LLVM_UBSAN_FLAGS
-    "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
+    "-fsanitize=undefined -fno-sanitize=vptr ${LLVM_UBSAN_FLAGS_CLANG} -fno-sanitize-recover=all"
     CACHE STRING
     "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.")
 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake
index f19125eb6bf273..76ace6a1a951e8 100644
--- a/llvm/cmake/modules/HandleLLVMOptions.cmake
+++ b/llvm/cmake/modules/HandleLLVMOptions.cmake
@@ -1064,7 +1064,8 @@ if(LLVM_USE_SANITIZER)
   if (LLVM_USE_SANITIZE_COVERAGE)
     append("-fsanitize=fuzzer-no-link" CMAKE_C_FLAGS CMAKE_CXX_FLAGS)
   endif()
-  if (LLVM_USE_SANITIZER MATCHES ".*Undefined.*")
+  if (LLVM_USE_SANITIZER MATCHES ".*Undefined.*" AND CMAKE_C_COMPILER_ID MATCHES "Clang" AND
+		                                     CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     set(IGNORELIST_FILE "${PROJECT_SOURCE_DIR}/utils/sanitizers/ubsan_ignorelist.txt")
     if (EXISTS "${IGNORELIST_FILE}")
       # Use this option name version since -fsanitize-ignorelist is only



More information about the llvm-commits mailing list