From 42ff51ad2eda01d6a930a1fd4e958b3dce6652d8 Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Thu, 1 Jul 2021 11:57:28 -0700 Subject: [PATCH 1/9] switch to using CSTRMarshaller instead of AnsiBSTR --- .../TypeSystem/Interop/IL/Marshaller.cs | 105 +++++++++++------- 1 file changed, 64 insertions(+), 41 deletions(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index 46c53157b465a..e87b82f1c95dc 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1581,13 +1581,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) class AnsiStringMarshaller : Marshaller { - internal override bool CleanupRequired - { - get - { - return true; - } - } + const int MAX_LOCAL_BUFFER_LENGTH = 256; // TODO: Is this accurate on all platforms? internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter) { @@ -1603,24 +1597,77 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // ANSI marshalling. Allocate a byte array, copy characters // -#if READYTORUN var stringToAnsi = - Context.SystemModule.GetKnownType("System.StubHelpers", "AnsiBSTRMarshaler") + Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") .GetKnownMethod("ConvertToNative", null); + + bool bPassByValueInOnly = In && !Out && !IsManagedByRef; + ILLocalVariable localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.IntPtr)); + if (bPassByValueInOnly) + { + var bufSize = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Int32)); + //localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Byte)); + + // LocalBuffer = 0 + codeStream.Emit(ILOpcode.ldnull); + codeStream.EmitStLoc(localBuffer); + + var noOptimize = emitter.NewCodeLabel(); + + // if == NULL, goto NoOptimize + LoadManagedValue(codeStream); + codeStream.Emit(ILOpcode.brfalse, noOptimize); + + // String.Length + 2 + LoadManagedValue(codeStream); + var stringLen = + Context.SystemModule.GetKnownType("System", "String") + .GetKnownMethod("get_Length", null); + codeStream.Emit(ILOpcode.call, emitter.NewToken(stringLen)); + codeStream.EmitLdc(2); + codeStream.Emit(ILOpcode.add); + + // (String.Length + 2) * GetMaxDBCSCharByteSize() + codeStream.Emit(ILOpcode.ldsfld, emitter.NewToken(Context.SystemModule.GetKnownType( + "System.Runtime.InteropServices","Marshal") + .GetKnownField("SystemMaxDBCSCharSize"))); + codeStream.Emit(ILOpcode.mul_ovf); + + // BufSize = (String.Length + 2) * GetMaxDBCSCharByteSize() + codeStream.EmitStLoc(bufSize); + + // if (MAX_LOCAL_BUFFER_LENGTH < BufSize ) goto NoOptimize + codeStream.EmitLdc(MAX_LOCAL_BUFFER_LENGTH + 1); + codeStream.EmitLdLoc(bufSize); + codeStream.Emit(ILOpcode.clt); + codeStream.Emit(ILOpcode.brtrue, noOptimize); + + // LocalBuffer = localloc(BufSize); + codeStream.EmitLdLoc(bufSize); + codeStream.Emit(ILOpcode.localloc); + codeStream.EmitStLoc(localBuffer); + + // NoOptimize: + codeStream.EmitLabel(noOptimize); + } + int flags = (PInvokeFlags.BestFitMapping ? 0x1 : 0) | (PInvokeFlags.ThrowOnUnmappableChar ? 0x100 : 0); + + // CSTRMarshaler.ConvertToNative pManaged, dwAnsiMarshalFlags, pLocalBuffer codeStream.EmitLdc(flags); LoadManagedValue(codeStream); - codeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi)); -#else - LoadManagedValue(codeStream); - var stringToAnsi = Context.GetHelperEntryPoint("InteropHelpers", "StringToAnsiString"); - codeStream.Emit(PInvokeFlags.BestFitMapping ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); - codeStream.Emit(PInvokeFlags.ThrowOnUnmappableChar ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); + if (bPassByValueInOnly) + { + codeStream.EmitLdLoc(localBuffer); + } + else + { + codeStream.Emit(ILOpcode.ldnull); + } codeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi)); -#endif StoreNativeValue(codeStream); } @@ -1631,7 +1678,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream) #if READYTORUN var ansiToString = - Context.SystemModule.GetKnownType("System.StubHelpers", "AnsiBSTRMarshaler") + Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") .GetKnownMethod("ConvertToManaged", null); #else var ansiToString = Context.GetHelperEntryPoint("InteropHelpers", "AnsiStringToString"); @@ -1640,30 +1687,6 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream) codeStream.Emit(ILOpcode.call, emitter.NewToken(ansiToString)); StoreManagedValue(codeStream); } - - protected override void EmitCleanupManaged(ILCodeStream codeStream) - { - var emitter = _ilCodeStreams.Emitter; -#if READYTORUN - MethodDesc clearNative = - Context.SystemModule.GetKnownType("System.StubHelpers", "AnsiBSTRMarshaler") - .GetKnownMethod("ClearNative", null); - LoadNativeValue(codeStream); - codeStream.Emit(ILOpcode.call, emitter.NewToken(clearNative)); -#else - var lNullCheck = emitter.NewCodeLabel(); - - // Check for null array - LoadManagedValue(codeStream); - codeStream.Emit(ILOpcode.brfalse, lNullCheck); - - LoadNativeValue(codeStream); - codeStream.Emit(ILOpcode.call, emitter.NewToken( - Context.GetHelperEntryPoint("InteropHelpers", "CoTaskMemFree"))); - - codeStream.EmitLabel(lNullCheck); -#endif - } } class UTF8StringMarshaller : Marshaller From 821aece0a8c1b77a524b79b6b191c85c874402db Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:02:34 -0700 Subject: [PATCH 2/9] cleanup --- src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index e87b82f1c95dc..858795d3a32d5 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1606,7 +1606,6 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) if (bPassByValueInOnly) { var bufSize = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Int32)); - //localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Byte)); // LocalBuffer = 0 codeStream.Emit(ILOpcode.ldnull); From 39f17b80e9388cb3b1bcadb841c4d1b345c5ea63 Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Thu, 1 Jul 2021 23:05:48 -0700 Subject: [PATCH 3/9] Add CleanupManaged back Updated the cleanup logic to the one implemented in ILOptimizedAllocMarshaler::EmitClearNative --- .../TypeSystem/Interop/IL/Marshaller.cs | 73 +++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index 858795d3a32d5..16a790f5ba922 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1581,7 +1581,17 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) class AnsiStringMarshaller : Marshaller { - const int MAX_LOCAL_BUFFER_LENGTH = 256; // TODO: Is this accurate on all platforms? + const int MAX_LOCAL_BUFFER_LENGTH = 256; // TODO: Is this accurate on all platforms? + + private ILLocalVariable m_localBuffer = default; + + internal override bool CleanupRequired + { + get + { + return true; + } + } internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter) { @@ -1597,19 +1607,21 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // ANSI marshalling. Allocate a byte array, copy characters // +#if READYTORUN var stringToAnsi = Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") .GetKnownMethod("ConvertToNative", null); bool bPassByValueInOnly = In && !Out && !IsManagedByRef; - ILLocalVariable localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.IntPtr)); + if (bPassByValueInOnly) { var bufSize = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Int32)); + m_localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.IntPtr)); // LocalBuffer = 0 codeStream.Emit(ILOpcode.ldnull); - codeStream.EmitStLoc(localBuffer); + codeStream.EmitStLoc(m_localBuffer); var noOptimize = emitter.NewCodeLabel(); @@ -1644,7 +1656,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // LocalBuffer = localloc(BufSize); codeStream.EmitLdLoc(bufSize); codeStream.Emit(ILOpcode.localloc); - codeStream.EmitStLoc(localBuffer); + codeStream.EmitStLoc(m_localBuffer); // NoOptimize: codeStream.EmitLabel(noOptimize); @@ -1657,9 +1669,9 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) codeStream.EmitLdc(flags); LoadManagedValue(codeStream); - if (bPassByValueInOnly) + if (m_localBuffer != default) { - codeStream.EmitLdLoc(localBuffer); + codeStream.EmitLdLoc(m_localBuffer); } else { @@ -1667,6 +1679,14 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) } codeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi)); +#else + LoadManagedValue(codeStream); + var stringToAnsi = Context.GetHelperEntryPoint("InteropHelpers", "StringToAnsiString"); + + codeStream.Emit(PInvokeFlags.BestFitMapping ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); + codeStream.Emit(PInvokeFlags.ThrowOnUnmappableChar ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); + codeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi)); +#endif StoreNativeValue(codeStream); } @@ -1686,6 +1706,47 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream) codeStream.Emit(ILOpcode.call, emitter.NewToken(ansiToString)); StoreManagedValue(codeStream); } + + protected override void EmitCleanupManaged(ILCodeStream codeStream) + { + var emitter = _ilCodeStreams.Emitter; +#if READYTORUN + var optimize = emitter.NewCodeLabel(); + + MethodDesc clearNative = + Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") + .GetKnownMethod("ClearNative", null); + + if (m_localBuffer != default) + { + // if (m_dwLocalBuffer) goto Optimize + codeStream.EmitLdLoc(m_localBuffer); + codeStream.Emit(ILOpcode.brtrue, optimize); + } + + LoadNativeValue(codeStream); + // static void m_idClearNative(IntPtr ptr) + codeStream.Emit(ILOpcode.call, emitter.NewToken(clearNative)); + + // Optimize: + if (m_localBuffer != default) + { + codeStream.EmitLabel(optimize); + } +#else + var lNullCheck = emitter.NewCodeLabel(); + + // Check for null array + LoadManagedValue(codeStream); + codeStream.Emit(ILOpcode.brfalse, lNullCheck); + + LoadNativeValue(codeStream); + codeStream.Emit(ILOpcode.call, emitter.NewToken( + Context.GetHelperEntryPoint("InteropHelpers", "CoTaskMemFree"))); + + codeStream.EmitLabel(lNullCheck); +#endif + } } class UTF8StringMarshaller : Marshaller From 5d24e5a45b85c67c748b3706ba3eb5d75751e93e Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Fri, 2 Jul 2021 00:49:41 -0700 Subject: [PATCH 4/9] CR feedback --- .../TypeSystem/Interop/IL/Marshaller.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index 16a790f5ba922..f5feca1c1a688 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1583,7 +1583,7 @@ class AnsiStringMarshaller : Marshaller { const int MAX_LOCAL_BUFFER_LENGTH = 256; // TODO: Is this accurate on all platforms? - private ILLocalVariable m_localBuffer = default; + private ILLocalVariable _localBuffer = default; internal override bool CleanupRequired { @@ -1617,11 +1617,11 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) if (bPassByValueInOnly) { var bufSize = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.Int32)); - m_localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.IntPtr)); + _localBuffer = emitter.NewLocal(Context.GetWellKnownType(WellKnownType.IntPtr)); // LocalBuffer = 0 codeStream.Emit(ILOpcode.ldnull); - codeStream.EmitStLoc(m_localBuffer); + codeStream.EmitStLoc(_localBuffer); var noOptimize = emitter.NewCodeLabel(); @@ -1656,7 +1656,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // LocalBuffer = localloc(BufSize); codeStream.EmitLdLoc(bufSize); codeStream.Emit(ILOpcode.localloc); - codeStream.EmitStLoc(m_localBuffer); + codeStream.EmitStLoc(_localBuffer); // NoOptimize: codeStream.EmitLabel(noOptimize); @@ -1669,9 +1669,9 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) codeStream.EmitLdc(flags); LoadManagedValue(codeStream); - if (m_localBuffer != default) + if (_localBuffer != default) { - codeStream.EmitLdLoc(m_localBuffer); + codeStream.EmitLdLoc(_localBuffer); } else { @@ -1685,6 +1685,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) codeStream.Emit(PInvokeFlags.BestFitMapping ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); codeStream.Emit(PInvokeFlags.ThrowOnUnmappableChar ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0); + codeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi)); #endif @@ -1717,10 +1718,10 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") .GetKnownMethod("ClearNative", null); - if (m_localBuffer != default) + if (_localBuffer != default) { // if (m_dwLocalBuffer) goto Optimize - codeStream.EmitLdLoc(m_localBuffer); + codeStream.EmitLdLoc(_localBuffer); codeStream.Emit(ILOpcode.brtrue, optimize); } @@ -1729,7 +1730,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) codeStream.Emit(ILOpcode.call, emitter.NewToken(clearNative)); // Optimize: - if (m_localBuffer != default) + if (_localBuffer != default) { codeStream.EmitLabel(optimize); } From f4f44c8e49810ae7cb2bf000dd0e8674e417a556 Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Tue, 6 Jul 2021 15:54:04 -0700 Subject: [PATCH 5/9] update MAX_LOCAL_BUFFER_LENGTH --- src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index f5feca1c1a688..b59d0523fd22c 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1581,7 +1581,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) class AnsiStringMarshaller : Marshaller { - const int MAX_LOCAL_BUFFER_LENGTH = 256; // TODO: Is this accurate on all platforms? + const int MAX_LOCAL_BUFFER_LENGTH = 260 + 1; // MAX_PATH + 1 private ILLocalVariable _localBuffer = default; From 8575306e73ee6b009bc05a8153abd7afa4380dfc Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Wed, 7 Jul 2021 23:05:45 -0700 Subject: [PATCH 6/9] generate stubs for all methods if corelib is within the bubble. --- .../Compiler/ReadyToRunCompilationModuleGroupBase.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs index 4ba66a5ca9ccc..022f63495bdfa 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs @@ -347,10 +347,8 @@ public sealed override bool GeneratesPInvoke(MethodDesc method) { // PInvokes depend on details of the core library, so for now only compile them if: // 1) We're compiling the core library module, or - // 2) We're compiling any module, and no marshalling is needed - // - // TODO Future: consider compiling PInvokes with complex marshalling in version bubble - // mode when the core library is included in the bubble. + // 2) We're compiling any module, and no marshalling is needed, or + // 3) We're compiling any module, and core library module is in the same bubble, and marhaller supports compilation Debug.Assert(method is EcmaMethod); @@ -359,7 +357,7 @@ public sealed override bool GeneratesPInvoke(MethodDesc method) if (!_versionBubbleModuleSet.Contains(((EcmaMethod)method).Module)) return false; - if (((EcmaMethod)method).Module.Equals(method.Context.SystemModule)) + if (_versionBubbleModuleSet.Contains(method.Context.SystemModule)) return true; return !Marshaller.IsMarshallingRequired(method); From a3f5ac29500d0780b6e7faf6a7e4ff04b521b040 Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Thu, 8 Jul 2021 13:24:43 -0700 Subject: [PATCH 7/9] Revert "generate stubs for all methods if corelib is within the bubble." This reverts commit 8575306e73ee6b009bc05a8153abd7afa4380dfc. --- .../Compiler/ReadyToRunCompilationModuleGroupBase.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs index 022f63495bdfa..4ba66a5ca9ccc 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilationModuleGroupBase.cs @@ -347,8 +347,10 @@ public sealed override bool GeneratesPInvoke(MethodDesc method) { // PInvokes depend on details of the core library, so for now only compile them if: // 1) We're compiling the core library module, or - // 2) We're compiling any module, and no marshalling is needed, or - // 3) We're compiling any module, and core library module is in the same bubble, and marhaller supports compilation + // 2) We're compiling any module, and no marshalling is needed + // + // TODO Future: consider compiling PInvokes with complex marshalling in version bubble + // mode when the core library is included in the bubble. Debug.Assert(method is EcmaMethod); @@ -357,7 +359,7 @@ public sealed override bool GeneratesPInvoke(MethodDesc method) if (!_versionBubbleModuleSet.Contains(((EcmaMethod)method).Module)) return false; - if (_versionBubbleModuleSet.Contains(method.Context.SystemModule)) + if (((EcmaMethod)method).Module.Equals(method.Context.SystemModule)) return true; return !Marshaller.IsMarshallingRequired(method); From 185ccc038b18efc819ce8970cf9224266a0b12aa Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Mon, 12 Jul 2021 11:06:46 -0700 Subject: [PATCH 8/9] CR feedback --- .../Common/TypeSystem/Interop/IL/Marshaller.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index b59d0523fd22c..a3561ceef4b05 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1581,9 +1581,11 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) class AnsiStringMarshaller : Marshaller { +#if READYTORUN const int MAX_LOCAL_BUFFER_LENGTH = 260 + 1; // MAX_PATH + 1 - private ILLocalVariable _localBuffer = default; + private ILLocalVariable? _localBuffer = null; +#endif internal override bool CleanupRequired { @@ -1621,7 +1623,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // LocalBuffer = 0 codeStream.Emit(ILOpcode.ldnull); - codeStream.EmitStLoc(_localBuffer); + codeStream.EmitStLoc((ILLocalVariable)_localBuffer); var noOptimize = emitter.NewCodeLabel(); @@ -1656,7 +1658,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // LocalBuffer = localloc(BufSize); codeStream.EmitLdLoc(bufSize); codeStream.Emit(ILOpcode.localloc); - codeStream.EmitStLoc(_localBuffer); + codeStream.EmitStLoc((ILLocalVariable)_localBuffer); // NoOptimize: codeStream.EmitLabel(noOptimize); @@ -1669,9 +1671,9 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) codeStream.EmitLdc(flags); LoadManagedValue(codeStream); - if (_localBuffer != default) + if (_localBuffer.HasValue) { - codeStream.EmitLdLoc(_localBuffer); + codeStream.EmitLdLoc((ILLocalVariable)_localBuffer); } else { @@ -1718,10 +1720,10 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream) Context.SystemModule.GetKnownType("System.StubHelpers", "CSTRMarshaler") .GetKnownMethod("ClearNative", null); - if (_localBuffer != default) + if (_localBuffer.HasValue) { // if (m_dwLocalBuffer) goto Optimize - codeStream.EmitLdLoc(_localBuffer); + codeStream.EmitLdLoc((ILLocalVariable)_localBuffer); codeStream.Emit(ILOpcode.brtrue, optimize); } From 56f8cbe6b5243c62e2a2db2d158db906bf9114a1 Mon Sep 17 00:00:00 2001 From: Manish Godse <61718172+mangod9@users.noreply.github.com> Date: Mon, 12 Jul 2021 11:09:11 -0700 Subject: [PATCH 9/9] use wellknowntype --- src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs index a3561ceef4b05..f78e4df8a29e7 100644 --- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs +++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs @@ -1634,7 +1634,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream) // String.Length + 2 LoadManagedValue(codeStream); var stringLen = - Context.SystemModule.GetKnownType("System", "String") + Context.GetWellKnownType(WellKnownType.String) .GetKnownMethod("get_Length", null); codeStream.Emit(ILOpcode.call, emitter.NewToken(stringLen)); codeStream.EmitLdc(2);