diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.cs index 773a7e3b56c00c..b2c94e8d74ea6c 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedMethodILNode.cs @@ -55,21 +55,30 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) definedSymbols: new ISymbolDefinitionNode[] { this }); } - if (factory.OptimizationFlags.StripILBodies - && factory.OptimizationFlags.CompiledMethodDefs.Contains(_method) - && !_method.HasInstantiation - && !_method.OwningType.HasInstantiation) + byte[] bodyBytes = ReadBodyBytes(_method, factory.OptimizationFlags); + + return new ObjectData(bodyBytes, Array.Empty(), 4, new ISymbolDefinitionNode[] { this }); + } + + internal static byte[] ReadBodyBytes(EcmaMethod method, NodeFactoryOptimizationFlags optimizationFlags) + { + method = (EcmaMethod)method.GetTypicalMethodDefinition(); + + if (optimizationFlags.StripILBodies + && optimizationFlags.CompiledMethodDefs?.Contains(method) == true + && !method.HasInstantiation + && !method.OwningType.HasInstantiation) { - return new ObjectData(s_minimalILBody, Array.Empty(), 4, new ISymbolDefinitionNode[] { this }); + return s_minimalILBody; } - var rva = _method.MetadataReader.GetMethodDefinition(_method.Handle).RelativeVirtualAddress; - var peReader = _method.Module.PEReader; - var reader = peReader.GetSectionData(rva).GetReader(); + int rva = method.MetadataReader.GetMethodDefinition(method.Handle).RelativeVirtualAddress; + if (rva == 0) + return Array.Empty(); + BlobReader reader = method.Module.PEReader.GetSectionData(rva).GetReader(); int size = MethodBodyBlock.Create(reader).Size; - byte[] bodyBytes = peReader.GetSectionData(rva).GetReader().ReadBytes(size); - return new ObjectData(bodyBytes, Array.Empty(), 4, new ISymbolDefinitionNode[] { this }); + return reader.ReadBytes(size); } public override int ClassCode => 541651465; diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.cs index d2d4de9d0ff939..1a650160c2a34a 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunCodegenNodeFactory.cs @@ -355,11 +355,6 @@ private void CreateNodeCaches() return new CopiedMetadataBlobNode(module); }); - _copiedMethodIL = new NodeCache(method => - { - return new CopiedMethodILNode((EcmaMethod)method); - }); - _copiedFieldRvas = new NodeCache(key => { return new CopiedFieldRvaNode(key.Module, key.IntValue); @@ -1148,11 +1143,12 @@ public CopiedMetadataBlobNode CopiedMetadataBlob(EcmaModule module) return _copiedMetadataBlobs.GetOrAdd(module); } - private NodeCache _copiedMethodIL; + private readonly ConcurrentDictionary _copiedMethodIL = new(ByteArrayComparer.Instance); public CopiedMethodILNode CopiedMethodIL(EcmaMethod method) { - return _copiedMethodIL.GetOrAdd(method); + byte[] bodyBytes = CopiedMethodILNode.ReadBodyBytes(method, OptimizationFlags); + return _copiedMethodIL.GetOrAdd(bodyBytes, _ => new CopiedMethodILNode(method)); } private NodeCache _copiedFieldRvas;