Skip to content

Commit fbbe2c2

Browse files
authored
Support disassembling single file bundle for ILSpy (#112541)
1 parent 9d9bbcc commit fbbe2c2

1 file changed

Lines changed: 51 additions & 10 deletions

File tree

src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/ReadyToRunReader.cs

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,12 @@ internal IAssemblyMetadata R2RManifestMetadata
379379
}
380380

381381
/// <summary>
382-
/// Initializes the fields of the R2RHeader and R2RMethods
382+
/// Minimally initializes the R2R reader.
383383
/// </summary>
384-
/// <param name="filename">PE image</param>
385-
/// <exception cref="BadImageFormatException">The Cor header flag must be ILLibrary</exception>
384+
/// <param name="assemblyResolver">Assembly resolver</param>
385+
/// <param name="metadata">Assembly metadata</param>
386+
/// <param name="peReader">PE image</param>
387+
/// <param name="filename">PE file name</param>
386388
public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename)
387389
{
388390
_assemblyResolver = assemblyResolver;
@@ -392,17 +394,57 @@ public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata me
392394
}
393395

394396
/// <summary>
395-
/// Initializes the fields of the R2RHeader and R2RMethods
397+
/// Minimally initializes the R2R reader.
396398
/// </summary>
397-
/// <param name="filename">PE image</param>
398-
/// <exception cref="BadImageFormatException">The Cor header flag must be ILLibrary</exception>
399+
/// <param name="assemblyResolver">Assembly resolver</param>
400+
/// <param name="metadata">Assembly metadata</param>
401+
/// <param name="peReader">PE image</param>
402+
/// <param name="filename">PE file name</param>
403+
/// <param name="content">PE image content</param>
404+
public ReadyToRunReader(IAssemblyResolver assemblyResolver, IAssemblyMetadata metadata, PEReader peReader, string filename, ReadOnlyMemory<byte> content)
405+
{
406+
_assemblyResolver = assemblyResolver;
407+
CompositeReader = peReader;
408+
Filename = filename;
409+
Image = ConvertToArray(content);
410+
Initialize(metadata);
411+
}
412+
413+
/// <summary>
414+
/// Minimally initializes the R2R reader.
415+
/// </summary>
416+
/// <param name="assemblyResolver">Assembly resolver</param>
417+
/// <param name="filename">PE file name</param>
399418
public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename)
400419
{
401420
_assemblyResolver = assemblyResolver;
402421
Filename = filename;
403422
Initialize(metadata: null);
404423
}
405424

425+
/// <summary>
426+
/// Minimally initializes the R2R reader.
427+
/// </summary>
428+
/// <param name="assemblyResolver">Assembly resolver</param>
429+
/// <param name="filename">PE file name</param>
430+
/// <param name="content">PE image content</param>
431+
public unsafe ReadyToRunReader(IAssemblyResolver assemblyResolver, string filename, ReadOnlyMemory<byte> content)
432+
{
433+
_assemblyResolver = assemblyResolver;
434+
Filename = filename;
435+
Image = ConvertToArray(content);
436+
Initialize(metadata: null);
437+
}
438+
439+
private unsafe byte[] ConvertToArray(ReadOnlyMemory<byte> content)
440+
{
441+
if (MemoryMarshal.TryGetArray(content, out ArraySegment<byte> segment) && (segment.Offset == 0) && (segment.Count == content.Length))
442+
{
443+
return segment.Array;
444+
}
445+
return content.ToArray();
446+
}
447+
406448
public static bool IsReadyToRunImage(PEReader peReader)
407449
{
408450
if (peReader.PEHeaders == null)
@@ -441,10 +483,9 @@ private unsafe void Initialize(IAssemblyMetadata metadata)
441483

442484
if (CompositeReader == null)
443485
{
444-
byte[] image = File.ReadAllBytes(Filename);
445-
Image = image;
486+
Image ??= File.ReadAllBytes(Filename);
487+
byte[] image = Image;
446488
ImagePin = new PinningReference(image);
447-
448489
CompositeReader = new PEReader(Unsafe.As<byte[], ImmutableArray<byte>>(ref image));
449490
}
450491
else
@@ -1140,7 +1181,7 @@ private void CountRuntimeFunctions(bool[] isEntryPoint, IDictionary<int, int[]>
11401181
count++;
11411182
i++;
11421183
} while (i < isEntryPoint.Length && !isEntryPoint[i] && i < firstColdRuntimeFunction);
1143-
1184+
11441185
if (dHotColdMap.ContainsKey(runtimeFunctionId))
11451186
{
11461187
int coldSize = dHotColdMap[runtimeFunctionId].Length;

0 commit comments

Comments
 (0)