https://github.com/moorabbit updated 
https://github.com/llvm/llvm-project/pull/151348

>From fe34b28a97875ed27b8888a768942d9624655950 Mon Sep 17 00:00:00 2001
From: moorabbit <moorab...@proton.me>
Date: Wed, 30 Jul 2025 10:50:58 -0400
Subject: [PATCH 1/2] [Clang][Basic] Enable `__has_feature(cfi)`

Support `__has_feature(cfi)` to check for control flow integrity sanitizers.
---
 clang/include/clang/Basic/Features.def   |  1 +
 clang/include/clang/Basic/Sanitizers.def |  2 +-
 clang/test/Lexer/has_feature_cfi.c       | 18 ++++++++++++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Lexer/has_feature_cfi.c

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
+

>From 9733879c9e8dfdbcbebe5f958af9ef0893202ac8 Mon Sep 17 00:00:00 2001
From: moorabbit <moorab...@proton.me>
Date: Thu, 31 Jul 2025 06:48:57 -0400
Subject: [PATCH 2/2] Add more test cases

---
 clang/include/clang/Basic/Features.def |  2 +-
 clang/test/Lexer/has_feature_cfi.c     | 15 ++++++++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/Features.def 
b/clang/include/clang/Basic/Features.def
index 4beb9a51dcf0b..35833268755f5 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -303,7 +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(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI | 
SanitizerKind::KCFI))
 FEATURE(kcfi, LangOpts.Sanitize.has(SanitizerKind::KCFI))
 FEATURE(kcfi_arity, LangOpts.Sanitize.has(SanitizerKind::KCFI))
 FEATURE(modules, LangOpts.Modules)
diff --git a/clang/test/Lexer/has_feature_cfi.c 
b/clang/test/Lexer/has_feature_cfi.c
index df472944e6d9e..b7b3db4897ab1 100644
--- a/clang/test/Lexer/has_feature_cfi.c
+++ b/clang/test/Lexer/has_feature_cfi.c
@@ -5,7 +5,20 @@
 // 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
+
+// RUN: %clang_cc1 -E -fsanitize=kcfi -o - %s | FileCheck 
--check-prefix=CHECK-CFISAN %s
+
+// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi 
-flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN
+// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi 
-fsanitize-cfi-cross-dso -flto -c %s -o - | FileCheck %s 
--check-prefix=CHECK-CFISAN
+
+// Disable CFI sanitizers.
+// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden 
-fno-sanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFISAN
+
+// Disable some but not all CFI schemes.
+// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi 
-fno-sanitize-cfi-cross-dso 
-fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall -flto -c %s -o - | 
FileCheck %s --check-prefix=CHECK-CFISAN
+
+// Disable all CFI schemes. This essentially disables CFI sanitizers.
+// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fsanitize=cfi 
-fno-sanitize-cfi-cross-dso 
-fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall,cfi-cast-strict,cfi-derived-cast,cfi-unrelated-cast
 -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFISAN
 
 #if __has_feature(cfi)
 int CFISanitizerEnabled();

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to