[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-08 Thread via cfe-commits

github-actions[bot] wrote:



@moorabbit Congratulations on having your first Pull Request (PR) merged into 
the LLVM Project!

Your changes will be combined with recent changes from other authors, then 
tested by our [build bots](https://lab.llvm.org/buildbot/). If there is a 
problem with a build, you may receive a report in an email or a comment on this 
PR.

Please check whether problems have been caused by your change specifically, as 
the builds can include changes from many authors. It is not uncommon for your 
change to be included in a build that fails due to someone else's changes, or 
infrastructure issues.

How to do this, and the rest of the post-merge process, is covered in detail 
[here](https://llvm.org/docs/MyFirstTypoFix.html#myfirsttypofix-issues-after-landing-your-pr).

If your change does cause a problem, it may be reverted, or you can revert it 
yourself. This is a normal part of [LLVM 
development](https://llvm.org/docs/DeveloperPolicy.html#patch-reversion-policy).
 You can fix your changes and open a new PR to merge them again.

If you don't get any reports, no action is required from you. Your changes are 
working as expected, well done!


https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-08 Thread Florian Mayer via cfe-commits

fmayer wrote:

Thanks!

https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-08 Thread Florian Mayer via cfe-commits

https://github.com/fmayer closed 
https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread via cfe-commits

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

>From 49149a0334d8882d24cc35a1d8f3f2af72343145 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Wed, 30 Jul 2025 10:50:58 -0400
Subject: [PATCH 1/8] [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 0..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 75b03606601a8dfe689f68bd418c6eaafa40ae52 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Thu, 31 Jul 2025 06:48:57 -0400
Subject: [PATCH 2/8] 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] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread Florian Mayer via cfe-commits

fmayer wrote:

> Added a REQUIRES: target={{x86_64.*-linux.*}} in my last commit to fix the 
> test failure on windows (-fsanitize=cfi-mfcall is not supported on windows) .
Since this PR is only adding a preprocessor feature and not something platform 
specific, I think it's fine to only test on x86_64-linux and skip other targets?


Yeah, I did the same with the UBSan change.

https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread via cfe-commits

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

>From 49149a0334d8882d24cc35a1d8f3f2af72343145 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Wed, 30 Jul 2025 10:50:58 -0400
Subject: [PATCH 1/8] [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 0..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 75b03606601a8dfe689f68bd418c6eaafa40ae52 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Thu, 31 Jul 2025 06:48:57 -0400
Subject: [PATCH 2/8] 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] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread via cfe-commits

moorabbit wrote:

Added a `REQUIRES: target={{x86_64.*-linux.*}}` in my last commit to fix the 
test failure on windows.
Since this PR is only adding a preprocessor feature and not something platform 
specific, I think it's fine to only test on x86_64-linux and skip other targets?

https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread via cfe-commits

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

>From 49149a0334d8882d24cc35a1d8f3f2af72343145 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Wed, 30 Jul 2025 10:50:58 -0400
Subject: [PATCH 1/8] [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 0..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 75b03606601a8dfe689f68bd418c6eaafa40ae52 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Thu, 31 Jul 2025 06:48:57 -0400
Subject: [PATCH 2/8] 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] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-07 Thread via cfe-commits

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

>From 49149a0334d8882d24cc35a1d8f3f2af72343145 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Wed, 30 Jul 2025 10:50:58 -0400
Subject: [PATCH 1/7] [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 0..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 75b03606601a8dfe689f68bd418c6eaafa40ae52 Mon Sep 17 00:00:00 2001
From: moorabbit 
Date: Thu, 31 Jul 2025 06:48:57 -0400
Subject: [PATCH 2/7] 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] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-06 Thread via cfe-commits

https://github.com/moorabbit edited 
https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)

2025-08-06 Thread via cfe-commits

https://github.com/moorabbit edited 
https://github.com/llvm/llvm-project/pull/151348
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits