Skip to content

Commit

Permalink
[clang] Add __has_extension(swiftcc) support (llvm#85347)
Browse files Browse the repository at this point in the history
  • Loading branch information
kateinoigakukun authored and chencha3 committed Mar 22, 2024
1 parent 7be1e8a commit f27fa9b
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 6 deletions.
7 changes: 7 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,13 @@ Attribute Changes in Clang
and each must be a positive integer when provided. The parameter ``x`` is required, while ``y`` and
``z`` are optional with default value of 1.

- 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
-----------------------------------
- Clang now applies syntax highlighting to the code snippets it
Expand Down
13 changes: 9 additions & 4 deletions clang/include/clang/Basic/AttrDocs.td
Original file line number Diff line number Diff line change
Expand Up @@ -5137,10 +5137,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.
}];
}

Expand Down Expand Up @@ -5187,6 +5188,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)``.
}];
}

Expand Down
5 changes: 4 additions & 1 deletion clang/include/clang/Basic/Features.def
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,10 @@ FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics)
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)
Expand Down
14 changes: 13 additions & 1 deletion clang/test/Sema/swift-call-conv.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
// 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@+2 {{'__swiftcall__' calling convention is not supported for this target}}
#endif
void __attribute__((__swiftcall__)) f(void) {}

#if __has_extension(swiftasynccc)
// expected-no-diagnostics
#else
// expected-warning@+2 {{'__swiftasynccall__' calling convention is not supported for this target}}
#endif
void __attribute__((__swiftasynccall__)) g(void) {}

0 comments on commit f27fa9b

Please sign in to comment.