From ffee4be94d203e1001fdcf351864bd3e1139f297 Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Tue, 24 Jul 2018 10:24:58 -0700 Subject: [PATCH 1/3] New ReadyToRunCompilationModuleGroup --- ...adyToRunMultiFileCompilationModuleGroup.cs | 132 ++++++++++++++++++ .../src/ILCompiler.Compiler.csproj | 1 + src/ILCompiler/src/Program.cs | 9 +- 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs diff --git a/src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs b/src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs new file mode 100644 index 00000000000..6d96b8366d8 --- /dev/null +++ b/src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs @@ -0,0 +1,132 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; + +using ILCompiler.DependencyAnalysis; +using Internal.TypeSystem; +using Internal.TypeSystem.Ecma; + +namespace ILCompiler +{ + public abstract class ReadyToRunMultiFileCompilationModuleGroup : CompilationModuleGroup + { + private HashSet _compilationModuleSet; + + public ReadyToRunMultiFileCompilationModuleGroup(TypeSystemContext context, IEnumerable compilationModuleSet) + { + _compilationModuleSet = new HashSet(compilationModuleSet); + + // The fake assembly that holds compiler generated types is part of the compilation. + _compilationModuleSet.Add(context.GeneratedAssembly); + } + + public sealed override bool ContainsType(TypeDesc type)// + { + if (type is EcmaType ecmaType) + { + return IsModuleInCompilationGroup(ecmaType.EcmaModule); + } + if (type is InstantiatedType instantiatedType) + { + return ContainsType(instantiatedType.GetTypeDefinition()); + } + return true; + } + + public sealed override bool ContainsTypeDictionary(TypeDesc type) + { + return ContainsType(type); + } + + public sealed override bool ContainsMethodBody(MethodDesc method, bool unboxingStub)// + { + if (method.HasInstantiation) + return true; + + return ContainsType(method.OwningType); + } + + public sealed override bool ContainsMethodDictionary(MethodDesc method) + { + Debug.Assert(method.GetCanonMethodTarget(CanonicalFormKind.Specific) != method); + return ContainsMethodBody(method, false); + } + + public sealed override ExportForm GetExportTypeForm(TypeDesc type) + { + return ExportForm.None; + } + + public sealed override ExportForm GetExportTypeFormDictionary(TypeDesc type) + { + return ExportForm.None; + } + + public sealed override ExportForm GetExportMethodForm(MethodDesc method, bool unboxingStub) + { + return ExportForm.None; + } + + public override ExportForm GetExportMethodDictionaryForm(MethodDesc method) + { + return ExportForm.None; + } + + private bool IsModuleInCompilationGroup(EcmaModule module)// + { + return _compilationModuleSet.Contains(module); + } + + public sealed override bool IsSingleFileCompilation// + { + get + { + return false; + } + } + + public sealed override bool ShouldReferenceThroughImportTable(TypeDesc type) + { + return false; + } + + public override bool CanHaveReferenceThroughImportTable + { + get + { + return false; + } + } + } + + /// + /// Represents a non-leaf multifile compilation group where types contained in the group are always fully expanded. + /// + public class ReadyToRunMultiFileSharedCompilationModuleGroup : ReadyToRunMultiFileCompilationModuleGroup + { + public ReadyToRunMultiFileSharedCompilationModuleGroup(TypeSystemContext context, IEnumerable compilationModuleSet) + : base(context, compilationModuleSet) + { + } + + public override bool ShouldProduceFullVTable(TypeDesc type) + { + return ConstructedEETypeNode.CreationAllowed(type); + } + + public override bool ShouldPromoteToFullType(TypeDesc type) + { + return ShouldProduceFullVTable(type); + } + + public override bool PresenceOfEETypeImpliesAllMethodsOnType(TypeDesc type) + { + return (type.HasInstantiation || type.IsArray) && ShouldProduceFullVTable(type) && + type.ConvertToCanonForm(CanonicalFormKind.Specific).IsCanonicalSubtype(CanonicalFormKind.Any); + } + } +} diff --git a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj index 3e41451b8d1..82a936e61f5 100644 --- a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj +++ b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj @@ -87,6 +87,7 @@ + diff --git a/src/ILCompiler/src/Program.cs b/src/ILCompiler/src/Program.cs index 0ab79971330..4d93e438c8b 100644 --- a/src/ILCompiler/src/Program.cs +++ b/src/ILCompiler/src/Program.cs @@ -378,7 +378,14 @@ private int Run(string[] args) inputModules.Add(module); } - compilationGroup = new MultiFileSharedCompilationModuleGroup(typeSystemContext, inputModules); + if (_isReadyToRunCodeGen) + { + compilationGroup = new ReadyToRunMultiFileSharedCompilationModuleGroup(typeSystemContext, inputModules); + } + else + { + compilationGroup = new MultiFileSharedCompilationModuleGroup(typeSystemContext, inputModules); + } } else { From 8fc3c4cdf72ac97e5a7c1ff755b0c3f45cc30deb Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Tue, 24 Jul 2018 10:47:29 -0700 Subject: [PATCH 2/3] Move ReadyToRunMultiFileCompilationModuleGroup to ILCompiler.ReadyToRun project --- src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj | 1 - .../Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs | 8 ++++---- .../src/ILCompiler.ReadyToRun.csproj | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) rename src/{ILCompiler.Compiler => ILCompiler.ReadyToRun}/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs (96%) diff --git a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj index 82a936e61f5..3e41451b8d1 100644 --- a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj +++ b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj @@ -87,7 +87,6 @@ - diff --git a/src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs b/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs similarity index 96% rename from src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs rename to src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs index 6d96b8366d8..671f5f604d8 100644 --- a/src/ILCompiler.Compiler/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs +++ b/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs @@ -24,7 +24,7 @@ public ReadyToRunMultiFileCompilationModuleGroup(TypeSystemContext context, IEnu _compilationModuleSet.Add(context.GeneratedAssembly); } - public sealed override bool ContainsType(TypeDesc type)// + public sealed override bool ContainsType(TypeDesc type) { if (type is EcmaType ecmaType) { @@ -42,7 +42,7 @@ public sealed override bool ContainsTypeDictionary(TypeDesc type) return ContainsType(type); } - public sealed override bool ContainsMethodBody(MethodDesc method, bool unboxingStub)// + public sealed override bool ContainsMethodBody(MethodDesc method, bool unboxingStub) { if (method.HasInstantiation) return true; @@ -76,12 +76,12 @@ public override ExportForm GetExportMethodDictionaryForm(MethodDesc method) return ExportForm.None; } - private bool IsModuleInCompilationGroup(EcmaModule module)// + private bool IsModuleInCompilationGroup(EcmaModule module) { return _compilationModuleSet.Contains(module); } - public sealed override bool IsSingleFileCompilation// + public sealed override bool IsSingleFileCompilation { get { diff --git a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj index edef8b5e906..fd18571b020 100644 --- a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj +++ b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj @@ -51,6 +51,7 @@ + From 083f41238fb4070b9c01acd6e248850f771d3b1d Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Wed, 25 Jul 2018 14:12:13 -0700 Subject: [PATCH 3/3] Make readytorun compilation module group independent from multi-file --- ...yToRunSingleAssemblyCompilationModuleGroup.cs} | 15 ++------------- .../src/ILCompiler.ReadyToRun.csproj | 2 +- src/ILCompiler/src/Program.cs | 4 ++-- 3 files changed, 5 insertions(+), 16 deletions(-) rename src/ILCompiler.ReadyToRun/src/Compiler/{ReadyToRunMultiFileCompilationModuleGroup.cs => ReadyToRunSingleAssemblyCompilationModuleGroup.cs} (83%) diff --git a/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs b/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunSingleAssemblyCompilationModuleGroup.cs similarity index 83% rename from src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs rename to src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunSingleAssemblyCompilationModuleGroup.cs index 671f5f604d8..dc83eea83fd 100644 --- a/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs +++ b/src/ILCompiler.ReadyToRun/src/Compiler/ReadyToRunSingleAssemblyCompilationModuleGroup.cs @@ -12,11 +12,11 @@ namespace ILCompiler { - public abstract class ReadyToRunMultiFileCompilationModuleGroup : CompilationModuleGroup + public class ReadyToRunSingleAssemblyCompilationModuleGroup : CompilationModuleGroup { private HashSet _compilationModuleSet; - public ReadyToRunMultiFileCompilationModuleGroup(TypeSystemContext context, IEnumerable compilationModuleSet) + public ReadyToRunSingleAssemblyCompilationModuleGroup(TypeSystemContext context, IEnumerable compilationModuleSet) { _compilationModuleSet = new HashSet(compilationModuleSet); @@ -101,17 +101,6 @@ public override bool CanHaveReferenceThroughImportTable return false; } } - } - - /// - /// Represents a non-leaf multifile compilation group where types contained in the group are always fully expanded. - /// - public class ReadyToRunMultiFileSharedCompilationModuleGroup : ReadyToRunMultiFileCompilationModuleGroup - { - public ReadyToRunMultiFileSharedCompilationModuleGroup(TypeSystemContext context, IEnumerable compilationModuleSet) - : base(context, compilationModuleSet) - { - } public override bool ShouldProduceFullVTable(TypeDesc type) { diff --git a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj index fd18571b020..6e74f72539d 100644 --- a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj +++ b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj @@ -51,7 +51,7 @@ - + diff --git a/src/ILCompiler/src/Program.cs b/src/ILCompiler/src/Program.cs index 4d93e438c8b..9b31c8755b6 100644 --- a/src/ILCompiler/src/Program.cs +++ b/src/ILCompiler/src/Program.cs @@ -362,7 +362,7 @@ private int Run(string[] args) } } - if (_multiFile) + if (_multiFile || _isReadyToRunCodeGen) { List inputModules = new List(); @@ -380,7 +380,7 @@ private int Run(string[] args) if (_isReadyToRunCodeGen) { - compilationGroup = new ReadyToRunMultiFileSharedCompilationModuleGroup(typeSystemContext, inputModules); + compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup(typeSystemContext, inputModules); } else {