Skip to content

Commit 9843659

Browse files
authored
JIT: Support frozen structs for Swift pinvokes (#99294)
Add support for decomposing structs in Swift pinvokes. Reverse pinvokes are not yet handled, and multireg returns also aren't yet handled. Also add 100 auto generated Swift ABI stress tests.
1 parent 9a67fc8 commit 9843659

29 files changed

+11944
-180
lines changed

src/coreclr/inc/corinfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3080,6 +3080,9 @@ class ICorStaticInfo
30803080
SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr /* OUT */
30813081
) = 0;
30823082

3083+
// Classifies a swift structure into primitives or an implicit byref for ABI purposes.
3084+
virtual void getSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOWERING* pLowering) = 0;
3085+
30833086
virtual uint32_t getLoongArch64PassStructInRegisterFlags(CORINFO_CLASS_HANDLE cls) = 0;
30843087
virtual uint32_t getRISCV64PassStructInRegisterFlags(CORINFO_CLASS_HANDLE cls) = 0;
30853088
};

src/coreclr/inc/icorjitinfoimpl_generated.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,10 @@ bool getSystemVAmd64PassStructInRegisterDescriptor(
504504
CORINFO_CLASS_HANDLE structHnd,
505505
SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr) override;
506506

507+
void getSwiftLowering(
508+
CORINFO_CLASS_HANDLE structHnd,
509+
CORINFO_SWIFT_LOWERING* pLowering) override;
510+
507511
uint32_t getLoongArch64PassStructInRegisterFlags(
508512
CORINFO_CLASS_HANDLE structHnd) override;
509513

src/coreclr/inc/jiteeversionguid.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ typedef const GUID *LPCGUID;
4343
#define GUID_DEFINED
4444
#endif // !GUID_DEFINED
4545

46-
constexpr GUID JITEEVersionIdentifier = { /* 86eab154-5d93-4fad-bc07-e94fd9268b70 */
47-
0x86eab154,
48-
0x5d93,
49-
0x4fad,
50-
{0xbc, 0x07, 0xe9, 0x4f, 0xd9, 0x26, 0x8b, 0x70}
46+
constexpr GUID JITEEVersionIdentifier = { /* e5f629d4-edc8-48f1-a75d-0fa1f0b5af6f */
47+
0xe5f629d4,
48+
0xedc8,
49+
0x48f1,
50+
{0xa7, 0x5d, 0x0f, 0xa1, 0xf0, 0xb5, 0xaf, 0x6f}
5151
};
5252

5353
//////////////////////////////////////////////////////////////////////////////////////////////////////////

src/coreclr/jit/ICorJitInfo_names_generated.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ DEF_CLR_API(printMethodName)
125125
DEF_CLR_API(getMethodNameFromMetadata)
126126
DEF_CLR_API(getMethodHash)
127127
DEF_CLR_API(getSystemVAmd64PassStructInRegisterDescriptor)
128+
DEF_CLR_API(getSwiftLowering)
128129
DEF_CLR_API(getLoongArch64PassStructInRegisterFlags)
129130
DEF_CLR_API(getRISCV64PassStructInRegisterFlags)
130131
DEF_CLR_API(getThreadTLSIndex)

src/coreclr/jit/ICorJitInfo_wrapper_generated.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,15 @@ bool WrapICorJitInfo::getSystemVAmd64PassStructInRegisterDescriptor(
11931193
return temp;
11941194
}
11951195

1196+
void WrapICorJitInfo::getSwiftLowering(
1197+
CORINFO_CLASS_HANDLE structHnd,
1198+
CORINFO_SWIFT_LOWERING* pLowering)
1199+
{
1200+
API_ENTER(getSwiftLowering);
1201+
wrapHnd->getSwiftLowering(structHnd, pLowering);
1202+
API_LEAVE(getSwiftLowering);
1203+
}
1204+
11961205
uint32_t WrapICorJitInfo::getLoongArch64PassStructInRegisterFlags(
11971206
CORINFO_CLASS_HANDLE structHnd)
11981207
{

src/coreclr/jit/compiler.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4377,7 +4377,9 @@ class Compiler
43774377
void impCheckForPInvokeCall(
43784378
GenTreeCall* call, CORINFO_METHOD_HANDLE methHnd, CORINFO_SIG_INFO* sig, unsigned mflags, BasicBlock* block);
43794379
GenTreeCall* impImportIndirectCall(CORINFO_SIG_INFO* sig, const DebugInfo& di = DebugInfo());
4380-
void impPopArgsForUnmanagedCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, /* OUT */ CallArg** swiftErrorArg);
4380+
void impPopArgsForUnmanagedCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, CallArg** swiftErrorArg);
4381+
void impPopArgsForSwiftCall(GenTreeCall* call, CORINFO_SIG_INFO* sig, CallArg** swiftErrorArg);
4382+
void impRetypeUnmanagedCallArgs(GenTreeCall* call);
43814383

43824384
#ifdef SWIFT_SUPPORT
43834385
void impAppendSwiftErrorStore(GenTreeCall* call, CallArg* const swiftErrorArg);

src/coreclr/jit/gentree.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4726,7 +4726,6 @@ class CallArg
47264726
CORINFO_CLASS_HANDLE GetSignatureClassHandle() { return m_signatureClsHnd; }
47274727
var_types GetSignatureType() { return m_signatureType; }
47284728
WellKnownArg GetWellKnownArg() { return m_wellKnownArg; }
4729-
void SetWellKnownArg(const WellKnownArg argType) { m_wellKnownArg = argType; }
47304729
bool IsTemp() { return m_isTmp; }
47314730
// clang-format on
47324731

0 commit comments

Comments
 (0)