[clang] [Clang][Basic] Add `__has_feature` checks for CFI sanitizers (PR #151348)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
