Skip to content

Commit 97dc275

Browse files
authored
Merge pull request #64075 from hyp/eng/lambda-attrs
[interop][SwiftToCxx] use 'nodebug' for inline thunks and apply inline and artificial attributes to lambd…
2 parents 1d03053 + eeaba69 commit 97dc275

22 files changed

+81
-77
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,8 @@ class DeclAndTypePrinter::Implementation
536536
outOfLineOS << "::makeRetained(*reinterpret_cast<void "
537537
"**>(payloadFromDestruction));\n ";
538538
} else {
539-
outOfLineOS
540-
<< "::returnNewValue([&](char * _Nonnull result) {\n";
539+
outOfLineOS << "::returnNewValue([&](char * _Nonnull result) "
540+
"SWIFT_INLINE_THUNK_ATTRIBUTES {\n";
541541
outOfLineOS << " swift::"
542542
<< cxx_synthesis::getCxxImplNamespaceName();
543543
outOfLineOS << "::implClassFor<";

lib/PrintAsClang/PrintClangFunction.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,8 @@ void DeclAndTypeClangFunctionPrinter::printGenericReturnSequence(
10481048

10491049
os << " return ::swift::" << cxx_synthesis::getCxxImplNamespaceName()
10501050
<< "::implClassFor<" << resultTyName
1051-
<< ">::type::returnNewValue([&](void * _Nonnull returnValue) {\n";
1051+
<< ">::type::returnNewValue([&](void * _Nonnull returnValue) "
1052+
"SWIFT_INLINE_THUNK_ATTRIBUTES {\n";
10521053
if (!initializeWithTakeFromValue) {
10531054
invocationPrinter(/*additionalParam=*/StringRef("returnValue"));
10541055
} else {

lib/PrintAsClang/PrintClangValueType.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,8 @@ void ClangValueTypePrinter::printValueTypeReturnScaffold(
515515
assert(isa<StructDecl>(type) || isa<EnumDecl>(type));
516516
os << " return ";
517517
typePrinter();
518-
os << "::returnNewValue([&](char * _Nonnull result) {\n ";
518+
os << "::returnNewValue([&](char * _Nonnull result) "
519+
"SWIFT_INLINE_THUNK_ATTRIBUTES {\n ";
519520
bodyPrinter("result");
520521
os << ";\n";
521522
os << " });\n";

lib/PrintAsClang/_SwiftCxxInteroperability.h

+8-6
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,23 @@
3131
/// The `SWIFT_INLINE_THUNK` macro is applied on the inline function thunks in
3232
/// the header that represents a C/C++ Swift module interface generated by the
3333
/// Swift compiler.
34-
#if __has_attribute(always_inline) && __has_attribute(artificial)
34+
#if __has_attribute(always_inline) && __has_attribute(nodebug)
3535
#if defined(DEBUG) && __has_attribute(used)
3636
// Additional 'used' attribute is used in debug mode to make inline thunks
3737
// accessible to LLDB.
38-
#define SWIFT_INLINE_THUNK \
39-
inline __attribute__((always_inline)) __attribute__((artificial)) \
38+
#define SWIFT_INLINE_THUNK_ATTRIBUTES \
39+
__attribute__((always_inline)) __attribute__((nodebug)) \
4040
__attribute__((used))
4141
#else
42-
#define SWIFT_INLINE_THUNK \
43-
inline __attribute__((always_inline)) __attribute__((artificial))
42+
#define SWIFT_INLINE_THUNK_ATTRIBUTES \
43+
__attribute__((always_inline)) __attribute__((nodebug))
4444
#endif
4545
#else
46-
#define SWIFT_INLINE_THUNK inline
46+
#define SWIFT_INLINE_THUNK_ATTRIBUTES
4747
#endif
4848

49+
#define SWIFT_INLINE_THUNK inline SWIFT_INLINE_THUNK_ATTRIBUTES
50+
4951
/// The `SWIFT_SYMBOL_MODULE` and `SWIFT_SYMBOL_MODULE_USR` macros apply
5052
/// `external_source_symbol` Clang attributes to C++ declarations that represent
5153
/// Swift declarations. This allows Clang to index them as external

test/Interop/SwiftToCxx/cross-module-refs/imported-enum-refs-in-cxx.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ public func inoutLargeEnum(_ s: inout LargeEnum) {
3030
// CHECK-NEXT: }
3131

3232
// CHECK: SWIFT_INLINE_THUNK Enums::LargeEnum UsesEnumsLargeEnum::passThroughStructSeveralI64(const Enums::LargeEnum& y) const {
33-
// CHECK-NEXT: return Enums::_impl::_impl_LargeEnum::returnNewValue([&](char * _Nonnull result) {
33+
// CHECK-NEXT: return Enums::_impl::_impl_LargeEnum::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
3434
// CHECK-NEXT: _impl::$s9UsesEnums0aB9LargeEnumV27passThroughStructSeveralI64y0B00cD0OAGF(result, Enums::_impl::_impl_LargeEnum::getOpaquePointer(y), _getOpaquePointer());
3535
// CHECK-NEXT: });
3636
// CHECK-NEXT: }
3737
// CHECK-NEXT: SWIFT_INLINE_THUNK Enums::LargeEnum UsesEnumsLargeEnum::getX() const {
38-
// CHECK-NEXT: return Enums::_impl::_impl_LargeEnum::returnNewValue([&](char * _Nonnull result) {
38+
// CHECK-NEXT: return Enums::_impl::_impl_LargeEnum::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
3939
// CHECK-NEXT: _impl::$s9UsesEnums0aB9LargeEnumV1x0B00cD0Ovg(result, _getOpaquePointer());
4040
// CHECK-NEXT: });
4141
// CHECK-NEXT: }

test/Interop/SwiftToCxx/cross-module-refs/imported-struct-refs-in-cxx.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,25 +43,25 @@ public func passThroughStructSmallDirect(_ x: SmallStructDirectPassing) -> Small
4343

4444

4545
// CHECK: SWIFT_INLINE_THUNK Structs::StructSeveralI64 passThroughStructSeveralI64(const Structs::StructSeveralI64& x) noexcept SWIFT_SYMBOL("s:11UsesStructs27passThroughStructSeveralI64y0B00efG0VAEF") SWIFT_WARN_UNUSED_RESULT {
46-
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) {
46+
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
4747
// CHECK-NEXT: _impl::$s11UsesStructs27passThroughStructSeveralI64y0B00efG0VAEF(result, Structs::_impl::_impl_StructSeveralI64::getOpaquePointer(x));
4848
// CHECK-NEXT: });
4949
// CHECK-NEXT: }
5050

5151
// CHECK: SWIFT_INLINE_THUNK Structs::SmallStructDirectPassing passThroughStructSmallDirect(const Structs::SmallStructDirectPassing& x) noexcept SWIFT_SYMBOL("s:11UsesStructs28passThroughStructSmallDirecty0B00feG7PassingVAEF") SWIFT_WARN_UNUSED_RESULT {
52-
// CHECK-NEXT: return Structs::_impl::_impl_SmallStructDirectPassing::returnNewValue([&](char * _Nonnull result) {
52+
// CHECK-NEXT: return Structs::_impl::_impl_SmallStructDirectPassing::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
5353
// CHECK-NEXT: _impl::swift_interop_returnDirect_UsesStructs_uint32_t_0_4(result, _impl::$s11UsesStructs28passThroughStructSmallDirecty0B00feG7PassingVAEF(_impl::swift_interop_passDirect_UsesStructs_uint32_t_0_4(Structs::_impl::_impl_SmallStructDirectPassing::getOpaquePointer(x))));
5454
// CHECK-NEXT: });
5555
// CHECK-NEXT: }
5656

5757
// CHECK: SWIFT_INLINE_THUNK Structs::StructSeveralI64 UsesStructsStruct::passThroughStructSeveralI64(const Structs::StructSeveralI64& y) const {
58-
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) {
58+
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
5959
// CHECK-NEXT: _impl::$s11UsesStructs0aB6StructV011passThroughC10SeveralI64y0B00cfG0VAGF(result, Structs::_impl::_impl_StructSeveralI64::getOpaquePointer(y), _getOpaquePointer());
6060
// CHECK-NEXT: });
6161
// CHECK-NEXT: }
6262

6363
// CHECK: SWIFT_INLINE_THUNK Structs::StructSeveralI64 UsesStructsStruct::getX() const {
64-
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) {
64+
// CHECK-NEXT: return Structs::_impl::_impl_StructSeveralI64::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
6565
// CHECK-NEXT: _impl::$s11UsesStructs0aB6StructV1x0B00C10SeveralI64Vvg(result, _getOpaquePointer());
6666
// CHECK-NEXT: });
6767
// CHECK-NEXT: }

test/Interop/SwiftToCxx/enums/large-enums-pass-return-in-cxx.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ public func inoutLarge(_ en: inout Large, _ x: Int) {
4646
// CHECK-NEXT: }
4747

4848
// CHECK: SWIFT_INLINE_THUNK Large makeLarge(swift::Int x) noexcept SWIFT_SYMBOL("s:5Enums9makeLargeyAA0C0OSiF") SWIFT_WARN_UNUSED_RESULT {
49-
// CHECK-NEXT: return _impl::_impl_Large::returnNewValue([&](char * _Nonnull result) {
49+
// CHECK-NEXT: return _impl::_impl_Large::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
5050
// CHECK-NEXT: _impl::$s5Enums9makeLargeyAA0C0OSiF(result, x);
5151
// CHECK-NEXT: });
5252
// CHECK-NEXT: }
5353

5454
// CHECK: SWIFT_INLINE_THUNK Large passThroughLarge(const Large& en) noexcept SWIFT_SYMBOL("s:5Enums16passThroughLargeyAA0D0OADF") SWIFT_WARN_UNUSED_RESULT {
55-
// CHECK-NEXT: return _impl::_impl_Large::returnNewValue([&](char * _Nonnull result) {
55+
// CHECK-NEXT: return _impl::_impl_Large::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
5656
// CHECK-NEXT: _impl::$s5Enums16passThroughLargeyAA0D0OADF(result, _impl::_impl_Large::getOpaquePointer(en));
5757
// CHECK-NEXT: });
5858
// CHECK-NEXT: }

test/Interop/SwiftToCxx/enums/small-enums-pass-return-in-cxx.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -117,25 +117,25 @@ public func inoutSmall(_ en: inout Small, _ x: Int) {
117117
// CHECK-NEXT: }
118118

119119
// CHECK: SWIFT_INLINE_THUNK Small makeSmall(swift::Int x) noexcept SWIFT_SYMBOL("s:5Enums9makeSmallyAA0C0OSiF") SWIFT_WARN_UNUSED_RESULT {
120-
// CHECK-NEXT: return _impl::_impl_Small::returnNewValue([&](char * _Nonnull result) {
120+
// CHECK-NEXT: return _impl::_impl_Small::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
121121
// CHECK-NEXT: _impl::swift_interop_returnDirect_Enums_[[Small]](result, _impl::$s5Enums9makeSmallyAA0C0OSiF(x));
122122
// CHECK-NEXT: });
123123
// CHECK-NEXT: }
124124

125125
// CHECK: SWIFT_INLINE_THUNK Tiny makeTiny(swift::Int x) noexcept SWIFT_SYMBOL("s:5Enums8makeTinyyAA0C0OSiF") SWIFT_WARN_UNUSED_RESULT {
126-
// CHECK-NEXT: return _impl::_impl_Tiny::returnNewValue([&](char * _Nonnull result) {
126+
// CHECK-NEXT: return _impl::_impl_Tiny::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
127127
// CHECK-NEXT: _impl::swift_interop_returnDirect_Enums_uint8_t_0_1(result, _impl::$s5Enums8makeTinyyAA0C0OSiF(x));
128128
// CHECK-NEXT: });
129129
// CHECK-NEXT: }
130130

131131
// CHECK: SWIFT_INLINE_THUNK Small passThroughSmall(const Small& en) noexcept SWIFT_SYMBOL("s:5Enums16passThroughSmallyAA0D0OADF") SWIFT_WARN_UNUSED_RESULT {
132-
// CHECK-NEXT: return _impl::_impl_Small::returnNewValue([&](char * _Nonnull result) {
132+
// CHECK-NEXT: return _impl::_impl_Small::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
133133
// CHECK-NEXT: _impl::swift_interop_returnDirect_Enums_[[Small]](result, _impl::$s5Enums16passThroughSmallyAA0D0OADF(_impl::swift_interop_passDirect_Enums_[[Small]](_impl::_impl_Small::getOpaquePointer(en))));
134134
// CHECK-NEXT: });
135135
// CHECK-NEXT: }
136136

137137
// CHECK: SWIFT_INLINE_THUNK Tiny passThroughTiny(const Tiny& en) noexcept SWIFT_SYMBOL("s:5Enums15passThroughTinyyAA0D0OADF") SWIFT_WARN_UNUSED_RESULT {
138-
// CHECK-NEXT: return _impl::_impl_Tiny::returnNewValue([&](char * _Nonnull result) {
138+
// CHECK-NEXT: return _impl::_impl_Tiny::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
139139
// CHECK-NEXT: _impl::swift_interop_returnDirect_Enums_uint8_t_0_1(result, _impl::$s5Enums15passThroughTinyyAA0D0OADF(_impl::swift_interop_passDirect_Enums_uint8_t_0_1(_impl::_impl_Tiny::getOpaquePointer(en))));
140140
// CHECK-NEXT: });
141141
// CHECK-NEXT: }

test/Interop/SwiftToCxx/enums/swift-enum-implementation.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public struct S {
219219
// CHECK-NEXT: alignas(E) unsigned char buffer[sizeof(E)];
220220
// CHECK-NEXT: auto *thisCopy = new(buffer) E(*this);
221221
// CHECK-NEXT: char * _Nonnull payloadFromDestruction = thisCopy->_destructiveProjectEnumData();
222-
// CHECK-NEXT: return swift::_impl::implClassFor<S>::type::returnNewValue([&](char * _Nonnull result) {
222+
// CHECK-NEXT: return swift::_impl::implClassFor<S>::type::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
223223
// CHECK-NEXT: swift::_impl::implClassFor<S>::type::initializeWithTake(result, payloadFromDestruction);
224224
// CHECK-NEXT: });
225225
// CHECK-NEXT: }
@@ -268,7 +268,7 @@ public struct S {
268268
// CHECK-NEXT: return *this == E::foobar;
269269
// CHECK-NEXT: }
270270
// CHECK-NEXT: SWIFT_INLINE_THUNK E E::init() {
271-
// CHECK-NEXT: return _impl::_impl_E::returnNewValue([&](char * _Nonnull result) {
271+
// CHECK-NEXT: return _impl::_impl_E::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
272272
// CHECK-NEXT: _impl::swift_interop_returnDirect_Enums[[ENUMENCODING:[a-z0-9_]+]](result, _impl::$s5Enums1EOACycfC());
273273
// CHECK-NEXT: });
274274
// CHECK-NEXT: }

test/Interop/SwiftToCxx/generics/generic-enum-in-cxx.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ public func inoutConcreteOpt(_ x: inout GenericOpt<UInt16>) {
169169

170170

171171
// CHECK: SWIFT_INLINE_THUNK GenericOpt<uint16_t> makeConcreteOpt(uint16_t x) noexcept SWIFT_SYMBOL("s:8Generics15makeConcreteOptyAA07GenericD0Oys6UInt16VGAFF") SWIFT_WARN_UNUSED_RESULT {
172-
// CHECK-NEXT: return _impl::_impl_GenericOpt<uint16_t>::returnNewValue([&](char * _Nonnull result) {
172+
// CHECK-NEXT: return _impl::_impl_GenericOpt<uint16_t>::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
173173
// CHECK-NEXT: _impl::swift_interop_returnDirect_Generics_uint32_t_0_4(result, _impl::$s8Generics15makeConcreteOptyAA07GenericD0Oys6UInt16VGAFF(x));
174174
// CHECK-NEXT: });
175175
// CHECK-NEXT: }
@@ -183,7 +183,7 @@ public func inoutConcreteOpt(_ x: inout GenericOpt<UInt16>) {
183183
// CHECK-NEXT: #ifndef __cpp_concepts
184184
// CHECK-NEXT: static_assert(swift::isUsableInGenericContext<T_0_0>, "type cannot be used in a Swift generic context");
185185
// CHECK-NEXT: #endif
186-
// CHECK-NEXT: return _impl::_impl_GenericOpt<T_0_0>::returnNewValue([&](char * _Nonnull result) {
186+
// CHECK-NEXT: return _impl::_impl_GenericOpt<T_0_0>::returnNewValue([&](char * _Nonnull result) SWIFT_INLINE_THUNK_ATTRIBUTES {
187187
// CHECK-NEXT: _impl::$s8Generics14makeGenericOptyAA0cD0OyxGxlF(result, swift::_impl::getOpaquePointer(x), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
188188
// CHECK-NEXT: });
189189
// CHECK-NEXT: }
@@ -250,7 +250,7 @@ public func inoutConcreteOpt(_ x: inout GenericOpt<UInt16>) {
250250
// CHECK-NEXT: returnValue = *reinterpret_cast<void **>(payloadFromDestruction);
251251
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::makeRetained(returnValue);
252252
// CHECK-NEXT: } else if constexpr (::swift::_impl::isValueType<T_0_0>) {
253-
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) {
253+
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) SWIFT_INLINE_THUNK_ATTRIBUTES {
254254
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::initializeWithTake(reinterpret_cast<char * _Nonnull>(returnValue), payloadFromDestruction);
255255
// CHECK-NEXT: });
256256
// CHECK-NEXT: } else if constexpr (::swift::_impl::isSwiftBridgedCxxRecord<T_0_0>) {

test/Interop/SwiftToCxx/generics/generic-function-in-cxx.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public func createTestSmallStruct(_ x: UInt32) -> TestSmallStruct {
174174
// CHECK-NEXT: _impl::$s9Functions10genericRetyxxlF(reinterpret_cast<void *>(&returnValue), swift::_impl::getOpaquePointer(x), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
175175
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::makeRetained(returnValue);
176176
// CHECK-NEXT: } else if constexpr (::swift::_impl::isValueType<T_0_0>) {
177-
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) {
177+
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) SWIFT_INLINE_THUNK_ATTRIBUTES {
178178
// CHECK-NEXT: _impl::$s9Functions10genericRetyxxlF(returnValue, swift::_impl::getOpaquePointer(x), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
179179
// CHECK-NEXT: });
180180
// CHECK-NEXT: } else if constexpr (::swift::_impl::isSwiftBridgedCxxRecord<T_0_0>) {
@@ -218,7 +218,7 @@ public func createTestSmallStruct(_ x: UInt32) -> TestSmallStruct {
218218
// CHECK-NEXT: _impl::$s9Functions15TestSmallStructV24genericMethodPassThroughyxxlF(reinterpret_cast<void *>(&returnValue), swift::_impl::getOpaquePointer(x), _impl::swift_interop_passDirect_Functions_uint32_t_0_4(_getOpaquePointer()), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
219219
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::makeRetained(returnValue);
220220
// CHECK-NEXT: } else if constexpr (::swift::_impl::isValueType<T_0_0>) {
221-
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) {
221+
// CHECK-NEXT: return ::swift::_impl::implClassFor<T_0_0>::type::returnNewValue([&](void * _Nonnull returnValue) SWIFT_INLINE_THUNK_ATTRIBUTES {
222222
// CHECK-NEXT: _impl::$s9Functions15TestSmallStructV24genericMethodPassThroughyxxlF(returnValue, swift::_impl::getOpaquePointer(x), _impl::swift_interop_passDirect_Functions_uint32_t_0_4(_getOpaquePointer()), swift::TypeMetadataTrait<T_0_0>::getTypeMetadata());
223223
// CHECK-NEXT: });
224224
// CHECK-NEXT: } else if constexpr (::swift::_impl::isSwiftBridgedCxxRecord<T_0_0>) {

0 commit comments

Comments
 (0)