From 6d2da0be724e71c6da4f05a07d80755a77f5bd9f Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Feb 2024 10:33:55 +0100 Subject: [PATCH 1/3] Add null checks into memcpy/memset helpers --- .../Runtime/CompilerHelpers/MemoryHelpers.cs | 36 +++++++++++++++++++ .../src/System.Private.CoreLib.csproj | 1 + .../src/System/Runtime/RuntimeImports.cs | 3 ++ .../ILCompiler.Compiler/Compiler/JitHelper.cs | 4 +-- 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs new file mode 100644 index 00000000000000..1cb1ba65a67929 --- /dev/null +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs @@ -0,0 +1,36 @@ +// 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; +using System.Runtime.CompilerServices; + +namespace Internal.Runtime.CompilerHelpers +{ + /// + /// These methods are used to implement memcpy and memset intrinsics with null checks. + /// + internal static class MemoryHelpers + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void MemSet(byte* dest, int value, nuint size) + { + if (size > 0) + { + _ = *dest; + RuntimeImports.memset(dest, value, size); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static unsafe void MemCopy(byte* dest, byte* src, nuint size) + { + if (size > 0) + { + _ = *dest; + _ = *src; + RuntimeImports.memcpy(dest, src, size); + } + } + } +} diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj b/src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj index 4ca91458c70e71..d6e8c3a7e90274 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj @@ -100,6 +100,7 @@ + diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs index 3f30983a74c3b2..8d9240c835bfd5 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs @@ -1098,6 +1098,9 @@ internal static partial void NativeRuntimeEventSource_LogWaitHandleWaitStart( [LibraryImport(RuntimeImports.RuntimeLibrary)] internal static unsafe partial void* memmove(byte* dmem, byte* smem, nuint size); + [LibraryImport(RuntimeImports.RuntimeLibrary)] + internal static unsafe partial void* memcpy(byte* dmem, byte* smem, nuint size); + [LibraryImport(RuntimeImports.RuntimeLibrary)] internal static unsafe partial void* memset(byte* mem, int value, nuint size); diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.cs index 9e7285b751a3d3..c55dc58175b05f 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.cs @@ -134,10 +134,10 @@ public static void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id, break; case ReadyToRunHelper.MemCpy: - mangledName = "memcpy"; // TODO: Null reference handling + methodDesc = context.GetHelperEntryPoint("MemoryHelpers", "MemCopy"); break; case ReadyToRunHelper.MemSet: - mangledName = "memset"; // TODO: Null reference handling + methodDesc = context.GetHelperEntryPoint("MemoryHelpers", "MemSet"); break; case ReadyToRunHelper.GetRuntimeTypeHandle: From 022b0f4b09b3056e8fa0fc5214da0fece4f72302 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Feb 2024 10:41:15 +0100 Subject: [PATCH 2/3] Remove MethodImpl attribute --- .../src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs index 1cb1ba65a67929..6a8f45b1efb4a6 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs @@ -3,7 +3,6 @@ using System; using System.Runtime; -using System.Runtime.CompilerServices; namespace Internal.Runtime.CompilerHelpers { @@ -12,7 +11,6 @@ namespace Internal.Runtime.CompilerHelpers /// internal static class MemoryHelpers { - [MethodImpl(MethodImplOptions.AggressiveInlining)] private static unsafe void MemSet(byte* dest, int value, nuint size) { if (size > 0) @@ -22,7 +20,6 @@ private static unsafe void MemSet(byte* dest, int value, nuint size) } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] private static unsafe void MemCopy(byte* dest, byte* src, nuint size) { if (size > 0) From 9a2a842c47cd10b1712fe84c9ff776f7b6dd0f9b Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Fri, 16 Feb 2024 11:04:44 +0100 Subject: [PATCH 3/3] PR feedback --- .../Runtime/CompilerHelpers/MemoryHelpers.cs | 14 +++++++------- .../src/System/Runtime/RuntimeImports.cs | 3 --- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs index 6a8f45b1efb4a6..644fcf1a59940e 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/MemoryHelpers.cs @@ -11,22 +11,22 @@ namespace Internal.Runtime.CompilerHelpers /// internal static class MemoryHelpers { - private static unsafe void MemSet(byte* dest, int value, nuint size) + private static unsafe void MemSet(ref byte dest, byte value, nuint size) { if (size > 0) { - _ = *dest; - RuntimeImports.memset(dest, value, size); + _ = dest; + SpanHelpers.Fill(ref dest, size, value); } } - private static unsafe void MemCopy(byte* dest, byte* src, nuint size) + private static unsafe void MemCopy(ref byte dest, ref byte src, nuint size) { if (size > 0) { - _ = *dest; - _ = *src; - RuntimeImports.memcpy(dest, src, size); + _ = dest; + _ = src; + Buffer.Memmove(ref dest, ref src, size); } } } diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs index 8d9240c835bfd5..3f30983a74c3b2 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/RuntimeImports.cs @@ -1098,9 +1098,6 @@ internal static partial void NativeRuntimeEventSource_LogWaitHandleWaitStart( [LibraryImport(RuntimeImports.RuntimeLibrary)] internal static unsafe partial void* memmove(byte* dmem, byte* smem, nuint size); - [LibraryImport(RuntimeImports.RuntimeLibrary)] - internal static unsafe partial void* memcpy(byte* dmem, byte* smem, nuint size); - [LibraryImport(RuntimeImports.RuntimeLibrary)] internal static unsafe partial void* memset(byte* mem, int value, nuint size);