Skip to content

Commit 4c689bf

Browse files
committed
Switch AOT compilers to use AssemblyNameInfo
1 parent 0fb0188 commit 4c689bf

File tree

40 files changed

+188
-218
lines changed

40 files changed

+188
-218
lines changed

src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/MetadataReaderExtensions.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,10 @@ private static RuntimeAssemblyName CreateRuntimeAssemblyNameFromMetadata(
120120
ByteCollection publicKeyOrToken,
121121
global::Internal.Metadata.NativeFormat.AssemblyFlags assemblyFlags)
122122
{
123-
AssemblyNameFlags assemblyNameFlags = AssemblyNameFlags.None;
124-
if (0 != (assemblyFlags & global::Internal.Metadata.NativeFormat.AssemblyFlags.PublicKey))
125-
assemblyNameFlags |= AssemblyNameFlags.PublicKey;
126-
if (0 != (assemblyFlags & global::Internal.Metadata.NativeFormat.AssemblyFlags.Retargetable))
127-
assemblyNameFlags |= AssemblyNameFlags.Retargetable;
128-
int contentType = ((int)assemblyFlags) & 0x00000E00;
129-
assemblyNameFlags |= (AssemblyNameFlags)contentType;
123+
AssemblyNameFlags assemblyNameFlags = (AssemblyNameFlags)(assemblyFlags & (
124+
global::Internal.Metadata.NativeFormat.AssemblyFlags.PublicKey |
125+
global::Internal.Metadata.NativeFormat.AssemblyFlags.Retargetable |
126+
global::Internal.Metadata.NativeFormat.AssemblyFlags.ContentTypeMask));
130127

131128
ArrayBuilder<byte> keyOrTokenArrayBuilder = default;
132129
foreach (byte b in publicKeyOrToken)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace Internal.TypeSystem
5+
{
6+
// Dummy implementation of AssemlyNameInfo for runtime type system
7+
public abstract class AssemblyNameInfo
8+
{
9+
public abstract string FullName { get; }
10+
}
11+
}

src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@
255255
<Compile Include="Internal\Runtime\TypeLoader\TypeSystemContextFactory.cs" />
256256
<Compile Include="Internal\Runtime\TypeLoader\TypeSystemExtensions.cs" />
257257
<Compile Include="Internal\Runtime\TypeLoader\WellKnownTypeExtensions.cs" />
258+
<Compile Include="Internal\TypeSystem\AssemblyNameInfo.Dummy.cs" />
258259
<Compile Include="Internal\TypeSystem\ArrayMethod.Runtime.cs" />
259260
<Compile Include="Internal\TypeSystem\CanonTypes.Runtime.cs" />
260261
<Compile Include="Internal\TypeSystem\DefType.Runtime.cs" />

src/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public IReadOnlyDictionary<string, string> ReferenceFilePaths
9898
set;
9999
}
100100

