From 5746f0e79c6ab7217fccbfc769bd61f245a6860b Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Tue, 24 Jul 2018 10:24:58 -0700 Subject: [PATCH 1/5] 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 e19671dc153..95f20d32a36 100644 --- a/src/ILCompiler/src/Program.cs +++ b/src/ILCompiler/src/Program.cs @@ -376,7 +376,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 689a21ff240c7e29d90b5ec2f12fade73a543ba6 Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Tue, 24 Jul 2018 10:47:29 -0700 Subject: [PATCH 2/5] Move ReadyToRunMultiFileCompilationModuleGroup to ILCompiler.ReadyToRun project --- src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj | 1 - .../Compiler/ReadyToRunMultiFileCompilationModuleGroup.cs | 8 ++++---- .../src/ILCompiler.ReadyToRun.csproj | 3 +++ 3 files changed, 7 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 f6ab9cbe43b..89a53dd836b 100644 --- a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj +++ b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj @@ -62,6 +62,9 @@ + + + From ef10825904faaeb00a4069d412862e2571e119fb Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Wed, 25 Jul 2018 14:12:13 -0700 Subject: [PATCH 3/5] 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 89a53dd836b..b8a29e26684 100644 --- a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj +++ b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj @@ -64,7 +64,7 @@ - + diff --git a/src/ILCompiler/src/Program.cs b/src/ILCompiler/src/Program.cs index 95f20d32a36..f142742b01e 100644 --- a/src/ILCompiler/src/Program.cs +++ b/src/ILCompiler/src/Program.cs @@ -360,7 +360,7 @@ private int Run(string[] args) } } - if (_multiFile) + if (_multiFile || _isReadyToRunCodeGen) { List inputModules = new List(); @@ -378,7 +378,7 @@ private int Run(string[] args) if (_isReadyToRunCodeGen) { - compilationGroup = new ReadyToRunMultiFileSharedCompilationModuleGroup(typeSystemContext, inputModules); + compilationGroup = new ReadyToRunSingleAssemblyCompilationModuleGroup(typeSystemContext, inputModules); } else { From b6de7f7568d299944ee96a7ac8c53280cd38a352 Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Wed, 25 Jul 2018 17:02:46 -0700 Subject: [PATCH 4/5] Fix merge errors --- src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj index b8a29e26684..22862b0da4b 100644 --- a/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj +++ b/src/ILCompiler.ReadyToRun/src/ILCompiler.ReadyToRun.csproj @@ -62,8 +62,6 @@ - - From 8a3fed04204f7097516dad7af11e7026e4f7256a Mon Sep 17 00:00:00 2001 From: Amy Yu Date: Wed, 25 Jul 2018 17:23:57 -0700 Subject: [PATCH 5/5] Remove changes to MultiFileCompilationModuleGroup that were causing errors --- .../MultiFileCompilationModuleGroup.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/ILCompiler.Compiler/src/Compiler/MultiFileCompilationModuleGroup.cs b/src/ILCompiler.Compiler/src/Compiler/MultiFileCompilationModuleGroup.cs index 5e62ef34cea..d3ce3de8d3c 100644 --- a/src/ILCompiler.Compiler/src/Compiler/MultiFileCompilationModuleGroup.cs +++ b/src/ILCompiler.Compiler/src/Compiler/MultiFileCompilationModuleGroup.cs @@ -26,14 +26,16 @@ public MultiFileCompilationModuleGroup(TypeSystemContext context, IEnumerable @@ -125,7 +127,7 @@ public override bool ShouldPromoteToFullType(TypeDesc type) public override bool PresenceOfEETypeImpliesAllMethodsOnType(TypeDesc type) { - return (type.HasInstantiation || type.IsArray) && ShouldProduceFullVTable(type) && + return (type.HasInstantiation || type.IsArray) && ShouldProduceFullVTable(type) && type.ConvertToCanonForm(CanonicalFormKind.Specific).IsCanonicalSubtype(CanonicalFormKind.Any); } }