public void TestDependencyGraphInvariants(EcmaMethod method) { // // Scan the input method // var context = (CompilerTypeSystemContext)method.Context; CompilationModuleGroup compilationGroup = new SingleFileCompilationModuleGroup(context); CompilationBuilder builder = new RyuJitCompilationBuilder(context, compilationGroup); IILScanner scanner = builder.GetILScannerBuilder() .UseCompilationRoots(new ICompilationRootProvider[] { new SingleMethodRootProvider(method) }) .ToILScanner(); ILScanResults results = scanner.Scan(); // // Check invariants // const string assetsNamespace = "ILCompiler.Compiler.Tests.Assets"; bool foundSomethingToCheck = false; foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "GeneratesConstructedEETypeAttribute")) { foundSomethingToCheck = true; Assert.Contains((TypeDesc)attr.FixedArguments[0].Value, results.ConstructedEETypes); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "NoConstructedEETypeAttribute")) { foundSomethingToCheck = true; Assert.DoesNotContain((TypeDesc)attr.FixedArguments[0].Value, results.ConstructedEETypes); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "GeneratesMethodBodyAttribute")) { foundSomethingToCheck = true; MethodDesc methodToCheck = GetMethodFromAttribute(attr); Assert.Contains(methodToCheck.GetCanonMethodTarget(CanonicalFormKind.Specific), results.CompiledMethodBodies); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "NoMethodBodyAttribute")) { foundSomethingToCheck = true; MethodDesc methodToCheck = GetMethodFromAttribute(attr); Assert.DoesNotContain(methodToCheck.GetCanonMethodTarget(CanonicalFormKind.Specific), results.CompiledMethodBodies); } // // Make sure we checked something // Assert.True(foundSomethingToCheck, "No invariants to check?"); }
private DevirtualizationManager GetDevirtualizationManagerFromScan(MethodDesc method) { CompilationModuleGroup compilationGroup = new SingleFileCompilationModuleGroup(); CompilationBuilder builder = new RyuJitCompilationBuilder(_context, compilationGroup); IILScanner scanner = builder.GetILScannerBuilder() .UseCompilationRoots(new ICompilationRootProvider[] { new SingleMethodRootProvider(method) }) .ToILScanner(); return(scanner.Scan().GetDevirtualizationManager()); }
public void TestDependencyGraphInvariants(EcmaMethod method) { // // Scan the input method // var context = (CompilerTypeSystemContext)method.Context; CompilationModuleGroup compilationGroup = new SingleFileCompilationModuleGroup(); CoreRTILProvider ilProvider = new CoreRTILProvider(); UsageBasedMetadataManager metadataManager = new UsageBasedMetadataManager(compilationGroup, context, new FullyBlockedMetadataBlockingPolicy(), new FullyBlockedManifestResourceBlockingPolicy(), null, new NoStackTraceEmissionPolicy(), new NoDynamicInvokeThunkGenerationPolicy(), new Dataflow.FlowAnnotations(Logger.Null, ilProvider), UsageBasedMetadataGenerationOptions.None, Logger.Null, Array.Empty <KeyValuePair <string, bool> >(), Array.Empty <string>(), Array.Empty <string>()); CompilationBuilder builder = new RyuJitCompilationBuilder(context, compilationGroup) .UseILProvider(ilProvider); IILScanner scanner = builder.GetILScannerBuilder() .UseCompilationRoots(new ICompilationRootProvider[] { new SingleMethodRootProvider(method) }) .UseMetadataManager(metadataManager) .ToILScanner(); ILScanResults results = scanner.Scan(); // // Check invariants // const string assetsNamespace = "ILCompiler.Compiler.Tests.Assets"; bool foundSomethingToCheck = false; foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "GeneratesConstructedEETypeAttribute")) { foundSomethingToCheck = true; Assert.Contains((TypeDesc)attr.FixedArguments[0].Value, results.ConstructedEETypes); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "NoConstructedEETypeAttribute")) { foundSomethingToCheck = true; Assert.DoesNotContain((TypeDesc)attr.FixedArguments[0].Value, results.ConstructedEETypes); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "GeneratesMethodBodyAttribute")) { foundSomethingToCheck = true; MethodDesc methodToCheck = GetMethodFromAttribute(attr); Assert.Contains(methodToCheck.GetCanonMethodTarget(CanonicalFormKind.Specific), results.CompiledMethodBodies); } foreach (var attr in method.GetDecodedCustomAttributes(assetsNamespace, "NoMethodBodyAttribute")) { foundSomethingToCheck = true; MethodDesc methodToCheck = GetMethodFromAttribute(attr); Assert.DoesNotContain(methodToCheck.GetCanonMethodTarget(CanonicalFormKind.Specific), results.CompiledMethodBodies); } // // Make sure we checked something // Assert.True(foundSomethingToCheck, "No invariants to check?"); }