From 07b417f075a41e355bd6f2fe474f3f0597c4600c Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:16:17 +0200 Subject: [PATCH 01/17] Add test for SwiftIndirectResult --- .../Swift/SwiftIndirectResult/CMakeLists.txt | 21 ++++++++ .../SwiftIndirectResult.cs | 52 +++++++++++++++++++ .../SwiftIndirectResult.csproj | 16 ++++++ .../SwiftIndirectResult.swift | 18 +++++++ 4 files changed, 107 insertions(+) create mode 100644 src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt create mode 100644 src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs create mode 100644 src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.csproj create mode 100644 src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.swift diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt b/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt new file mode 100644 index 00000000000000..ab7b3b303303e2 --- /dev/null +++ b/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt @@ -0,0 +1,21 @@ +project(SwiftIndirectResult) +include ("${CLR_INTEROP_TEST_ROOT}/Interop.cmake") + +set(SOURCE SwiftIndirectResult) + +if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) + set(SWIFT_PLATFORM "macosx") + set(SWIFT_PLATFORM_SUFFIX "") + set(SWIFT_DEPLOYMENT_TARGET ${CMAKE_OSX_DEPLOYMENT_TARGET}) + set(SWIFT_COMPILER_TARGET "${CMAKE_OSX_ARCHITECTURES}-apple-${SWIFT_PLATFORM}${SWIFT_DEPLOYMENT_TARGET}${SWIFT_PLATFORM_SUFFIX}") +endif() + +add_custom_target(${SOURCE} ALL + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift + COMMENT "Generating ${SOURCE} library" +) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + DESTINATION bin +) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs new file mode 100644 index 00000000000000..2a93426db9c23d --- /dev/null +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Swift; +using Xunit; + +public class SwiftIndirectResultTests +{ + private struct NonFrozenStruct + { + public int A; + public int B; + public int C; + } + + private const string SwiftLib = "libSwiftIndirectResult.dylib"; + + [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] + [DllImport(SwiftLib, EntryPoint = "$s6output21ReturnNonFrozenStruct1a1b1cAA0cdE0Vs5Int32V_A2ItF")] + public static extern void ReturnNonFrozenStruct(SwiftIndirectResult result, int a, int b, int c); + + [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] + [DllImport(SwiftLib, EntryPoint = "$s6output26SumReturnedNonFrozenStruct1fs5Int32VAA0deF0VyXE_tF")] + public unsafe static extern int SumReturnedNonFrozenStruct(delegate*[Swift] , void* funcContext); + + [Fact] + public unsafe static void TestReturnNonFrozenStruct() + { + // In normal circumstances this instance would have unknown/dynamically determined size. + NonFrozenStruct instance; + ReturnNonFrozenStruct(&instance, 10, 20, 30); + Assert.Equal(10, instance.A); + Assert.Equal(20, instance.B); + Assert.Equal(30, instance.C); + } + + [UnmanagedCallersOnly(CallConvs = new Type[] { typeof(CallConvSwift) })] + private static void ReversePInvokeReturnNonFrozenStruct(SwiftIndirectResult result, SwiftSelf self) + { + *(NonFrozenStruct*)result.Value = new NonFrozenStruct { A = 10, B = 20, C = 30 }; + } + + [Fact] + public unsafe static void TestSumReturnedNonFrozenStruct() + { + int result = SumReturnedNonFrozenStruct(&ReversePInvokeReturnNonFrozenStruct, null); + Assert.Equal(60, result); + } +} diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.csproj b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.csproj new file mode 100644 index 00000000000000..89eda99352fd20 --- /dev/null +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.csproj @@ -0,0 +1,16 @@ + + + + true + true + + true + + + + + + + + + diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.swift b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.swift new file mode 100644 index 00000000000000..8ccb0bbc0d3b32 --- /dev/null +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.swift @@ -0,0 +1,18 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +public struct NonFrozenStruct +{ + let a : Int32; + let b : Int32; + let c : Int32; +} + +public func ReturnNonFrozenStruct(a: Int32, b: Int32, c: Int32) -> NonFrozenStruct { + return NonFrozenStruct(a: a, b: b, c: c) +} + +public func SumReturnedNonFrozenStruct(f: () -> NonFrozenStruct) -> Int32 { + let s = f() + return s.a + s.b + s.c +} \ No newline at end of file From 889a2e5d2bdece9ce822bdbefd2a9e1870e4e148 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:18:52 +0200 Subject: [PATCH 02/17] Fix test --- .../SwiftIndirectResult.cs | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs index 2a93426db9c23d..dbdb3a2034b9f2 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -9,44 +9,45 @@ public class SwiftIndirectResultTests { - private struct NonFrozenStruct - { - public int A; - public int B; - public int C; - } - + private struct NonFrozenStruct + { + public int A; + public int B; + public int C; + } + private const string SwiftLib = "libSwiftIndirectResult.dylib"; [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] [DllImport(SwiftLib, EntryPoint = "$s6output21ReturnNonFrozenStruct1a1b1cAA0cdE0Vs5Int32V_A2ItF")] public static extern void ReturnNonFrozenStruct(SwiftIndirectResult result, int a, int b, int c); - [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] + [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] [DllImport(SwiftLib, EntryPoint = "$s6output26SumReturnedNonFrozenStruct1fs5Int32VAA0deF0VyXE_tF")] - public unsafe static extern int SumReturnedNonFrozenStruct(delegate*[Swift] , void* funcContext); + public unsafe static extern int SumReturnedNonFrozenStruct(delegate*[Swift] func, void* funcContext); [Fact] public unsafe static void TestReturnNonFrozenStruct() { - // In normal circumstances this instance would have unknown/dynamically determined size. - NonFrozenStruct instance; - ReturnNonFrozenStruct(&instance, 10, 20, 30); - Assert.Equal(10, instance.A); - Assert.Equal(20, instance.B); - Assert.Equal(30, instance.C); + // In normal circumstances this instance would have unknown/dynamically determined size. + NonFrozenStruct instance; + ReturnNonFrozenStruct(&instance, 10, 20, 30); + Assert.Equal(10, instance.A); + Assert.Equal(20, instance.B); + Assert.Equal(30, instance.C); } [UnmanagedCallersOnly(CallConvs = new Type[] { typeof(CallConvSwift) })] private static void ReversePInvokeReturnNonFrozenStruct(SwiftIndirectResult result, SwiftSelf self) - { - *(NonFrozenStruct*)result.Value = new NonFrozenStruct { A = 10, B = 20, C = 30 }; - } + { + // In normal circumstances this would require using dynamically sized memcpy and members to create the struct. + *(NonFrozenStruct*)result.Value = new NonFrozenStruct { A = 10, B = 20, C = 30 }; + } [Fact] public unsafe static void TestSumReturnedNonFrozenStruct() { - int result = SumReturnedNonFrozenStruct(&ReversePInvokeReturnNonFrozenStruct, null); - Assert.Equal(60, result); + int result = SumReturnedNonFrozenStruct(&ReversePInvokeReturnNonFrozenStruct, null); + Assert.Equal(60, result); } } From 1e71cf27fee3ffe2ec5b87ce4cc367184e45f18f Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:19:45 +0200 Subject: [PATCH 03/17] unmanaged --- .../Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs index dbdb3a2034b9f2..c1b933eafc819c 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -24,7 +24,7 @@ private struct NonFrozenStruct [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] [DllImport(SwiftLib, EntryPoint = "$s6output26SumReturnedNonFrozenStruct1fs5Int32VAA0deF0VyXE_tF")] - public unsafe static extern int SumReturnedNonFrozenStruct(delegate*[Swift] func, void* funcContext); + public unsafe static extern int SumReturnedNonFrozenStruct(delegate* unmanaged[Swift] func, void* funcContext); [Fact] public unsafe static void TestReturnNonFrozenStruct() From a68f138df29d853a4cdb2de7ee08c2df37681c9b Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:20:57 +0200 Subject: [PATCH 04/17] Unsafe, pass indirect result correctly --- .../Swift/SwiftIndirectResult/SwiftIndirectResult.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs index c1b933eafc819c..b22e4943bfef90 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -7,7 +7,7 @@ using System.Runtime.InteropServices.Swift; using Xunit; -public class SwiftIndirectResultTests +public unsafe class SwiftIndirectResultTests { private struct NonFrozenStruct { @@ -24,14 +24,14 @@ private struct NonFrozenStruct [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] [DllImport(SwiftLib, EntryPoint = "$s6output26SumReturnedNonFrozenStruct1fs5Int32VAA0deF0VyXE_tF")] - public unsafe static extern int SumReturnedNonFrozenStruct(delegate* unmanaged[Swift] func, void* funcContext); + public static extern int SumReturnedNonFrozenStruct(delegate* unmanaged[Swift] func, void* funcContext); [Fact] - public unsafe static void TestReturnNonFrozenStruct() + public static void TestReturnNonFrozenStruct() { // In normal circumstances this instance would have unknown/dynamically determined size. NonFrozenStruct instance; - ReturnNonFrozenStruct(&instance, 10, 20, 30); + ReturnNonFrozenStruct(new SwiftIndirectResult(&instance), 10, 20, 30); Assert.Equal(10, instance.A); Assert.Equal(20, instance.B); Assert.Equal(30, instance.C); @@ -45,7 +45,7 @@ private static void ReversePInvokeReturnNonFrozenStruct(SwiftIndirectResult resu } [Fact] - public unsafe static void TestSumReturnedNonFrozenStruct() + public static void TestSumReturnedNonFrozenStruct() { int result = SumReturnedNonFrozenStruct(&ReversePInvokeReturnNonFrozenStruct, null); Assert.Equal(60, result); From 1103717f82f3d797f59ab72b4fdfe6bb587b3eda Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:23:32 +0200 Subject: [PATCH 05/17] Add to CMake files --- src/tests/Interop/CMakeLists.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/tests/Interop/CMakeLists.txt b/src/tests/Interop/CMakeLists.txt index fa3217993a8a70..4a6bca7b8fad87 100644 --- a/src/tests/Interop/CMakeLists.txt +++ b/src/tests/Interop/CMakeLists.txt @@ -103,10 +103,11 @@ endif(CLR_CMAKE_TARGET_UNIX) if(CLR_CMAKE_TARGET_APPLE) add_subdirectory(ObjectiveC/AutoReleaseTest) add_subdirectory(ObjectiveC/ObjectiveCMarshalAPI) + add_subdirectory(Swift/SwiftAbiStress) + add_subdirectory(Swift/SwiftCallbackAbiStress) add_subdirectory(Swift/SwiftErrorHandling) - add_subdirectory(Swift/SwiftSelfContext) + add_subdirectory(Swift/SwiftIndirectResult) add_subdirectory(Swift/SwiftInvalidCallConv) - add_subdirectory(Swift/SwiftAbiStress) add_subdirectory(Swift/SwiftRetAbiStress) - add_subdirectory(Swift/SwiftCallbackAbiStress) + add_subdirectory(Swift/SwiftSelfContext) endif() From 3726cbfbe713e3d36b77ac0a29b2aa2a7dd87331 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:41:55 +0200 Subject: [PATCH 06/17] Add support for SwiftIndirectResult --- src/coreclr/jit/importercalls.cpp | 75 ++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index d8041a548412c2..3eae7805d3b4de 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -2024,11 +2024,12 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, { JITDUMP("Creating args for Swift call [%06u]\n", dspTreeID(call)); - unsigned short swiftErrorIndex = sig->numArgs; - unsigned short swiftSelfIndex = sig->numArgs; + unsigned swiftErrorIndex = UINT_MAX; + unsigned swiftSelfIndex = UINT_MAX; + unsigned swiftIndirectResultIndex = UINT_MAX; // We are importing an unmanaged Swift call, which might require special parameter handling - bool checkEntireStack = false; + bool spillStack = false; // Check the signature of the Swift call for the special types CORINFO_ARG_LIST_HANDLE sigArg = sig->args; @@ -2065,13 +2066,13 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, BADCODE("Expected SwiftError pointer/reference, got struct"); } - if (swiftErrorIndex != sig->numArgs) + if (swiftErrorIndex != UINT_MAX) { BADCODE("Duplicate SwiftError* parameter"); } swiftErrorIndex = argIndex; - checkEntireStack = true; + spillStack = true; } else if ((strcmp(className, "SwiftSelf") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) @@ -2082,7 +2083,7 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, BADCODE("Expected SwiftSelf struct, got pointer/reference"); } - if (swiftSelfIndex != sig->numArgs) + if (swiftSelfIndex != UINT_MAX) { BADCODE("Duplicate SwiftSelf parameter"); } @@ -2090,6 +2091,30 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, swiftSelfIndex = argIndex; // Fall through to make sure the struct value becomes a local. } + else if ((strcmp(className, "SwiftIndirectResult") == 0) && + (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) + { + if (argIsByrefOrPtr) + { + BADCODE("Expected SwiftIndirectResult struct, got pointer/reference"); + } + + if (swiftIndirectResultIndex != UINT_MAX) + { + BADCODE("Duplicate SwiftIndirectResult parameter"); + } + + if (sig->retType != CORINFO_TYPE_VOID) + { + BADCODE("Functions with SwiftIndirectResult parameters must return void"); + } + + swiftIndirectResultIndex = argIndex; + + // We will move this arg to the beginning of the arg list, so + // we must spill due to this potential reordering of arguments. + spillStack = true; + } // TODO: Handle SwiftAsync } @@ -2098,12 +2123,6 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, continue; } - if (argIndex != swiftSelfIndex) - { - // This is a struct type. Check if it needs to be lowered. - // TODO-Bug: SIMD types are not handled correctly by this. - } - // We must spill this struct to a local to be able to expand it into primitives. GenTree* node = impStackTop(sig->numArgs - 1 - argIndex).val; if (!node->OperIsLocalRead()) @@ -2118,7 +2137,7 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, // If using SwiftError*, spill entire stack as we will need to reuse the // error argument after the call. - if (checkEntireStack) + if (spillStack) { impSpillSideEffects(true, CHECK_SPILL_ALL DEBUGARG("Spill for swift call")); } @@ -2131,7 +2150,10 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, // Get SwiftError* arg (if it exists) before modifying the arg list CallArg* const swiftErrorArg = - (swiftErrorIndex != sig->numArgs) ? call->gtArgs.GetArgByIndex(swiftErrorIndex) : nullptr; + (swiftErrorIndex != UINT_MAX) ? call->gtArgs.GetArgByIndex(swiftErrorIndex) : nullptr; + + CallArg* const swiftIndirectResultArg = + (swiftIndirectResultIndex != UINT_MAX) ? call->gtArgs.GetArgByIndex(swiftIndirectResultIndex) : nullptr; // Now expand struct args that must be lowered into primitives unsigned argIndex = 0; @@ -2154,15 +2176,28 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, GenTreeLclVarCommon* structVal = arg->GetNode()->AsLclVarCommon(); CallArg* insertAfter = arg; - // For the self arg, change it from the SwiftSelf struct to a - // TYP_I_IMPL primitive directly. It must also be marked as a well - // known arg because it has a non-standard calling convention. - if (argIndex == swiftSelfIndex) + // For the self/indirect result args, change them to a TYP_I_IMPL + // primitive directly. They must also be marked as a well known arg + // because they have a non-standard calling convention. + if ((argIndex == swiftSelfIndex) || (argIndex == swiftIndirectResultIndex)) { assert(arg->GetNode()->OperIsLocalRead()); GenTree* primitiveSelf = gtNewLclFldNode(structVal->GetLclNum(), TYP_I_IMPL, structVal->GetLclOffs()); - NewCallArg newArg = NewCallArg::Primitive(primitiveSelf, TYP_I_IMPL).WellKnown(WellKnownArg::SwiftSelf); - insertAfter = call->gtArgs.InsertAfter(this, insertAfter, newArg); + NewCallArg newArg = NewCallArg::Primitive(primitiveSelf, TYP_I_IMPL); + if (argIndex == swiftSelfIndex) + { + newArg = newArg.WellKnown(WellKnownArg::SwiftSelf); + insertAfter = call->gtArgs.InsertAfter(this, insertAfter, newArg); + } + else + { + // We move the retbuf to the beginning of the arg list to make + // the call follow the same invariant as other calls with + // retbufs. + newArg = newArg.WellKnown(WellKnownArg::RetBuffer); + call->gtArgs.PushFront(this, newArg); + call->gtCallMoreFlags |= GTF_CALL_M_RETBUFFARG; + } } else { From 0db1d8f8020c474f7cf8d34e3ec7651538a4908d Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:45:49 +0200 Subject: [PATCH 07/17] Fix export name --- .../Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs index b22e4943bfef90..8a4bdce8dcc8ac 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs +++ b/src/tests/Interop/Swift/SwiftIndirectResult/SwiftIndirectResult.cs @@ -19,11 +19,11 @@ private struct NonFrozenStruct private const string SwiftLib = "libSwiftIndirectResult.dylib"; [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] - [DllImport(SwiftLib, EntryPoint = "$s6output21ReturnNonFrozenStruct1a1b1cAA0cdE0Vs5Int32V_A2ItF")] + [DllImport(SwiftLib, EntryPoint = "$s19SwiftIndirectResult21ReturnNonFrozenStruct1a1b1cAA0efG0Vs5Int32V_A2ItF")] public static extern void ReturnNonFrozenStruct(SwiftIndirectResult result, int a, int b, int c); [UnmanagedCallConv(CallConvs = new Type[] { typeof(CallConvSwift) })] - [DllImport(SwiftLib, EntryPoint = "$s6output26SumReturnedNonFrozenStruct1fs5Int32VAA0deF0VyXE_tF")] + [DllImport(SwiftLib, EntryPoint = "$s19SwiftIndirectResult26SumReturnedNonFrozenStruct1fs5Int32VAA0fgH0VyXE_tF")] public static extern int SumReturnedNonFrozenStruct(delegate* unmanaged[Swift] func, void* funcContext); [Fact] From b00a2fa60974428ac8e48117f8e7552e516d910f Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 12:56:22 +0200 Subject: [PATCH 08/17] Enable library evolution --- src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt b/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt index ab7b3b303303e2..7490bbf39ce62f 100644 --- a/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftIndirectResult/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) From ceee8158df26d79ae7da7e89f6f5e95494009e17 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:08:47 +0200 Subject: [PATCH 09/17] Reverse pinvoke support --- src/coreclr/jit/importercalls.cpp | 8 ++++---- src/coreclr/jit/lclvars.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 3eae7805d3b4de..c711fc4063e802 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -2099,14 +2099,14 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, BADCODE("Expected SwiftIndirectResult struct, got pointer/reference"); } - if (swiftIndirectResultIndex != UINT_MAX) + if (sig->retType != CORINFO_TYPE_VOID) { - BADCODE("Duplicate SwiftIndirectResult parameter"); + BADCODE("Functions with SwiftIndirectResult arguments must return void"); } - if (sig->retType != CORINFO_TYPE_VOID) + if (swiftIndirectResultIndex != UINT_MAX) { - BADCODE("Functions with SwiftIndirectResult parameters must return void"); + BADCODE("Duplicate SwiftIndirectResult argument"); } swiftIndirectResultIndex = argIndex; diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index 889eacefd29f13..4447fe884a815c 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -1443,6 +1443,33 @@ bool Compiler::lvaInitSpecialSwiftParam(CORINFO_ARG_LIST_HANDLE argHnd, return true; } + if ((strcmp(className, "SwiftIndirectResult") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) + { + if (argIsByrefOrPtr) + { + BADCODE("Expected SwiftIndirectResult struct, got pointer/reference"); + } + + if (info.compRetType != TYP_VOID) + { + BADCODE("Functions with SwiftIndirectResult parameters must return void"); + } + + if (info.compRetBuffArg != BAD_VAR_NUM) + { + BADCODE("Duplicate SwiftIndirectResult parameter"); + } + + LclVarDsc* const varDsc = varDscInfo->varDsc; + varDsc->SetArgReg(theFixedRetBuffReg(CorInfoCallConvExtension::Swift)); + varDsc->lvIsRegArg = true; + + compArgSize += TARGET_POINTER_SIZE; + + info.compRetBuffArg = varDscInfo->varNum; + return true; + } + if ((strcmp(className, "SwiftError") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) { if (!argIsByrefOrPtr) From b4dabd00305d2ac4bf2c61ea5c59d6de6f3be934 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:14:21 +0200 Subject: [PATCH 10/17] Use a separate local for Swift indirect result parameter --- src/coreclr/jit/codegencommon.cpp | 9 ++++++++- src/coreclr/jit/compiler.h | 1 + src/coreclr/jit/lclvars.cpp | 6 +++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index 5a886b3929a55a..e0ea00cea6c580 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -4356,7 +4356,7 @@ void CodeGen::genHomeSwiftStructParameters(bool handleStack) { for (unsigned lclNum = 0; lclNum < compiler->info.compArgsCount; lclNum++) { - if (lclNum == compiler->lvaSwiftSelfArg) + if ((lclNum == compiler->lvaSwiftSelfArg) || (lclNum == compiler->lvaSwiftIndirectResultArg)) { continue; } @@ -5696,6 +5696,13 @@ void CodeGen::genFnProlog() intRegState.rsCalleeRegArgMaskLiveIn &= ~RBM_SWIFT_SELF; } + if ((compiler->lvaSwiftIndirectResultArg != BAD_VAR_NUM) && + ((intRegState.rsCalleeRegArgMaskLiveIn & theFixedRetBuffMask(CorInfoCallConvExtension::Swift)) != 0)) + { + GetEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, theFixedRetBuffReg(CorInfoCallConvExtension::Swift), compiler->lvaSwiftIndirectResultArg, 0); + intRegState.rsCalleeRegArgMaskLiveIn &= ~theFixedRetBuffMask(CorInfoCallConvExtension::Swift); + } + if (compiler->lvaSwiftErrorArg != BAD_VAR_NUM) { intRegState.rsCalleeRegArgMaskLiveIn &= ~RBM_SWIFT_ERROR; diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 8ccaeec161f065..bcd44c4067fd54 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -3928,6 +3928,7 @@ class Compiler #ifdef SWIFT_SUPPORT unsigned lvaSwiftSelfArg; + unsigned lvaSwiftIndirectResultArg; unsigned lvaSwiftErrorArg; unsigned lvaSwiftErrorLocal; #endif diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index 4447fe884a815c..c3bb0ee6690ae0 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -1466,7 +1466,7 @@ bool Compiler::lvaInitSpecialSwiftParam(CORINFO_ARG_LIST_HANDLE argHnd, compArgSize += TARGET_POINTER_SIZE; - info.compRetBuffArg = varDscInfo->varNum; + lvaSwiftIndirectResultArg = varDscInfo->varNum; return true; } @@ -1736,6 +1736,10 @@ void Compiler::lvaClassifyParameterABI(Classifier& classifier) { wellKnownArg = WellKnownArg::SwiftSelf; } + else if (i == lvaSwiftIndirectResultArg) + { + wellKnownArg = WellKnownArg::RetBuffer; + } else if (i == lvaSwiftErrorArg) { wellKnownArg = WellKnownArg::SwiftError; From 4f410dad932056a3f0f715aea8b46d28b6b69cb9 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:35:39 +0200 Subject: [PATCH 11/17] Fix ret buf handling now that it is a struct in some cases --- src/coreclr/jit/abi.cpp | 6 ++---- src/coreclr/jit/lclvars.cpp | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/coreclr/jit/abi.cpp b/src/coreclr/jit/abi.cpp index 524eedb48ee4d7..4ef6f034dd0f87 100644 --- a/src/coreclr/jit/abi.cpp +++ b/src/coreclr/jit/abi.cpp @@ -379,13 +379,11 @@ ABIPassingInformation SwiftABIClassifier::Classify(Compiler* comp, ClassLayout* structLayout, WellKnownArg wellKnownParam) { -#ifdef TARGET_AMD64 if (wellKnownParam == WellKnownArg::RetBuffer) { - return ABIPassingInformation::FromSegment(comp, ABIPassingSegment::InRegister(REG_SWIFT_ARG_RET_BUFF, 0, - TARGET_POINTER_SIZE)); + regNumber reg = theFixedRetBuffReg(CorInfoCallConvExtension::Swift); + return ABIPassingInformation::FromSegment(comp, ABIPassingSegment::InRegister(reg, 0, TARGET_POINTER_SIZE)); } -#endif if (wellKnownParam == WellKnownArg::SwiftSelf) { diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index c3bb0ee6690ae0..3f3d136ef16494 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -74,6 +74,7 @@ void Compiler::lvaInit() #ifdef SWIFT_SUPPORT lvaSwiftSelfArg = BAD_VAR_NUM; + lvaSwiftIndirectResultArg = BAD_VAR_NUM; lvaSwiftErrorArg = BAD_VAR_NUM; #endif @@ -1455,7 +1456,7 @@ bool Compiler::lvaInitSpecialSwiftParam(CORINFO_ARG_LIST_HANDLE argHnd, BADCODE("Functions with SwiftIndirectResult parameters must return void"); } - if (info.compRetBuffArg != BAD_VAR_NUM) + if (lvaSwiftIndirectResultArg != BAD_VAR_NUM) { BADCODE("Duplicate SwiftIndirectResult parameter"); } From e1bc2e835b6083e2752932e4dd57455a759c07a6 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:36:29 +0200 Subject: [PATCH 12/17] Run jit-format --- src/coreclr/jit/codegencommon.cpp | 4 +++- src/coreclr/jit/importercalls.cpp | 16 ++++++++-------- src/coreclr/jit/lclvars.cpp | 7 ++++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index e0ea00cea6c580..2a1d7652ac5419 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -5699,7 +5699,9 @@ void CodeGen::genFnProlog() if ((compiler->lvaSwiftIndirectResultArg != BAD_VAR_NUM) && ((intRegState.rsCalleeRegArgMaskLiveIn & theFixedRetBuffMask(CorInfoCallConvExtension::Swift)) != 0)) { - GetEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, theFixedRetBuffReg(CorInfoCallConvExtension::Swift), compiler->lvaSwiftIndirectResultArg, 0); + GetEmitter()->emitIns_S_R(ins_Store(TYP_I_IMPL), EA_PTRSIZE, + theFixedRetBuffReg(CorInfoCallConvExtension::Swift), + compiler->lvaSwiftIndirectResultArg, 0); intRegState.rsCalleeRegArgMaskLiveIn &= ~theFixedRetBuffMask(CorInfoCallConvExtension::Swift); } diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index c711fc4063e802..5a243600ca05d3 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -2024,8 +2024,8 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, { JITDUMP("Creating args for Swift call [%06u]\n", dspTreeID(call)); - unsigned swiftErrorIndex = UINT_MAX; - unsigned swiftSelfIndex = UINT_MAX; + unsigned swiftErrorIndex = UINT_MAX; + unsigned swiftSelfIndex = UINT_MAX; unsigned swiftIndirectResultIndex = UINT_MAX; // We are importing an unmanaged Swift call, which might require special parameter handling @@ -2071,8 +2071,8 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, BADCODE("Duplicate SwiftError* parameter"); } - swiftErrorIndex = argIndex; - spillStack = true; + swiftErrorIndex = argIndex; + spillStack = true; } else if ((strcmp(className, "SwiftSelf") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) @@ -2092,7 +2092,7 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, // Fall through to make sure the struct value becomes a local. } else if ((strcmp(className, "SwiftIndirectResult") == 0) && - (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) + (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) { if (argIsByrefOrPtr) { @@ -2113,7 +2113,7 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, // We will move this arg to the beginning of the arg list, so // we must spill due to this potential reordering of arguments. - spillStack = true; + spillStack = true; } // TODO: Handle SwiftAsync } @@ -2183,10 +2183,10 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, { assert(arg->GetNode()->OperIsLocalRead()); GenTree* primitiveSelf = gtNewLclFldNode(structVal->GetLclNum(), TYP_I_IMPL, structVal->GetLclOffs()); - NewCallArg newArg = NewCallArg::Primitive(primitiveSelf, TYP_I_IMPL); + NewCallArg newArg = NewCallArg::Primitive(primitiveSelf, TYP_I_IMPL); if (argIndex == swiftSelfIndex) { - newArg = newArg.WellKnown(WellKnownArg::SwiftSelf); + newArg = newArg.WellKnown(WellKnownArg::SwiftSelf); insertAfter = call->gtArgs.InsertAfter(this, insertAfter, newArg); } else diff --git a/src/coreclr/jit/lclvars.cpp b/src/coreclr/jit/lclvars.cpp index 3f3d136ef16494..bf7dc8fb14d7a8 100644 --- a/src/coreclr/jit/lclvars.cpp +++ b/src/coreclr/jit/lclvars.cpp @@ -73,9 +73,9 @@ void Compiler::lvaInit() lvaRetAddrVar = BAD_VAR_NUM; #ifdef SWIFT_SUPPORT - lvaSwiftSelfArg = BAD_VAR_NUM; + lvaSwiftSelfArg = BAD_VAR_NUM; lvaSwiftIndirectResultArg = BAD_VAR_NUM; - lvaSwiftErrorArg = BAD_VAR_NUM; + lvaSwiftErrorArg = BAD_VAR_NUM; #endif lvaInlineeReturnSpillTemp = BAD_VAR_NUM; @@ -1444,7 +1444,8 @@ bool Compiler::lvaInitSpecialSwiftParam(CORINFO_ARG_LIST_HANDLE argHnd, return true; } - if ((strcmp(className, "SwiftIndirectResult") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) + if ((strcmp(className, "SwiftIndirectResult") == 0) && + (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) { if (argIsByrefOrPtr) { From 8dc1931d8fa3310d2db69943c8e3ce7dbe31e5dd Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:42:57 +0200 Subject: [PATCH 13/17] Disable new test on Mono --- src/tests/issues.targets | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/issues.targets b/src/tests/issues.targets index 5da277d04e87b4..7d362bff260f0d 100644 --- a/src/tests/issues.targets +++ b/src/tests/issues.targets @@ -1917,6 +1917,9 @@ https://github.com/dotnet/runtime/issues/93631: Swift reverse pinvokes are not implemented on Mono yet + + https://github.com/dotnet/runtime/issues/93631: SwiftIndirectResult is not implemented on Mono yet + From deae39ec497a33b089694f0214efb4b109ff7d2f Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:45:07 +0200 Subject: [PATCH 14/17] Clean up --- src/coreclr/jit/importercalls.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index 5a243600ca05d3..a0f2729699d2ef 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -2152,9 +2152,6 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, CallArg* const swiftErrorArg = (swiftErrorIndex != UINT_MAX) ? call->gtArgs.GetArgByIndex(swiftErrorIndex) : nullptr; - CallArg* const swiftIndirectResultArg = - (swiftIndirectResultIndex != UINT_MAX) ? call->gtArgs.GetArgByIndex(swiftIndirectResultIndex) : nullptr; - // Now expand struct args that must be lowered into primitives unsigned argIndex = 0; for (CallArg* arg = call->gtArgs.Args().begin().GetArg(); arg != nullptr; argIndex++) From 974f37ac932bb5aba868417476cd51debe6ba9cb Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 13:47:04 +0200 Subject: [PATCH 15/17] Enable library evolution in all Swift tests --- src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt index 6170fe83678460..707787c2365fef 100644 --- a/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt index 283ea0eb65430d..b2078f1983999c 100644 --- a/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt b/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt index 2d07bd3bf745c5..590730fbe0c406 100644 --- a/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt b/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt index dea341f587c159..a7ac4576e94821 100644 --- a/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt index 9f0e2a3423b2a2..7f476d52c47ab7 100644 --- a/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt b/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt index 8d7efa1eea6757..294fcd0e0ba28f 100644 --- a/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) From e05c2829d62e5d0da8a07ba5877d5d366b38c8ee Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Mon, 17 Jun 2024 15:30:45 +0200 Subject: [PATCH 16/17] Revert "Enable library evolution in all Swift tests" This reverts commit 974f37ac932bb5aba868417476cd51debe6ba9cb. --- src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt | 2 +- src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt index 707787c2365fef..6170fe83678460 100644 --- a/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt index b2078f1983999c..283ea0eb65430d 100644 --- a/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftCallbackAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt b/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt index 590730fbe0c406..2d07bd3bf745c5 100644 --- a/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftErrorHandling/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt b/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt index a7ac4576e94821..dea341f587c159 100644 --- a/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftInvalidCallConv/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt b/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt index 7f476d52c47ab7..9f0e2a3423b2a2 100644 --- a/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftRetAbiStress/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) diff --git a/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt b/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt index 294fcd0e0ba28f..8d7efa1eea6757 100644 --- a/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt +++ b/src/tests/Interop/Swift/SwiftSelfContext/CMakeLists.txt @@ -11,7 +11,7 @@ if (NOT SWIFT_COMPILER_TARGET AND CLR_CMAKE_TARGET_OSX) endif() add_custom_target(${SOURCE} ALL - COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -enable-library-evolution -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib + COMMAND xcrun swiftc -target ${SWIFT_COMPILER_TARGET} -emit-library ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift -o ${CMAKE_CURRENT_BINARY_DIR}/lib${SOURCE}.dylib DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}.swift COMMENT "Generating ${SOURCE} library" ) From 3024b100edb71365a399f2ac9808f8fc40f3c1f5 Mon Sep 17 00:00:00 2001 From: Jakob Botsch Nielsen Date: Tue, 18 Jun 2024 09:01:12 +0200 Subject: [PATCH 17/17] Move comment --- src/coreclr/jit/importercalls.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/jit/importercalls.cpp b/src/coreclr/jit/importercalls.cpp index a0f2729699d2ef..f7bd0a6ddd830e 100644 --- a/src/coreclr/jit/importercalls.cpp +++ b/src/coreclr/jit/importercalls.cpp @@ -2072,7 +2072,9 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, } swiftErrorIndex = argIndex; - spillStack = true; + // Spill entire stack as we will need to reuse the error + // argument after the call. + spillStack = true; } else if ((strcmp(className, "SwiftSelf") == 0) && (strcmp(namespaceName, "System.Runtime.InteropServices.Swift") == 0)) @@ -2135,8 +2137,6 @@ void Compiler::impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, } } - // If using SwiftError*, spill entire stack as we will need to reuse the - // error argument after the call. if (spillStack) { impSpillSideEffects(true, CHECK_SPILL_ALL DEBUGARG("Spill for swift call"));