[clang] [clang] Add `__has_feature(swiftcc)` support (PR #85347)
Yuta Saito via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 15 09:27:48 PDT 2024
https://github.com/kateinoigakukun updated https://github.com/llvm/llvm-project/pull/85347
>From 50da3b82e9c38c6f706b3f7c08ffc5bbb417f124 Mon Sep 17 00:00:00 2001
From: Yuta Saito <kateinoigakukun at gmail.com>
Date: Fri, 15 Mar 2024 00:43:43 +0000
Subject: [PATCH] [clang] Add `__has_extension(swiftcc)` support
This patch adds `swiftcc` extension to check if the target supports Swift
calling convention as well as we do for `swiftasynccc`.
Also `swiftasynccc` is now considered to be a Clang extension rather than a
language standard feature to reflect the nature of the attribute.
---
clang/docs/ReleaseNotes.rst | 6 ++++++
clang/include/clang/Basic/AttrDocs.td | 13 +++++++++----
clang/include/clang/Basic/Features.def | 5 ++++-
clang/test/Sema/swift-call-conv.c | 7 ++++++-
4 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 459f6a25aeef7b..9617573df3c454 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -215,6 +215,12 @@ for the full list.
This allows the ``_Nullable`` and ``_Nonnull` family of type attributes to
apply to this class.
+- The ``swiftasynccc`` attribute is now considered to be a Clang extension
+ rather than a language standard feature. Please use
+ ``__has_extension(swiftasynccc)`` to check the availability of this attribute
+ for the target platform instead of ``__has_feature(swiftasynccc)``. Also,
+ added a new extension query ``__has_extension(swiftcc)`` corresponding to the
+ ``__attribute__((swiftcc))`` attribute.
Improvements to Clang's diagnostics
-----------------------------------
diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
index 075324a213ff78..45b04c3efd0462 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -5162,10 +5162,11 @@ that does not. A single parameter may not have multiple ABI treatment
attributes.
Support for this feature is target-dependent, although it should be
-supported on every target that Swift supports. Query for this support
-with ``__has_attribute(swiftcall)``. This implies support for the
-``swift_context``, ``swift_error_result``, and ``swift_indirect_result``
-attributes.
+supported on every target that Swift supports. Query for this attribute
+with ``__has_attribute(swiftcall)``. Query if the target supports the
+calling convention with ``__has_extension(swiftcc)``. This implies
+support for the ``swift_context``, ``swift_error_result``, and
+``swift_indirect_result`` attributes.
}];
}
@@ -5212,6 +5213,10 @@ the following:
semantically be performed after a guaranteed tail call, such as the
non-trivial destruction of a local variable or temporary,
then the program is ill-formed.
+
+Query for this attribute with ``__has_attribute(swiftasynccall)``. Query if
+the target supports the calling convention with
+``__has_extension(swiftasynccc)``.
}];
}
diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
index 7c0755b7318306..c338381ebe8f15 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -102,7 +102,10 @@ FEATURE(memory_sanitizer,
FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
-FEATURE(swiftasynccc,
+EXTENSION(swiftcc,
+ PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
+ clang::TargetInfo::CCCR_OK)
+EXTENSION(swiftasynccc,
PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) ==
clang::TargetInfo::CCCR_OK)
FEATURE(pragma_stdc_cx_limited_range, true)
diff --git a/clang/test/Sema/swift-call-conv.c b/clang/test/Sema/swift-call-conv.c
index 755c18f5183f85..75781ea997d06f 100644
--- a/clang/test/Sema/swift-call-conv.c
+++ b/clang/test/Sema/swift-call-conv.c
@@ -1,7 +1,12 @@
// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc -fsyntax-only %s -verify
// RUN: %clang_cc1 -triple thumbv7-unknown-windows-msvc -fsyntax-only %s -verify
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fsyntax-only %s -verify
+// RISC-V does not support swiftcall
+// RUN: %clang_cc1 -triple riscv32-unknown-elf -fsyntax-only %s -verify
+#if __has_extension(swiftcc)
// expected-no-diagnostics
-
+#else
+// expected-warning at +2 {{'__swiftcall__' calling convention is not supported for this target}}
+#endif
void __attribute__((__swiftcall__)) f(void) {}
More information about the cfe-commits
mailing list