From 1ace04d92a0d99cd2b0dcc5980537619586b7444 Mon Sep 17 00:00:00 2001 From: Anubhav Srivastava Date: Tue, 10 Dec 2019 16:46:26 -0800 Subject: [PATCH 1/5] Miscellaneous performance fixes. Create comparison functions for Enum (Enum.CompareTo boxes since it takes an Object). In ModuleToken, use the existing MetadataReader instead of making a new one each time. Use Dictionary instead of ImmutableDictionary in CoreRTNameMangler to reduce allocations. In CopiedFieldRvaNode, only read as much of the section as we need to copy. --- .../Common/Compiler/CoreRTNameMangler.cs | 76 ++++++++++--------- .../src/tools/Common/System/EnumExtensions.cs | 37 +++++++++ .../ReadyToRun/CopiedFieldRvaNode.cs | 13 ++-- .../ReadyToRun/FieldFixupSignature.cs | 2 +- .../ReadyToRun/GenericLookupSignature.cs | 4 +- .../ReadyToRun/ImportThunk.cs | 6 +- .../ReadyToRun/MethodFixupSignature.cs | 2 +- .../ReadyToRun/ModuleToken.cs | 4 +- .../ReadyToRun/TypeFixupSignature.cs | 2 +- .../ILCompiler.ReadyToRun.csproj | 1 + 10 files changed, 98 insertions(+), 49 deletions(-) create mode 100644 src/coreclr/src/tools/Common/System/EnumExtensions.cs diff --git a/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs b/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs index fe5b722d72346..47bb7198a657d 100644 --- a/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs +++ b/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Security.Cryptography; using System.Text; @@ -144,7 +143,7 @@ private string SanitizeNameWithHash(string literal) /// /// Dictionary given a mangled name for a given /// - private ImmutableDictionary _mangledTypeNames = ImmutableDictionary.Empty; + private Dictionary _mangledTypeNames = new Dictionary(); /// /// Given a set of names check if @@ -166,11 +165,14 @@ private string DisambiguateName(string origName, ISet set) public override string GetMangledTypeName(TypeDesc type) { - string mangledName; - if (_mangledTypeNames.TryGetValue(type, out mangledName)) - return mangledName; + lock (this) + { + string mangledName; + if (_mangledTypeNames.TryGetValue(type, out mangledName)) + return mangledName; - return ComputeMangledTypeName(type); + return ComputeMangledTypeName(type); + } } private string EnterNameScopeSequence => _mangleForCplusPlus ? "_A_" : "<"; @@ -273,12 +275,11 @@ private string ComputeMangledTypeName(TypeDesc type) // Ensure that name is unique and update our tables accordingly. name = DisambiguateName(name, deduplicator); deduplicator.Add(name); - _mangledTypeNames = _mangledTypeNames.Add(t, name); + _mangledTypeNames.Add(t, name); } } + return _mangledTypeNames[type]; } - - return _mangledTypeNames[type]; } string mangledName; @@ -351,14 +352,14 @@ private string ComputeMangledTypeName(TypeDesc type) { // Ensure that name is unique and update our tables accordingly. if (!_mangledTypeNames.ContainsKey(type)) - _mangledTypeNames = _mangledTypeNames.Add(type, mangledName); + _mangledTypeNames.Add(type, mangledName); } return mangledName; } - private ImmutableDictionary _mangledMethodNames = ImmutableDictionary.Empty; - private ImmutableDictionary _unqualifiedMangledMethodNames = ImmutableDictionary.Empty; + private Dictionary _mangledMethodNames = new Dictionary(); + private Dictionary _unqualifiedMangledMethodNames = new Dictionary(); public override Utf8String GetMangledMethodName(MethodDesc method) { @@ -381,7 +382,7 @@ public override Utf8String GetMangledMethodName(MethodDesc method) lock (this) { if (!_mangledMethodNames.ContainsKey(method)) - _mangledMethodNames = _mangledMethodNames.Add(method, utf8MangledName); + _mangledMethodNames.Add(method, utf8MangledName); } return utf8MangledName; @@ -390,11 +391,14 @@ public override Utf8String GetMangledMethodName(MethodDesc method) private Utf8String GetUnqualifiedMangledMethodName(MethodDesc method) { - Utf8String mangledName; - if (_unqualifiedMangledMethodNames.TryGetValue(method, out mangledName)) - return mangledName; + lock (this) + { + Utf8String mangledName; + if (_unqualifiedMangledMethodNames.TryGetValue(method, out mangledName)) + return mangledName; - return ComputeUnqualifiedMangledMethodName(method); + return ComputeUnqualifiedMangledMethodName(method); + } } private Utf8String GetPrefixMangledTypeName(IPrefixMangledType prefixMangledType) @@ -481,12 +485,11 @@ private Utf8String ComputeUnqualifiedMangledMethodName(MethodDesc method) name = DisambiguateName(name, deduplicator); deduplicator.Add(name); - _unqualifiedMangledMethodNames = _unqualifiedMangledMethodNames.Add(m, name); + _unqualifiedMangledMethodNames.Add(m, name); } } + return _unqualifiedMangledMethodNames[method]; } - - return _unqualifiedMangledMethodNames[method]; } Utf8String utf8MangledName; @@ -550,22 +553,25 @@ private Utf8String ComputeUnqualifiedMangledMethodName(MethodDesc method) lock (this) { if (!_unqualifiedMangledMethodNames.ContainsKey(method)) - _unqualifiedMangledMethodNames = _unqualifiedMangledMethodNames.Add(method, utf8MangledName); + _unqualifiedMangledMethodNames.Add(method, utf8MangledName); } } return utf8MangledName; } - private ImmutableDictionary _mangledFieldNames = ImmutableDictionary.Empty; + private Dictionary _mangledFieldNames = new Dictionary(); public override Utf8String GetMangledFieldName(FieldDesc field) { - Utf8String mangledName; - if (_mangledFieldNames.TryGetValue(field, out mangledName)) - return mangledName; + lock (this) + { + Utf8String mangledName; + if (_mangledFieldNames.TryGetValue(field, out mangledName)) + return mangledName; - return ComputeMangledFieldName(field); + return ComputeMangledFieldName(field); + } } private Utf8String ComputeMangledFieldName(FieldDesc field) @@ -594,12 +600,11 @@ private Utf8String ComputeMangledFieldName(FieldDesc field) if (prependTypeName != null) name = prependTypeName + "__" + name; - _mangledFieldNames = _mangledFieldNames.Add(f, name); + _mangledFieldNames.Add(f, name); } } + return _mangledFieldNames[field]; } - - return _mangledFieldNames[field]; } @@ -613,26 +618,29 @@ private Utf8String ComputeMangledFieldName(FieldDesc field) lock (this) { if (!_mangledFieldNames.ContainsKey(field)) - _mangledFieldNames = _mangledFieldNames.Add(field, utf8MangledName); + _mangledFieldNames.Add(field, utf8MangledName); } return utf8MangledName; } - private ImmutableDictionary _mangledStringLiterals = ImmutableDictionary.Empty; + private Dictionary _mangledStringLiterals = new Dictionary(); public override string GetMangledStringName(string literal) { string mangledName; - if (_mangledStringLiterals.TryGetValue(literal, out mangledName)) - return mangledName; + lock (this) + { + if (_mangledStringLiterals.TryGetValue(literal, out mangledName)) + return mangledName; + } mangledName = SanitizeNameWithHash(literal); lock (this) { if (!_mangledStringLiterals.ContainsKey(literal)) - _mangledStringLiterals = _mangledStringLiterals.Add(literal, mangledName); + _mangledStringLiterals.Add(literal, mangledName); } return mangledName; diff --git a/src/coreclr/src/tools/Common/System/EnumExtensions.cs b/src/coreclr/src/tools/Common/System/EnumExtensions.cs new file mode 100644 index 0000000000000..1f869b2c5ed79 --- /dev/null +++ b/src/coreclr/src/tools/Common/System/EnumExtensions.cs @@ -0,0 +1,37 @@ +// 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 ILCompiler.DependencyAnalysis.ReadyToRun; +using Internal.JitInterface; +using Internal.ReadyToRunConstants; + +namespace System +{ + /// + /// Enum.CompareTo takes an Object, so using that requires boxing the enum we are comparing to (which is slow + /// and allocates unnecessarily). + /// + internal static class EnumExtensions + { + public static int CompareEnum(this ReadyToRunFixupKind first, ReadyToRunFixupKind second) + { + return (int)first - (int)second; + } + + public static int CompareEnum(this ImportThunk.Kind first, ImportThunk.Kind second) + { + return (int)first - (int)second; + } + + public static int CompareEnum(this mdToken first, mdToken second) + { + return (int)first - (int)second; + } + + public static int CompareEnum(this CORINFO_RUNTIME_LOOKUP_KIND first, CORINFO_RUNTIME_LOOKUP_KIND second) + { + return (int)first - (int)second; + } + } +} diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs index cd4b3e7832da6..e74dd10491665 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs @@ -6,6 +6,7 @@ using System.Collections.Immutable; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; +using System.Reflection.PortableExecutable; using Internal.Text; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; @@ -61,8 +62,6 @@ private unsafe byte[] GetRvaData(int targetPointerSize) BlobReader metadataBlob = new BlobReader(_module.PEReader.GetMetadata().Pointer, _module.PEReader.GetMetadata().Length); metadataBlob.Offset = metadataReader.GetTableMetadataOffset(TableIndex.FieldRva); - ImmutableArray memBlock = _module.PEReader.GetSectionData(_rva).GetContent(); - for (int i = 1; i <= metadataReader.GetTableRowCount(TableIndex.FieldRva); i++) { int currentFieldRva = metadataBlob.ReadInt32(); @@ -76,18 +75,20 @@ private unsafe byte[] GetRvaData(int targetPointerSize) int currentSize = field.FieldType.GetElementSize().AsInt; if (currentSize > size) { - if (currentSize > memBlock.Length) - throw new BadImageFormatException(); - // We need to handle overlapping fields by reusing blobs based on the rva, and just update // the size and contents size = currentSize; result = new byte[AlignmentHelper.AlignUp(size, targetPointerSize)]; - memBlock.CopyTo(0, result, 0, size); } } Debug.Assert(size > 0); + + PEMemoryBlock block = _module.PEReader.GetSectionData(_rva); + if (block.Length < size) + throw new BadImageFormatException(); + + block.GetContent(0, size).CopyTo(result); return result; } diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs index 1b1d931e05eba..a4c26311e85dd 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs @@ -56,7 +56,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { FieldFixupSignature otherNode = (FieldFixupSignature)other; - int result = _fixupKind.CompareTo(otherNode._fixupKind); + int result = _fixupKind.CompareEnum(otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs index f23f9b4107d34..376ad170ff9e9 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs @@ -172,11 +172,11 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { GenericLookupSignature otherNode = (GenericLookupSignature)other; - int result = _runtimeLookupKind.CompareTo(otherNode._runtimeLookupKind); + int result = _runtimeLookupKind.CompareEnum(otherNode._runtimeLookupKind); if (result != 0) return result; - result = _fixupKind.CompareTo(otherNode._fixupKind); + result = _fixupKind.CompareEnum(otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs index d037cac18a45b..47a8361bc0424 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs @@ -2,6 +2,8 @@ // 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 Internal.Text; using Internal.ReadyToRunConstants; @@ -13,7 +15,7 @@ namespace ILCompiler.DependencyAnalysis.ReadyToRun /// public partial class ImportThunk : AssemblyStubNode, ISymbolDefinitionNode { - enum Kind + public enum Kind { Eager, Lazy, @@ -74,7 +76,7 @@ protected override string GetName(NodeFactory factory) public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { ImportThunk otherNode = (ImportThunk)other; - int result = _thunkKind.CompareTo(otherNode._thunkKind); + int result = _thunkKind.CompareEnum(otherNode._thunkKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs index a4c9105c19fb4..a34cb909a0315 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs @@ -131,7 +131,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { MethodFixupSignature otherNode = (MethodFixupSignature)other; - int result = _fixupKind.CompareTo(otherNode._fixupKind); + int result = _fixupKind.CompareEnum(otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs index 3e86bfbbc0ad2..951dc62a83a20 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs @@ -67,7 +67,7 @@ public bool Equals(ModuleToken moduleToken) public int CompareTo(ModuleToken other) { - int result = Token.CompareTo(other.Token); + int result = Token.CompareEnum(other.Token); if (result != 0) return result; @@ -79,7 +79,7 @@ public SignatureContext SignatureContext(ModuleTokenResolver resolver) return new SignatureContext(Module, resolver); } - public MetadataReader MetadataReader => Module.PEReader.GetMetadataReader(); + public MetadataReader MetadataReader => Module.MetadataReader; public CorTokenType TokenType => SignatureBuilder.TypeFromToken(Token); diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs index 90366c1ba163d..cdc17fd5d099b 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs @@ -55,7 +55,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { TypeFixupSignature otherNode = (TypeFixupSignature)other; - int result = _fixupKind.CompareTo(otherNode._fixupKind); + int result = _fixupKind.CompareEnum(otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj index 886f80a59e265..49eddde63cab5 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj @@ -36,6 +36,7 @@ + From 40f6522ef107c94f78278296b2d71b947172abdd Mon Sep 17 00:00:00 2001 From: Anubhav Srivastava Date: Tue, 10 Dec 2019 18:25:27 -0800 Subject: [PATCH 2/5] Fix indentation. --- src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs b/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs index 47bb7198a657d..b479912f34000 100644 --- a/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs +++ b/src/coreclr/src/tools/Common/Compiler/CoreRTNameMangler.cs @@ -640,7 +640,7 @@ public override string GetMangledStringName(string literal) lock (this) { if (!_mangledStringLiterals.ContainsKey(literal)) - _mangledStringLiterals.Add(literal, mangledName); + _mangledStringLiterals.Add(literal, mangledName); } return mangledName; From 964ec9d36342ecd15b81363c761ac9809937e864 Mon Sep 17 00:00:00 2001 From: Anubhav Srivastava Date: Wed, 11 Dec 2019 11:05:45 -0800 Subject: [PATCH 3/5] Address some PR comments. Remove EnumExtensions in favor of casting to int and using CompareTo. Move array allocation out of loop in CopiedFieldRvaNode. --- .../DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs | 3 +-- .../DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs | 2 +- .../DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs | 4 ++-- .../Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs | 6 ++---- .../DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs | 2 +- .../Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs | 2 +- .../DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs | 2 +- .../ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj | 1 - 8 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs index e74dd10491665..25448fc1c8463 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/CopiedFieldRvaNode.cs @@ -56,7 +56,6 @@ public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) private unsafe byte[] GetRvaData(int targetPointerSize) { int size = 0; - byte[] result = Array.Empty(); MetadataReader metadataReader = _module.MetadataReader; BlobReader metadataBlob = new BlobReader(_module.PEReader.GetMetadata().Pointer, _module.PEReader.GetMetadata().Length); @@ -78,7 +77,6 @@ private unsafe byte[] GetRvaData(int targetPointerSize) // We need to handle overlapping fields by reusing blobs based on the rva, and just update // the size and contents size = currentSize; - result = new byte[AlignmentHelper.AlignUp(size, targetPointerSize)]; } } @@ -88,6 +86,7 @@ private unsafe byte[] GetRvaData(int targetPointerSize) if (block.Length < size) throw new BadImageFormatException(); + byte[] result = new byte[AlignmentHelper.AlignUp(size, targetPointerSize)]; block.GetContent(0, size).CopyTo(result); return result; } diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs index a4c26311e85dd..f7b5c5ae0794d 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/FieldFixupSignature.cs @@ -56,7 +56,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { FieldFixupSignature otherNode = (FieldFixupSignature)other; - int result = _fixupKind.CompareEnum(otherNode._fixupKind); + int result = ((int)_fixupKind).CompareTo((int)otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs index 376ad170ff9e9..b1f85a812afc9 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/GenericLookupSignature.cs @@ -172,11 +172,11 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { GenericLookupSignature otherNode = (GenericLookupSignature)other; - int result = _runtimeLookupKind.CompareEnum(otherNode._runtimeLookupKind); + int result = ((int)_runtimeLookupKind).CompareTo((int)otherNode._runtimeLookupKind); if (result != 0) return result; - result = _fixupKind.CompareEnum(otherNode._fixupKind); + result = ((int)_fixupKind).CompareTo((int)otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs index 47a8361bc0424..88b3ec66394d0 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ImportThunk.cs @@ -2,8 +2,6 @@ // 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 Internal.Text; using Internal.ReadyToRunConstants; @@ -15,7 +13,7 @@ namespace ILCompiler.DependencyAnalysis.ReadyToRun /// public partial class ImportThunk : AssemblyStubNode, ISymbolDefinitionNode { - public enum Kind + enum Kind { Eager, Lazy, @@ -76,7 +74,7 @@ protected override string GetName(NodeFactory factory) public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { ImportThunk otherNode = (ImportThunk)other; - int result = _thunkKind.CompareEnum(otherNode._thunkKind); + int result = ((int)_thunkKind).CompareTo((int)otherNode._thunkKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs index a34cb909a0315..d614d91d2cc2b 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodFixupSignature.cs @@ -131,7 +131,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { MethodFixupSignature otherNode = (MethodFixupSignature)other; - int result = _fixupKind.CompareEnum(otherNode._fixupKind); + int result = ((int)_fixupKind).CompareTo((int)otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs index 951dc62a83a20..d6d7f968b1db1 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs @@ -67,7 +67,7 @@ public bool Equals(ModuleToken moduleToken) public int CompareTo(ModuleToken other) { - int result = Token.CompareEnum(other.Token); + int result = ((int)Token).CompareTo((int)Token); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs index cdc17fd5d099b..f9fc54a5412f6 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TypeFixupSignature.cs @@ -55,7 +55,7 @@ public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilde public override int CompareToImpl(ISortableNode other, CompilerComparer comparer) { TypeFixupSignature otherNode = (TypeFixupSignature)other; - int result = _fixupKind.CompareEnum(otherNode._fixupKind); + int result = ((int)_fixupKind).CompareTo((int)otherNode._fixupKind); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj index 49eddde63cab5..886f80a59e265 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj @@ -36,7 +36,6 @@ - From be9864fd152d49cbf84fa2106756a4a2f7c84b8f Mon Sep 17 00:00:00 2001 From: Anubhav Srivastava Date: Wed, 11 Dec 2019 16:54:31 -0800 Subject: [PATCH 4/5] Remove EnumExtensions file. --- .../src/tools/Common/System/EnumExtensions.cs | 37 ------------------- 1 file changed, 37 deletions(-) delete mode 100644 src/coreclr/src/tools/Common/System/EnumExtensions.cs diff --git a/src/coreclr/src/tools/Common/System/EnumExtensions.cs b/src/coreclr/src/tools/Common/System/EnumExtensions.cs deleted file mode 100644 index 1f869b2c5ed79..0000000000000 --- a/src/coreclr/src/tools/Common/System/EnumExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -// 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 ILCompiler.DependencyAnalysis.ReadyToRun; -using Internal.JitInterface; -using Internal.ReadyToRunConstants; - -namespace System -{ - /// - /// Enum.CompareTo takes an Object, so using that requires boxing the enum we are comparing to (which is slow - /// and allocates unnecessarily). - /// - internal static class EnumExtensions - { - public static int CompareEnum(this ReadyToRunFixupKind first, ReadyToRunFixupKind second) - { - return (int)first - (int)second; - } - - public static int CompareEnum(this ImportThunk.Kind first, ImportThunk.Kind second) - { - return (int)first - (int)second; - } - - public static int CompareEnum(this mdToken first, mdToken second) - { - return (int)first - (int)second; - } - - public static int CompareEnum(this CORINFO_RUNTIME_LOOKUP_KIND first, CORINFO_RUNTIME_LOOKUP_KIND second) - { - return (int)first - (int)second; - } - } -} From f62bc4a59f875edddba78b13d1686878adba13b7 Mon Sep 17 00:00:00 2001 From: Anubhav Srivastava Date: Thu, 12 Dec 2019 11:40:13 -0800 Subject: [PATCH 5/5] Fix determinism issue. Fix map file flag passing. --- src/coreclr/src/tools/ReadyToRun.SuperIlc/BuildOptions.cs | 2 +- .../src/tools/ReadyToRun.SuperIlc/CommandLineOptions.cs | 6 +++--- src/coreclr/src/tools/ReadyToRun.SuperIlc/CpaotRunner.cs | 2 +- .../Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs | 2 +- .../src/tools/crossgen2/crossgen2/CommandLineOptions.cs | 2 +- src/coreclr/src/tools/crossgen2/crossgen2/Program.cs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/coreclr/src/tools/ReadyToRun.SuperIlc/BuildOptions.cs b/src/coreclr/src/tools/ReadyToRun.SuperIlc/BuildOptions.cs index c2b256654d42a..0bb6f959dc3a4 100644 --- a/src/coreclr/src/tools/ReadyToRun.SuperIlc/BuildOptions.cs +++ b/src/coreclr/src/tools/ReadyToRun.SuperIlc/BuildOptions.cs @@ -21,7 +21,7 @@ public class BuildOptions public bool NoExe { get; set; } public bool NoEtw { get; set; } public bool NoCleanup { get; set; } - public bool GenerateMapFile { get; set; } + public bool Map { get; set; } public FileInfo PackageList { get; set; } public int DegreeOfParallelism { get; set; } public bool Sequential { get; set; } diff --git a/src/coreclr/src/tools/ReadyToRun.SuperIlc/CommandLineOptions.cs b/src/coreclr/src/tools/ReadyToRun.SuperIlc/CommandLineOptions.cs index 99171fa23cc11..dc90efc2ac102 100644 --- a/src/coreclr/src/tools/ReadyToRun.SuperIlc/CommandLineOptions.cs +++ b/src/coreclr/src/tools/ReadyToRun.SuperIlc/CommandLineOptions.cs @@ -38,7 +38,7 @@ Command CompileFolder() => NoExe(), NoEtw(), NoCleanup(), - GenerateMapFile(), + Map(), DegreeOfParallelism(), Sequential(), Framework(), @@ -71,7 +71,7 @@ Command CompileSubtree() => NoExe(), NoEtw(), NoCleanup(), - GenerateMapFile(), + Map(), DegreeOfParallelism(), Sequential(), Framework(), @@ -181,7 +181,7 @@ Option NoEtw() => Option NoCleanup() => new Option(new[] { "--nocleanup" }, "Don't clean up compilation artifacts after test runs", new Argument()); - Option GenerateMapFile() => + Option Map() => new Option(new[] { "--map" }, "Generate a map file (Crossgen2)", new Argument()); Option DegreeOfParallelism() => diff --git a/src/coreclr/src/tools/ReadyToRun.SuperIlc/CpaotRunner.cs b/src/coreclr/src/tools/ReadyToRun.SuperIlc/CpaotRunner.cs index 7f14e4a3e20cd..b65dd628a7f65 100644 --- a/src/coreclr/src/tools/ReadyToRun.SuperIlc/CpaotRunner.cs +++ b/src/coreclr/src/tools/ReadyToRun.SuperIlc/CpaotRunner.cs @@ -49,7 +49,7 @@ protected override IEnumerable BuildCommandLineArguments(string assembly // Todo: Allow control of some of these yield return "--targetarch=x64"; - if (_options.GenerateMapFile) + if (_options.Map) { yield return "--map"; } diff --git a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs index d6d7f968b1db1..af2ea0b022c2a 100644 --- a/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs +++ b/src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ModuleToken.cs @@ -67,7 +67,7 @@ public bool Equals(ModuleToken moduleToken) public int CompareTo(ModuleToken other) { - int result = ((int)Token).CompareTo((int)Token); + int result = ((int)Token).CompareTo((int)other.Token); if (result != 0) return result; diff --git a/src/coreclr/src/tools/crossgen2/crossgen2/CommandLineOptions.cs b/src/coreclr/src/tools/crossgen2/crossgen2/CommandLineOptions.cs index 2d63bdd11b0d7..d82deef4dd682 100644 --- a/src/coreclr/src/tools/crossgen2/crossgen2/CommandLineOptions.cs +++ b/src/coreclr/src/tools/crossgen2/crossgen2/CommandLineOptions.cs @@ -31,7 +31,7 @@ public class CommandLineOptions public bool Tuning { get; set; } public bool Partial { get; set; } public bool Resilient { get; set; } - public bool GenerateMapFile { get; set; } + public bool Map { get; set; } public int Parallelism { get; set; } diff --git a/src/coreclr/src/tools/crossgen2/crossgen2/Program.cs b/src/coreclr/src/tools/crossgen2/crossgen2/Program.cs index cf6c622478f9c..b7b1cfc251536 100644 --- a/src/coreclr/src/tools/crossgen2/crossgen2/Program.cs +++ b/src/coreclr/src/tools/crossgen2/crossgen2/Program.cs @@ -323,7 +323,7 @@ private int Run() builder .UseIbcTuning(_commandLineOptions.Tuning) .UseResilience(_commandLineOptions.Resilient) - .UseMapFile(_commandLineOptions.GenerateMapFile) + .UseMapFile(_commandLineOptions.Map) .UseParallelism(_commandLineOptions.Parallelism) .UseILProvider(ilProvider) .UseJitPath(_commandLineOptions.JitPath)