diff options
| author | Dan Liew <dan@su-root.co.uk> | 2025-11-21 19:01:31 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-21 19:01:31 -0800 |
| commit | 8bdbc57b8975d77da88562392299ee5d9c2b6cbb (patch) | |
| tree | 52b371b6b9d452c990cf56a6054d24d5233f5a9e | |
| parent | 54a4da9df6906b63878ad6d0ea6da3ed7d2d8432 (diff) | |
[NFC][LLDB] Make it possible to detect if the compiler used in tests supports -fbounds-safety (#169112)
This patch makes it possible to detect in LLDB shell and API tests if
`-fbounds-safety` is supported by the compiler used for testing. The
motivation behind this is to allow upstreaming
https://github.com/swiftlang/llvm-project/pull/11835 but with the tests
disabled in upstream because the full implementation of -fbounds-safety
isn't available in Clang yet.
For shell tests when -fbounds-safety is available the
`clang-bounds-safety` feature is available which means tests can be
annotated with `# REQUIRES: clang-bounds-safety`.
API tests that need -fbounds-safety support in the compiler can use the
new `@skipUnlessBoundsSafety` decorator.
rdar://165225507
| -rw-r--r-- | lldb/packages/Python/lldbsuite/test/decorators.py | 10 | ||||
| -rw-r--r-- | lldb/test/Shell/helper/toolchain.py | 3 | ||||
| -rw-r--r-- | llvm/utils/lit/lit/llvm/config.py | 30 |
3 files changed, 43 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py index 23d2165e07f7..7311b17f97e0 100644 --- a/lldb/packages/Python/lldbsuite/test/decorators.py +++ b/lldb/packages/Python/lldbsuite/test/decorators.py @@ -1059,6 +1059,16 @@ def skipUnlessAddressSanitizer(func): return skipTestIfFn(is_compiler_with_address_sanitizer)(func) +def skipUnlessBoundsSafety(func): + """Decorate the item to skip test unless Clang -fbounds-safety is supported.""" + + def is_compiler_with_bounds_safety(): + if not _compiler_supports(lldbplatformutil.getCompiler(), "-fbounds-safety"): + return "Compiler cannot compile with -fbounds-safety" + return None + + return skipTestIfFn(is_compiler_with_bounds_safety)(func) + def skipIfAsan(func): """Skip this test if the environment is set up to run LLDB *itself* under ASAN.""" return skipTestIfFn(is_running_under_asan)(func) diff --git a/lldb/test/Shell/helper/toolchain.py b/lldb/test/Shell/helper/toolchain.py index faa29d23387c..b9e7dd7c196a 100644 --- a/lldb/test/Shell/helper/toolchain.py +++ b/lldb/test/Shell/helper/toolchain.py @@ -277,6 +277,9 @@ def use_support_substitutions(config): required=True, use_installed=True, ) + if llvm_config.clang_has_bounds_safety(): + llvm_config.lit_config.note("clang has -fbounds-safety support") + config.available_features.add("clang-bounds-safety") if sys.platform == "win32": _use_msvc_substitutions(config) diff --git a/llvm/utils/lit/lit/llvm/config.py b/llvm/utils/lit/lit/llvm/config.py index 59982c94b787..f212928caee1 100644 --- a/llvm/utils/lit/lit/llvm/config.py +++ b/llvm/utils/lit/lit/llvm/config.py @@ -293,6 +293,17 @@ class LLVMConfig(object): except OSError: self.lit_config.fatal("Could not run process %s" % command) + def check_process_success(self, command): + cp = subprocess.run( + command, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + env=self.config.environment, + ) + if cp.returncode == 0: + return True + return False + def feature_config(self, features): # Ask llvm-config about the specified feature. arguments = [x for (x, _) in features] @@ -334,6 +345,25 @@ class LLVMConfig(object): # Ensure the result is an ascii string, across Python2.5+ - Python3. return clang_dir + def clang_has_bounds_safety(self, additional_flags=None): + """ + Return True iff `self.config.clang` supports -fbounds-safety + """ + if not self.config.clang: + return False + if not os.path.exists(self.config.clang): + return False + if additional_flags is None: + additional_flags = [] + # Invoke the clang driver to see if it supports the `-fbounds-safety` + # flag. Only the downstream implementation has this flag so this is + # a simple way to check if the full implementation is available or not. + cmd = [self.config.clang] + additional_flags + cmd += ["-fbounds-safety", "-###"] + if self.check_process_success(cmd): + return True + return False + # On macOS, LSan is only supported on clang versions 5 and higher def get_clang_has_lsan(self, clang, triple): if not clang: |
