[clang] [Clang][Basic] Enable `__has_feature(cfi)` (PR #151348)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 30 08:00:50 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (moorabbit)
<details>
<summary>Changes</summary>
Support `__has_feature(cfi)` to check for control flow integrity sanitizers.
Fixes #<!-- -->151022
---
Full diff: https://github.com/llvm/llvm-project/pull/151348.diff
3 Files Affected:
- (modified) clang/include/clang/Basic/Features.def (+1)
- (modified) clang/include/clang/Basic/Sanitizers.def (+1-1)
- (added) clang/test/Lexer/has_feature_cfi.c (+18)
``````````diff
diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
index 72f23614aef11..4beb9a51dcf0b 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -303,6 +303,7 @@ FEATURE(is_trivially_assignable, LangOpts.CPlusPlus)
FEATURE(is_trivially_constructible, LangOpts.CPlusPlus)
FEATURE(is_trivially_copyable, LangOpts.CPlusPlus)
FEATURE(is_union, LangOpts.CPlusPlus)
+FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI))
FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
FEATURE(kcfi_arity, LangOpts.Sanitize.has(SanitizerKind::KCFI))
FEATURE(modules, LangOpts.Modules)
diff --git a/clang/include/clang/Basic/Sanitizers.def b/clang/include/clang/Basic/Sanitizers.def
index 1d0e97cc7fb4c..aad758ceb9d40 100644
--- a/clang/include/clang/Basic/Sanitizers.def
+++ b/clang/include/clang/Basic/Sanitizers.def
@@ -134,7 +134,7 @@ SANITIZER("cfi-nvcall", CFINVCall)
SANITIZER("cfi-vcall", CFIVCall)
SANITIZER_GROUP("cfi", CFI,
CFIDerivedCast | CFIICall | CFIMFCall | CFIUnrelatedCast |
- CFINVCall | CFIVCall)
+ CFINVCall | CFIVCall | CFICastStrict)
// Kernel Control Flow Integrity
SANITIZER("kcfi", KCFI)
diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c
new file mode 100644
index 0000000000000..df472944e6d9e
--- /dev/null
+++ b/clang/test/Lexer/has_feature_cfi.c
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -E -fsanitize=cfi-cast-strict -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-derived-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-icall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-mfcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-unrelated-cast -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-nvcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E -fsanitize=cfi-vcall -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s
+// RUN: %clang_cc1 -E %s -o - | FileCheck --check-prefix=CHECK-NO-CFISAN %s
+
+#if __has_feature(cfi)
+int CFISanitizerEnabled();
+#else
+int CFISanitizerDisabled();
+#endif
+
+// CHECK-CFISAN: CFISanitizerEnabled
+// CHECK-NO-CFISAN: CFISanitizerDisabled
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/151348
More information about the cfe-commits
mailing list