101-
public override ModuleDesc ResolveAssembly(System.Reflection.AssemblyName name, bool throwIfNotFound)
101+
public override ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound)
102102
{
103103
// TODO: catch typesystem BadImageFormatException and throw a new one that also captures the
104104
// assembly name that caused the failure. (Along with the reason, which makes this rather annoying).

src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ protected virtual void ProcessXml(bool ignoreResource)
128128

129129
protected virtual AllowedAssemblies AllowedAssemblySelector { get => _owningModule != null ? AllowedAssemblies.ContainingAssembly : AllowedAssemblies.AnyAssembly; }
130130

131-
private bool ShouldProcessAllAssemblies(XPathNavigator nav, [NotNullWhen(false)] out AssemblyName? assemblyName)
131+
private bool ShouldProcessAllAssemblies(XPathNavigator nav, [NotNullWhen(false)] out AssemblyNameInfo? assemblyName)
132132
{
133133
assemblyName = null;
134134
if (GetFullName(nav) == AllAssembliesFullName)
@@ -147,7 +147,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav)
147147

148148
// Errors for invalid assembly names should show up even if this element will be
149149
// skipped due to feature conditions.
150-
bool processAllAssemblies = ShouldProcessAllAssemblies(assemblyNav, out AssemblyName? name);
150+
bool processAllAssemblies = ShouldProcessAllAssemblies(assemblyNav, out AssemblyNameInfo? name);
151151
if (processAllAssemblies && !_globalAttributeRemoval)
152152
{
153153
#if !READYTORUN
@@ -175,7 +175,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav)
175175
if (_owningModule.Assembly.GetName().Name != name!.Name)
176176
{
177177
#if !READYTORUN
178-
LogWarning(assemblyNav, DiagnosticId.AssemblyWithEmbeddedXmlApplyToAnotherAssembly, _owningModule.Assembly.GetName().Name ?? "", name.ToString());
178+
LogWarning(assemblyNav, DiagnosticId.AssemblyWithEmbeddedXmlApplyToAnotherAssembly, _owningModule.Assembly.GetName().Name, name.FullName);
179179
#endif
180180
continue;
181181
}
@@ -188,7 +188,7 @@ protected virtual void ProcessAssemblies(XPathNavigator nav)
188188
if (assembly == null)
189189
{
190190
#if !READYTORUN
191-
LogWarning(assemblyNav, DiagnosticId.XmlCouldNotResolveAssembly, name!.Name ?? "");
191+
LogWarning(assemblyNav, DiagnosticId.XmlCouldNotResolveAssembly, name!.Name);
192192
#endif
193193
continue;
194194
}
@@ -499,9 +499,9 @@ protected virtual void ProcessProperty(TypeDesc type, XPathNavigator nav, object
499499

500500
protected virtual void ProcessProperty(TypeDesc type, PropertyPseudoDesc property, XPathNavigator nav, object? customData, bool fromSignature) { }
501501

502-
protected virtual AssemblyName GetAssemblyName(XPathNavigator nav)
502+
protected virtual AssemblyNameInfo GetAssemblyName(XPathNavigator nav)
503503
{
504-
return new AssemblyName(GetFullName(nav));
504+
return AssemblyNameInfo.Parse(GetFullName(nav));
505505
}
506506

507507
protected static string GetFullName(XPathNavigator nav)

src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeFormatReaderCommonGen.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
namespace Internal.Metadata.NativeFormat
1616
{
17+
// Internal clone of System.Reflection.AssemblyFlags from System.Reflection.Metadata
1718
[Flags]
1819
#if SYSTEM_PRIVATE_CORELIB
1920
[CLSCompliant(false)]
@@ -26,13 +27,12 @@ public enum AssemblyFlags : uint
2627
/// The implementation of this assembly used at runtime is not expected to match the version seen at compile time.
2728
Retargetable = 0x100,
2829

29-
/// Reserved.
30-
DisableJITcompileOptimizer = 0x4000,
30+
/// Content type mask. Masked bits correspond to values of System.Reflection.AssemblyContentType
31+
ContentTypeMask = 0x00000e00,
3132

32-
/// Reserved.
33-
EnableJITcompileTracking = 0x8000,
3433
} // AssemblyFlags
3534

35+
// Internal clone of System.Reflection.AssemblyHashAlgorithm from System.Reflection.Metadata
3636
#if SYSTEM_PRIVATE_CORELIB
3737
[CLSCompliant(false)]
3838
#endif

src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
using System.Reflection;
4+
using System.Reflection.Metadata;
55

66
namespace Internal.TypeSystem
77
{
@@ -13,6 +13,6 @@ public interface IAssemblyDesc
1313
/// <summary>
1414
/// Gets the assembly name.
1515
/// </summary>
16-
AssemblyName GetName();
16+
AssemblyNameInfo GetName();
1717
}
1818
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4-
using System.Reflection;
4+
using System.Reflection.Metadata;
55

66
namespace Internal.TypeSystem
77
{
88
public interface IModuleResolver
99
{
10-
ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true);
10+
ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true);
1111
ModuleDesc ResolveModule(IAssemblyDesc referencingModule, string fileName, bool throwIfNotFound = true);
1212
}
1313
}

src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.Resolution.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Diagnostics;
7-
using System.Reflection;
7+
using System.Reflection.Metadata;
88

99
using Internal.NativeFormat;
1010

@@ -24,7 +24,7 @@ protected void InitializeSystemModule(ModuleDesc systemModule)
2424
SystemModule = systemModule;
2525
}
2626

27-
public virtual ModuleDesc ResolveAssembly(AssemblyName name, bool throwIfNotFound = true)
27+
public virtual ModuleDesc ResolveAssembly(AssemblyNameInfo name, bool throwIfNotFound = true)
2828
{
2929
if (throwIfNotFound)
3030
throw new NotSupportedException();

src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ private TypeDesc GetSimpleType(TypeName typeName)
109109
ModuleDesc module = _module;
110110
if (topLevelTypeName.AssemblyName != null)
111111
{
112-
module = _context.ResolveAssembly(typeName.AssemblyName.ToAssemblyName(), throwIfNotFound: _throwIfNotFound);
112+
module = _context.ResolveAssembly(typeName.AssemblyName, throwIfNotFound: _throwIfNotFound);
113113
if (module == null)
114114
return null;
115115
}

src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Internal.TypeSystem.Ecma
99
{
1010
public sealed partial class EcmaAssembly : EcmaModule, IAssemblyDesc
1111
{
12-
private AssemblyName _assemblyName;
12+
private AssemblyNameInfo _assemblyName;
1313
private AssemblyDefinition _assemblyDefinition;
1414

1515
public AssemblyDefinition AssemblyDefinition
@@ -39,20 +39,21 @@ public EcmaAssembly(TypeSystemContext context, PEReader peReader, MetadataReader
3939
_assemblyDefinition = metadataReader.GetAssemblyDefinition();
4040
}
4141

42-
// Returns cached copy of the name. Caller has to create a clone before mutating the name.
43-
public AssemblyName GetName()
42+
public AssemblyNameInfo GetName()
4443
{
4544
if (_assemblyName == null)
4645
{
4746
MetadataReader metadataReader = this.MetadataReader;
4847

49-
AssemblyName an = new AssemblyName();
50-
an.Name = metadataReader.GetString(_assemblyDefinition.Name);
51-
an.Version = _assemblyDefinition.Version;
52-
an.SetPublicKey(metadataReader.GetBlobBytes(_assemblyDefinition.PublicKey));
53-
54-
an.CultureName = metadataReader.GetString(_assemblyDefinition.Culture);
55-
an.ContentType = GetContentTypeFromAssemblyFlags(_assemblyDefinition.Flags);
48+
AssemblyNameInfo an = new AssemblyNameInfo
49+
(
50+
name: metadataReader.GetString(_assemblyDefinition.Name),
51+
version: _assemblyDefinition.Version,
52+
cultureName: metadataReader.GetString(_assemblyDefinition.Culture),
53+
flags: (AssemblyNameFlags)
54+
((_assemblyDefinition.Flags & AssemblyFlags.ContentTypeMask) | AssemblyFlags.PublicKey),
55+
publicKeyOrToken: metadataReader.GetBlobContent(_assemblyDefinition.PublicKey)
56+
);
5657

5758
_assemblyName = an;
5859
}

src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.Sorting.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5-
using System.Reflection;
5+
using System.Reflection.Metadata;
66

77
using Debug = System.Diagnostics.Debug;
88

@@ -20,8 +20,8 @@ public int CompareTo(EcmaModule other)
2020
if (thisAssembly != otherAssembly)
2121
{
2222
// Each module comes from a different assembly: compare the assemblies
23-
AssemblyName thisAssemblyName = thisAssembly.GetName();
24-
AssemblyName otherAssemblyName = otherAssembly.GetName();
23+
AssemblyNameInfo thisAssemblyName = thisAssembly.GetName();
24+
AssemblyNameInfo otherAssemblyName = otherAssembly.GetName();
2525

2626
int compare = StringComparer.Ordinal.Compare(thisAssemblyName.Name, otherAssemblyName.Name);
2727
if (compare != 0)

src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -615,22 +615,14 @@ private object ResolveAssemblyReference(AssemblyReferenceHandle handle)
615615
{
616616
AssemblyReference assemblyReference = _metadataReader.GetAssemblyReference(handle);
617617

618-
AssemblyName an = new AssemblyName();
619-
an.Name = _metadataReader.GetString(assemblyReference.Name);
620-
an.Version = assemblyReference.Version;
621-
622-
var publicKeyOrToken = _metadataReader.GetBlobBytes(assemblyReference.PublicKeyOrToken);
623-
if ((assemblyReference.Flags & AssemblyFlags.PublicKey) != 0)
624-
{
625-
an.SetPublicKey(publicKeyOrToken);
626-
}
627-
else
628-
{
629-
an.SetPublicKeyToken(publicKeyOrToken);
630-
}
631-
632-
an.CultureName = _metadataReader.GetString(assemblyReference.Culture);
633-
an.ContentType = GetContentTypeFromAssemblyFlags(assemblyReference.Flags);
618+
AssemblyNameInfo an = new AssemblyNameInfo
619+
(
620+
name: _metadataReader.GetString(assemblyReference.Name),
621+
version: assemblyReference.Version,
622+
cultureName: _metadataReader.GetString(assemblyReference.Culture),
623+
flags: (AssemblyNameFlags)assemblyReference.Flags,
624+
publicKeyOrToken: _metadataReader.GetBlobContent(assemblyReference.PublicKeyOrToken)
625+
);
634626

635627
var assembly = _moduleResolver.ResolveAssembly(an, throwIfNotFound: false);
636628
if (assembly == null)
@@ -687,11 +679,6 @@ public sealed override MetadataType GetGlobalModuleType()
687679
return (MetadataType)GetType(MetadataTokens.EntityHandle(0x02000001 /* COR_GLOBAL_PARENT_TOKEN */));
688680
}
689681

690-
protected static AssemblyContentType GetContentTypeFromAssemblyFlags(AssemblyFlags flags)
691-
{
692-
return (AssemblyContentType)(((int)flags & 0x0E00) >> 9);
693-
}
694-
695682
public string GetUserString(UserStringHandle userStringHandle)
696683
{
697684
// String literals are not cached

src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Reflection.Metadata;
1010
using System.Reflection.Metadata.Ecma335;
1111
using System.Reflection.PortableExecutable;
12+
using System.Runtime.InteropServices;
1213

1314
namespace Internal.TypeSystem
1415
{
@@ -28,7 +29,7 @@ internal class TypeSystemMetadataEmitter
2829
private BlobHandle _noArgsVoidReturnStaticMethodSigHandle;
2930
protected TypeSystemContext _typeSystemContext;
3031

31-
public TypeSystemMetadataEmitter(AssemblyName assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null)
32+
public TypeSystemMetadataEmitter(AssemblyNameInfo assemblyName, TypeSystemContext context, AssemblyFlags flags = default(AssemblyFlags), byte[] publicKeyArray = null)
3233
{
3334
_typeSystemContext = context;
3435
_metadataBuilder = new MetadataBuilder();
@@ -118,26 +119,26 @@ public byte[] EmitToMetadataBlob()
118119
return metadataBlobBuilder.ToArray();
119120
}
120121

121-
public AssemblyReferenceHandle GetAssemblyRef(AssemblyName name)
122+
public AssemblyReferenceHandle GetAssemblyRef(AssemblyNameInfo name)
122123
{
123124
if (!_assemblyRefNameHandles.TryGetValue(name.FullName, out var handle))
124125
{
125126
StringHandle assemblyName = _metadataBuilder.GetOrAddString(name.Name);
126127
StringHandle cultureName = (name.CultureName != null) ? _metadataBuilder.GetOrAddString(name.CultureName) : default(StringHandle);
127-
BlobHandle publicTokenBlob = name.GetPublicKeyToken() != null ? _metadataBuilder.GetOrAddBlob(name.GetPublicKeyToken()) : default(BlobHandle);
128-
AssemblyFlags flags = default(AssemblyFlags);
129-
if (name.Flags.HasFlag(AssemblyNameFlags.Retargetable))
130-
{
131-
flags |= AssemblyFlags.Retargetable;
132-
}
133-
if (name.ContentType == AssemblyContentType.WindowsRuntime)
128+
129+
ImmutableArray<byte> publicKeyOrToken = name.PublicKeyOrToken;
130+
if ((name.Flags & AssemblyNameFlags.PublicKey) != 0)
134131
{
135-
flags |= AssemblyFlags.WindowsRuntime;
132+
// Use AssemblyName to convert PublicKey to PublicKeyToken to avoid calling crypto APIs directly
133+
AssemblyName an = new();
134+
an.SetPublicKey(ImmutableCollectionsMarshal.AsArray<byte>(publicKeyOrToken));
135+
publicKeyOrToken = ImmutableCollectionsMarshal.AsImmutableArray<byte>(an.GetPublicKeyToken());
136136
}
137+
BlobHandle publicTokenBlob = publicKeyOrToken.IsDefault ? default : _metadataBuilder.GetOrAddBlob(publicKeyOrToken);
138+
139+
AssemblyFlags flags = (AssemblyFlags)name.Flags & (AssemblyFlags.Retargetable | AssemblyFlags.ContentTypeMask);
137140

138-
Version version = name.Version;
139-
if (version == null)
140-
version = new Version(0, 0);
141+
Version version = name.Version ?? new Version(0, 0);
141142

142143
handle = _metadataBuilder.AddAssemblyReference(assemblyName, version, cultureName, publicTokenBlob, flags, default(BlobHandle));
143144

@@ -152,7 +153,7 @@ public AssemblyReferenceHandle GetAssemblyRef(IAssemblyDesc assemblyDesc)
152153
{
153154
return handle;
154155
}
155-
AssemblyName name = assemblyDesc.GetName();
156+
AssemblyNameInfo name = assemblyDesc.GetName();
156157
var referenceHandle = GetAssemblyRef(name);
157158
_assemblyRefs.Add(assemblyDesc, referenceHandle);
158159
return referenceHandle;

0 commit comments

Comments
 (0)