From e96237015f0d4eb8b6dda2eb239bfed0f3929357 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Thu, 13 Feb 2025 14:31:44 -0800 Subject: [PATCH 1/6] Support disassembling single file bundle for ILSpy --- .../ReadyToRunReader.cs | 61 ++++++++++++++++--- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index 77326d6513628a..8f986d17bbc696 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -379,10 +379,12 @@ internal IAssemblyMetadata R2RManifestMetadata } /// - /// Initializes the fields of the R2RHeader and R2RMethods + /// Minimally initializes the R2R reader. /// - /// PE image - /// The Cor header flag must be ILLibrary + /// Assembly resolver + /// Assembly metadata + /// PE image + /// PE file name public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename) { _assemblyResolver = assemblyResolver; @@ -392,10 +394,27 @@ public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata me } /// - /// Initializes the fields of the R2RHeader and R2RMethods + /// Minimally initializes the R2R reader. /// - /// PE image - /// The Cor header flag must be ILLibrary + /// Assembly resolver + /// Assembly metadata + /// PE image + /// PE file name + /// PE image content + public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename, ImmutableArray content) + { + _assemblyResolver = assemblyResolver; + CompositeReader = peReader; + Filename = filename; + Image = Unsafe.As, byte[]>(ref content); + Initialize(metadata); + } + + /// + /// Minimally initializes the R2R reader. + /// + /// Assembly resolver + /// PE file name public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename) { _assemblyResolver = assemblyResolver; @@ -403,6 +422,20 @@ public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filena Initialize(metadata: null); } + /// + /// Minimally initializes the R2R reader. + /// + /// Assembly resolver + /// PE file name + /// PE image content + public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename, ImmutableArray content) + { + _assemblyResolver = assemblyResolver; + Filename = filename; + Image = Unsafe.As, byte[]>(ref content); + Initialize(metadata: null); + } + public static bool IsReadyToRunImage(PEReader peReader) { if (peReader.PEHeaders == null) @@ -441,10 +474,18 @@ private unsafe void Initialize(IAssemblyMetadata metadata) if (CompositeReader == null) { - byte[] image = File.ReadAllBytes(Filename); - Image = image; - ImagePin = new PinningReference(image); + byte[] image = null; + if (Image == null) + { + File.ReadAllBytes(Filename); + Image = image; + } + else + { + image = Image; + } + ImagePin = new PinningReference(image); CompositeReader = new PEReader(Unsafe.As>(ref image)); } else @@ -1140,7 +1181,7 @@ private void CountRuntimeFunctions(bool[] isEntryPoint, IDictionary count++; i++; } while (i < isEntryPoint.Length && !isEntryPoint[i] && i < firstColdRuntimeFunction); - + if (dHotColdMap.ContainsKey(runtimeFunctionId)) { int coldSize = dHotColdMap[runtimeFunctionId].Length; From b53c646dc5901039103c53adb1a3724d106a863c Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Fri, 14 Feb 2025 07:35:47 -0800 Subject: [PATCH 2/6] Use safer marshal --- .../aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index 8f986d17bbc696..e105955945e38d 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -406,7 +406,7 @@ public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata me _assemblyResolver = assemblyResolver; CompositeReader = peReader; Filename = filename; - Image = Unsafe.As, byte[]>(ref content); + Image = ImmutableCollectionsMarshal.AsArray(content); Initialize(metadata); } @@ -432,7 +432,7 @@ public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filena { _assemblyResolver = assemblyResolver; Filename = filename; - Image = Unsafe.As, byte[]>(ref content); + Image = ImmutableCollectionsMarshal.AsArray(content); Initialize(metadata: null); } From 1e62ad819bb33b3b5c03fb7d916d07a2b63200ca Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Fri, 14 Feb 2025 11:52:20 -0800 Subject: [PATCH 3/6] Accept ReadOnlyMemory --- .../ReadyToRunReader.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index e105955945e38d..d6dbed3aa9aa11 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -401,12 +401,12 @@ public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata me /// PE image /// PE file name /// PE image content - public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename, ImmutableArray content) + public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename, ReadOnlyMemory content) { _assemblyResolver = assemblyResolver; CompositeReader = peReader; Filename = filename; - Image = ImmutableCollectionsMarshal.AsArray(content); + Image = ConvertToArray(content); Initialize(metadata); } @@ -428,14 +428,26 @@ public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filena /// Assembly resolver /// PE file name /// PE image content - public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename, ImmutableArray content) + public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename, ReadOnlyMemory content) { _assemblyResolver = assemblyResolver; Filename = filename; - Image = ImmutableCollectionsMarshal.AsArray(content); + Image = ConvertToArray(content); Initialize(metadata: null); } + private unsafe byte[] ConvertToArray(ReadOnlyMemory content) + { + if (MemoryMarshal.TryGetArray(content, out ArraySegment segment)) + { + return segment.Array; + } + else + { + return content.ToArray(); + } + } + public static bool IsReadyToRunImage(PEReader peReader) { if (peReader.PEHeaders == null) From 0573efd96d6f64e2c73dcd8bb5a70aad2d56de16 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Fri, 14 Feb 2025 14:26:14 -0800 Subject: [PATCH 4/6] Fix a bug --- .../aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index d6dbed3aa9aa11..36a482224182f9 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -489,7 +489,7 @@ private unsafe void Initialize(IAssemblyMetadata metadata) byte[] image = null; if (Image == null) { - File.ReadAllBytes(Filename); + image = File.ReadAllBytes(Filename); Image = image; } else From ba93ffe8d417af5bd7ad05d653fbf80d5c1493a7 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Wed, 19 Feb 2025 14:09:22 -0800 Subject: [PATCH 5/6] Check Count and Length --- .../ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index 36a482224182f9..974ff4bb74e54e 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -438,14 +438,11 @@ public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filena private unsafe byte[] ConvertToArray(ReadOnlyMemory content) { - if (MemoryMarshal.TryGetArray(content, out ArraySegment segment)) + if (MemoryMarshal.TryGetArray(content, out ArraySegment segment) && (segment.Offset == 0) && (segment.Count == content.Length)) { return segment.Array; } - else - { - return content.ToArray(); - } + return content.ToArray(); } public static bool IsReadyToRunImage(PEReader peReader) From 8f5b28070e4b50ee212e65d584ae73af6be97029 Mon Sep 17 00:00:00 2001 From: Andrew Au Date: Tue, 25 Feb 2025 09:57:28 -0800 Subject: [PATCH 6/6] Code review feedback --- .../ReadyToRunReader.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs index 974ff4bb74e54e..4f5f71c5f035f4 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs @@ -483,17 +483,8 @@ private unsafe void Initialize(IAssemblyMetadata metadata) if (CompositeReader == null) { - byte[] image = null; - if (Image == null) - { - image = File.ReadAllBytes(Filename); - Image = image; - } - else - { - image = Image; - } - + Image ??= File.ReadAllBytes(Filename); + byte[] image = Image; ImagePin = new PinningReference(image); CompositeReader = new PEReader(Unsafe.As>(ref image)); }