https://github.com/moorabbit updated https://github.com/llvm/llvm-project/pull/151348
>From 49149a0334d8882d24cc35a1d8f3f2af72343145 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> 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 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 75b03606601a8dfe689f68bd418c6eaafa40ae52 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> 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 -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(); >From d741f6546cac859436fb0820b43381a4267079d4 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Fri, 1 Aug 2025 00:01:47 -0400 Subject: [PATCH 3/8] add `-fno-sanitize-ignorelist` to fix CI build issue --- clang/test/Lexer/has_feature_cfi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c index b7b3db4897ab1..8227833701442 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -8,14 +8,14 @@ // 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 +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize-ignorelist -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 +// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize-ignorelist -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 >From b6a7ce7e3f4f51ca71f813d931362a710abd7d87 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Fri, 1 Aug 2025 15:14:13 -0400 Subject: [PATCH 4/8] Fix driver test failure --- clang/include/clang/Basic/Features.def | 2 +- clang/include/clang/Basic/Sanitizers.def | 2 +- clang/test/Lexer/has_feature_cfi.c | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 35833268755f5..371fba29a1776 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 | SanitizerKind::KCFI)) +FEATURE(cfi, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI | SanitizerKind::CFICastStrict | 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/include/clang/Basic/Sanitizers.def b/clang/include/clang/Basic/Sanitizers.def index aad758ceb9d40..1d0e97cc7fb4c 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 | CFICastStrict) + CFINVCall | CFIVCall) // 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 index 8227833701442..e0f9d4aeb3371 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -8,17 +8,17 @@ // RUN: %clang_cc1 -E -fsanitize=kcfi -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s -// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN -// RUN: %clang -E --target=x86_64-linux-gnu -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN +// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN +// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -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 +// RUN: %clang -E -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 -fno-sanitize-ignorelist -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 +// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -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 +// RUN: %clang -E -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(); >From 7da5378cf18634deb2d5cd45605f9cf17a81393b Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Tue, 5 Aug 2025 23:08:09 -0400 Subject: [PATCH 5/8] PiJoules suggestion --- clang/include/clang/Basic/Features.def | 9 ++- clang/test/Lexer/has_feature_cfi.c | 84 ++++++++++++++++++++------ 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 371fba29a1776..30e5080fd25b4 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -303,7 +303,14 @@ 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 | SanitizerKind::CFICastStrict | SanitizerKind::KCFI)) +FEATURE(cfi_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI | SanitizerKind::CFICastStrict | SanitizerKind::KCFI)) +FEATURE(cfi_cast_strict_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFICastStrict)) +FEATURE(cfi_derived_cast_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast)) +FEATURE(cfi_icall_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIICall)) +FEATURE(cfi_mfcall_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIMFCall)) +FEATURE(cfi_unrelated_cast_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast)) +FEATURE(cfi_nvcall_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFINVCall)) +FEATURE(cfi_vcall_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIVCall)) 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 e0f9d4aeb3371..0f7ceb748aa1e 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -1,31 +1,77 @@ -// 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 -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI +// RUN: %clang -E -fsanitize=kcfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI +// CHECK-CFI: CFISanitizerEnabled -// RUN: %clang_cc1 -E -fsanitize=kcfi -o - %s | FileCheck --check-prefix=CHECK-CFISAN %s +// RUN: %clang -E -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFI +// CHECK-NO-CFI: CFISanitizerDisabled -// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN -// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-CFISAN +// RUN: %clang -E -fsanitize=cfi-cast-strict -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-CAST-STRICT +// CHECK-CFI-CAST-STRICT: CFICastStrictSanitizerEnabled -// Disable CFI sanitizers. -// RUN: %clang -E -fvisibility=hidden -fno-sanitize=cfi -flto -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFISAN +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-derived-cast -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-DERIVED-CAST +// CHECK-CFI-DERIVED-CAST: CFIDerivedCastSanitizerEnabled -// Disable some but not all CFI schemes. -// RUN: %clang -E -fvisibility=hidden -fno-sanitize-ignorelist -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 +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-icall -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-ICALL +// CHECK-CFI-ICALL: CFIICallSanitizerEnabled -// Disable all CFI schemes. This essentially disables CFI sanitizers. -// RUN: %clang -E -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 +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-mfcall -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-MFCALL +// CHECK-CFI-MFCALL: CFIMFCallSanitizerEnabled -#if __has_feature(cfi) +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-unrelated-cast -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-UNRELATED-CAST +// CHECK-CFI-UNRELATED-CAST: CFIUnrelatedCastSanitizerEnabled + +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-nvcall -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-NVCALL +// CHECK-CFI-NVCALL: CFINVCallSanitizerEnabled + +// RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-vcall -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-VCALL +// CHECK-CFI-VCALL: CFIVCallSanitizerEnabled + +#if __has_feature(cfi_sanitizer) int CFISanitizerEnabled(); #else int CFISanitizerDisabled(); #endif -// CHECK-CFISAN: CFISanitizerEnabled -// CHECK-NO-CFISAN: CFISanitizerDisabled +#if __has_feature(cfi_cast_strict_sanitizer) +int CFICastStrictSanitizerEnabled(); +#else +int CFICastStrictSanitizerDisabled(); +#endif + +#if __has_feature(cfi_derived_cast_sanitizer) +int CFIDerivedCastSanitizerEnabled(); +#else +int CFIDerivedCastSanitizerDisabled(); +#endif + +#if __has_feature(cfi_icall_sanitizer) +int CFIICallSanitizerEnabled(); +#else +int CFIICallSanitizerDisabled(); +#endif + +#if __has_feature(cfi_mfcall_sanitizer) +int CFIMFCallSanitizerEnabled(); +#else +int CFIMFCallSanitizerDisabled(); +#endif + +#if __has_feature(cfi_unrelated_cast_sanitizer) +int CFIUnrelatedCastSanitizerEnabled(); +#else +int CFIUnrelatedCastSanitizerDisabled(); +#endif +#if __has_feature(cfi_nvcall_sanitizer) +int CFINVCallSanitizerEnabled(); +#else +int CFINVCallSanitizerDisabled(); +#endif + +#if __has_feature(cfi_vcall_sanitizer) +int CFIVCallSanitizerEnabled(); +#else +int CFIVCallSanitizerDisabled(); +#endif >From fded769211e223b05ba48936da62706945f73c4a Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Wed, 6 Aug 2025 15:08:38 -0400 Subject: [PATCH 6/8] PiJoules suggestions --- clang/include/clang/Basic/Features.def | 2 +- clang/test/Lexer/has_feature_cfi.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 30e5080fd25b4..c58e3f2400adc 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_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI | SanitizerKind::CFICastStrict | SanitizerKind::KCFI)) +FEATURE(cfi_sanitizer, LangOpts.Sanitize.hasOneOf(SanitizerKind::CFI)) FEATURE(cfi_cast_strict_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFICastStrict)) FEATURE(cfi_derived_cast_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIDerivedCast)) FEATURE(cfi_icall_sanitizer, LangOpts.Sanitize.has(SanitizerKind::CFIICall)) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c index 0f7ceb748aa1e..3a8667f3f468c 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -1,13 +1,15 @@ // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI -// RUN: %clang -E -fsanitize=kcfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // CHECK-CFI: CFISanitizerEnabled // RUN: %clang -E -c %s -o - | FileCheck %s --check-prefix=CHECK-NO-CFI // CHECK-NO-CFI: CFISanitizerDisabled -// RUN: %clang -E -fsanitize=cfi-cast-strict -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-CAST-STRICT +// RUN: %clang -E -fsanitize=kcfi -c %s -o - | FileCheck %s --check-prefixes=CHECK-KCFI,CHECK-NO-CFI +// CHECK-KCFI: KCFISanitizerEnabled + +// RUN: %clang -E -fsanitize=cfi-cast-strict -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI-CAST-STRICT // CHECK-CFI-CAST-STRICT: CFICastStrictSanitizerEnabled // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi-derived-cast -c %s -o - | FileCheck %s --check-prefixes=CHECK-CFI,CHECK-CFI-DERIVED-CAST @@ -34,6 +36,12 @@ int CFISanitizerEnabled(); int CFISanitizerDisabled(); #endif +#if __has_feature(kcfi) +int KCFISanitizerEnabled(); +#else +int KCFISanitizerDisabled(); +#endif + #if __has_feature(cfi_cast_strict_sanitizer) int CFICastStrictSanitizerEnabled(); #else >From cc13c4baf0d71c8faa9d8cfe6c021c0d1ad5fb8e Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Thu, 7 Aug 2025 00:07:05 -0400 Subject: [PATCH 7/8] Fix test failure on windows --- clang/test/Lexer/has_feature_cfi.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c index 3a8667f3f468c..593b04624b5a7 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -1,3 +1,5 @@ +// REQUIRES: system-linux + // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fno-sanitize=cfi-nvcall,cfi-vcall,cfi-mfcall,cfi-icall -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI >From 64556aa4cef0fce6345aa543652326b2a240a4c7 Mon Sep 17 00:00:00 2001 From: moorabbit <moorab...@proton.me> Date: Thu, 7 Aug 2025 07:11:31 -0400 Subject: [PATCH 8/8] Specify the target platform the test is allowed to run on --- clang/test/Lexer/has_feature_cfi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Lexer/has_feature_cfi.c b/clang/test/Lexer/has_feature_cfi.c index 593b04624b5a7..a4e5803f68ce7 100644 --- a/clang/test/Lexer/has_feature_cfi.c +++ b/clang/test/Lexer/has_feature_cfi.c @@ -1,4 +1,4 @@ -// REQUIRES: system-linux +// REQUIRES: target={{x86_64.*-linux.*}} // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI // RUN: %clang -E -fvisibility=hidden -flto -fno-sanitize-ignorelist -fsanitize=cfi -fsanitize-cfi-cross-dso -c %s -o - | FileCheck %s --check-prefix=CHECK-CFI _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits