[compiler-rt] [compiler-rt] [test] Fix using toolchains that rely on Clang default configs (PR #113491)

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 23 13:10:48 PDT 2024


https://github.com/mstorsjo updated https://github.com/llvm/llvm-project/pull/113491

>From 452160c6591eff74ac7cc3723065ead8dc623f4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin at martin.st>
Date: Tue, 22 Oct 2024 15:39:08 +0300
Subject: [PATCH] [compiler-rt] [test] Fix using toolchains that rely on Clang
 default configs

The use of CLANG_NO_DEFAULT_CONFIG in the tests was added because
some Linux distributions had a global default config file, that
added flags relating to hardening, which interfere with the
sanitizer tests. By setting CLANG_NO_DEFAULT_CONFIG, the global
default config files that are found are ignored, and the sanitizers
get the expected default compiler behaviour.

(This was https://github.com/llvm/llvm-project/issues/60394, which
was fixed in 8ab762557fb057af1a3015211ee116a975027e78.)

However, some toolchains may rely on default config files for
mandatory parts required for functioning at all - setting things
like sysroots, -rtlib, -unwindlib, -stdlib, -fuse-ld etc. In such
a case we can't forcibly disable any default config, because it
will break the otherwise working toolchain.

Add a test for whether the compiler works while passing
--no-default-config to it. If the option is accepted and the
toolchain still works while that is set, set CLANG_NO_DEFAULT_CONFIG
while running tests.

(This adds a little bit of inconsistency, as we're testing for the
command line option, while using the environment variable. However
doing compile testing with an environment variable isn't quite as
easily doable, and passing an extra command line flag to all
compile commands while testing, is a bit clumsy - therefore this
inconsistency.)
---
 compiler-rt/CMakeLists.txt                | 16 ++++++++++++++++
 compiler-rt/test/CMakeLists.txt           |  2 ++
 compiler-rt/test/lit.common.cfg.py        |  6 +++++-
 compiler-rt/test/lit.common.configured.in |  1 +
 4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt
index f6072aa40fad0d..20054c6e85a407 100644
--- a/compiler-rt/CMakeLists.txt
+++ b/compiler-rt/CMakeLists.txt
@@ -44,6 +44,22 @@ include(CompilerRTUtils)
 include(CMakeDependentOption)
 include(GetDarwinLinkerVersion)
 
+include(CheckCXXCompilerFlag)
+
+# Check if we can compile with --no-default-config, or if that omits a config
+# file that is essential for the toolchain to work properly.
+#
+# Using CMAKE_REQUIRED_FLAGS to make sure the flag is used both for compilation
+# and for linking.
+#
+# Doing this test early on, to see if the flag works on the toolchain
+# out of the box. Later on, we end up adding -nostdlib and similar flags
+# to all test compiles, which easily can give false positives on this test.
+set(OLD_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --no-default-config")
+check_cxx_compiler_flag("" COMPILER_RT_HAS_NO_DEFAULT_CONFIG_FLAG)
+set(CMAKE_REQUIRED_FLAGS "${OLD_CMAKE_REQUIRED_FLAGS}")
+
 option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON)
 mark_as_advanced(COMPILER_RT_BUILD_BUILTINS)
 option(COMPILER_RT_DISABLE_AARCH64_FMV "Disable AArch64 Function Multi Versioning support" OFF)
diff --git a/compiler-rt/test/CMakeLists.txt b/compiler-rt/test/CMakeLists.txt
index 84a98f36747495..f9e23710d3e4f7 100644
--- a/compiler-rt/test/CMakeLists.txt
+++ b/compiler-rt/test/CMakeLists.txt
@@ -12,6 +12,8 @@ pythonize_bool(COMPILER_RT_ENABLE_INTERNAL_SYMBOLIZER)
 
 pythonize_bool(COMPILER_RT_HAS_AARCH64_SME)
 
+pythonize_bool(COMPILER_RT_HAS_NO_DEFAULT_CONFIG_FLAG)
+
 configure_compiler_rt_lit_site_cfg(
   ${CMAKE_CURRENT_SOURCE_DIR}/lit.common.configured.in
   ${CMAKE_CURRENT_BINARY_DIR}/lit.common.configured)
diff --git a/compiler-rt/test/lit.common.cfg.py b/compiler-rt/test/lit.common.cfg.py
index c3435dd2c52a9e..4bbce4c073666d 100644
--- a/compiler-rt/test/lit.common.cfg.py
+++ b/compiler-rt/test/lit.common.cfg.py
@@ -993,7 +993,11 @@ def is_windows_lto_supported():
 # default configs for the test runs. In particular, anything hardening
 # related is likely to cause issues with sanitizer tests, because it may
 # preempt something we're looking to trap (e.g. _FORTIFY_SOURCE vs our ASAN).
-config.environment["CLANG_NO_DEFAULT_CONFIG"] = "1"
+#
+# Only set this if we know we can still build for the target while disabling
+# default configs.
+if config.has_no_default_config_flag:
+    config.environment["CLANG_NO_DEFAULT_CONFIG"] = "1"
 
 if config.has_compiler_rt_libatomic:
   base_lib = os.path.join(config.compiler_rt_libdir, "libclang_rt.atomic%s.so"
diff --git a/compiler-rt/test/lit.common.configured.in b/compiler-rt/test/lit.common.configured.in
index 049133dc965c31..66935c358afedd 100644
--- a/compiler-rt/test/lit.common.configured.in
+++ b/compiler-rt/test/lit.common.configured.in
@@ -53,6 +53,7 @@ set_default("test_standalone_build_libs", @COMPILER_RT_TEST_STANDALONE_BUILD_LIB
 set_default("has_compiler_rt_libatomic", @COMPILER_RT_BUILD_STANDALONE_LIBATOMIC_PYBOOL@)
 set_default("aarch64_sme", @COMPILER_RT_HAS_AARCH64_SME_PYBOOL@)
 set_default("darwin_linker_version", "@COMPILER_RT_DARWIN_LINKER_VERSION@")
+set_default("has_no_default_config_flag", @COMPILER_RT_HAS_NO_DEFAULT_CONFIG_FLAG_PYBOOL@)
 # True iff the test suite supports ignoring the test compiler's runtime library path
 # and using `config.compiler_rt_libdir` instead. This only matters when the runtime
 # library paths differ.



More information about the llvm-commits mailing list