From a794d51efd75e2a94abab95cbd5bbc1591652702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 17 Jun 2022 14:41:50 +0900 Subject: [PATCH] Avoid crashing on unresolved dependencies Fixes #70815. --- .../Compiler/LazyGenerics/GraphBuilder.cs | 7 +++++-- .../Compiler/UsageBasedMetadataManager.cs | 20 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/LazyGenerics/GraphBuilder.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/LazyGenerics/GraphBuilder.cs index 5cdf10665fa280..fd03cb65957872 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/LazyGenerics/GraphBuilder.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/LazyGenerics/GraphBuilder.cs @@ -201,8 +201,11 @@ private void WalkMethod(EcmaMethod method) && _metadataReader.GetMemberReference((MemberReferenceHandle)accessedMethod).Parent.Kind == HandleKind.TypeSpecification)) { var m = methodIL.GetObject(MetadataTokens.GetToken(accessedMethod), NotFoundBehavior.ReturnNull) as MethodDesc; - ProcessTypeReference(m.OwningType, typeContext, methodContext); - ProcessMethodCall(m, typeContext, methodContext); + if (m != null) + { + ProcessTypeReference(m.OwningType, typeContext, methodContext); + ProcessMethodCall(m, typeContext, methodContext); + } } break; diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs index d11c8c8b928861..1fce61d2bdc739 100644 --- a/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs +++ b/src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs @@ -683,13 +683,21 @@ private void GetFlowDependenciesForInstantiation(ref DependencyList dependencies var genericParameter = (GenericParameterDesc)typicalInstantiation[i]; if (FlowAnnotations.GetGenericParameterAnnotation(genericParameter) != default) { - var deps = ILCompiler.Dataflow.ReflectionMethodBodyScanner.ProcessGenericArgumentDataFlow(factory, FlowAnnotations, Logger, genericParameter, instantiation[i], source); - if (deps.Count > 0) + try { - if (dependencies == null) - dependencies = deps; - else - dependencies.AddRange(deps); + var deps = ILCompiler.Dataflow.ReflectionMethodBodyScanner.ProcessGenericArgumentDataFlow(factory, FlowAnnotations, Logger, genericParameter, instantiation[i], source); + if (deps.Count > 0) + { + if (dependencies == null) + dependencies = deps; + else + dependencies.AddRange(deps); + } + } + catch (TypeSystemException) + { + // Wasn't able to do dataflow because of missing references or something like that. + // This likely won't compile either, so we don't care about missing dependencies. } } }