Skip to content

Commit a303a07

Browse files
github-actions[bot]MichalStrehovskycarlossanlop
authored
[release/8.0] Revert "Emit less metadata for not-reflection-visible types (#91660)" (#91989)
* Revert "Emit less metadata for not-reflection-visible types (#91660)" This reverts commit 0bfc0c9. * Regression test --------- Co-authored-by: Michal Strehovský <MichalStrehovsky@users.noreply.github.com> Co-authored-by: Carlos Sánchez López <1175054+carlossanlop@users.noreply.github.com>
1 parent f490d66 commit a303a07

File tree

8 files changed

+63
-100
lines changed

8 files changed

+63
-100
lines changed

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,7 @@ protected override DependencyList ComputeNonRelocationBasedDependencies(NodeFact
625625

626626
// Ask the metadata manager
627627
// if we have any dependencies due to presence of the EEType.
628-
bool isFullType = factory.MaximallyConstructableType(_type) == this;
629-
factory.MetadataManager.GetDependenciesDueToEETypePresence(ref dependencies, factory, _type, isFullType);
628+
factory.MetadataManager.GetDependenciesDueToEETypePresence(ref dependencies, factory, _type);
630629

631630
if (_type is MetadataType mdType)
632631
ModuleUseBasedDependencyAlgorithm.AddDependenciesDueToModuleUse(ref dependencies, factory, mdType.Module);

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericDefinitionEETypeNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ protected override DependencyList ComputeNonRelocationBasedDependencies(NodeFact
2525
DependencyList dependencyList = null;
2626

2727
// Ask the metadata manager if we have any dependencies due to the presence of the EEType.
28-
factory.MetadataManager.GetDependenciesDueToEETypePresence(ref dependencyList, factory, _type, isFullType: true);
28+
factory.MetadataManager.GetDependenciesDueToEETypePresence(ref dependencyList, factory, _type);
2929

3030
return dependencyList;
3131
}

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -458,12 +458,7 @@ private void CreateNodeCaches()
458458

459459
_typesWithMetadata = new NodeCache<MetadataType, TypeMetadataNode>(type =>
460460
{
461-
return new TypeMetadataNode(type, includeCustomAttributes: true);
462-
});
463-
464-
_typesWithMetadataWithoutCustomAttributes = new NodeCache<MetadataType, TypeMetadataNode>(type =>
465-
{
466-
return new TypeMetadataNode(type, includeCustomAttributes: false);
461+
return new TypeMetadataNode(type);
467462
});
468463

469464
_methodsWithMetadata = new NodeCache<MethodDesc, MethodMetadataNode>(method =>
@@ -1161,16 +1156,6 @@ internal TypeMetadataNode TypeMetadata(MetadataType type)
11611156
return _typesWithMetadata.GetOrAdd(type);
11621157
}
11631158

1164-
private NodeCache<MetadataType, TypeMetadataNode> _typesWithMetadataWithoutCustomAttributes;
1165-
1166-
internal TypeMetadataNode TypeMetadataWithoutCustomAttributes(MetadataType type)
1167-
{
1168-
// These are only meaningful for UsageBasedMetadataManager. We should not have them
1169-
// in the dependency graph otherwise.
1170-
Debug.Assert(MetadataManager is UsageBasedMetadataManager);
1171-
return _typesWithMetadataWithoutCustomAttributes.GetOrAdd(type);
1172-
}
1173-
11741159
private NodeCache<MethodDesc, MethodMetadataNode> _methodsWithMetadata;
11751160

11761161
internal MethodMetadataNode MethodMetadata(MethodDesc method)

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/TypeMetadataNode.cs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ namespace ILCompiler.DependencyAnalysis
2424
internal sealed class TypeMetadataNode : DependencyNodeCore<NodeFactory>
2525
{
2626
private readonly MetadataType _type;
27-
private readonly bool _includeCustomAttributes;
2827

29-
public TypeMetadataNode(MetadataType type, bool includeCustomAttributes)
28+
public TypeMetadataNode(MetadataType type)
3029
{
3130
Debug.Assert(type.IsTypeDefinition);
3231
_type = type;
33-
_includeCustomAttributes = includeCustomAttributes;
3432
}
3533

3634
public MetadataType Type => _type;
@@ -39,21 +37,13 @@ public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFacto
3937
{
4038
DependencyList dependencies = new DependencyList();
4139

42-
if (_includeCustomAttributes)
43-
CustomAttributeBasedDependencyAlgorithm.AddDependenciesDueToCustomAttributes(ref dependencies, factory, ((EcmaType)_type));
40+
CustomAttributeBasedDependencyAlgorithm.AddDependenciesDueToCustomAttributes(ref dependencies, factory, ((EcmaType)_type));
4441

4542
DefType containingType = _type.ContainingType;
4643
if (containingType != null)
47-
{
48-
TypeMetadataNode metadataNode = _includeCustomAttributes
49-
? factory.TypeMetadata((MetadataType)containingType)
50-
: factory.TypeMetadataWithoutCustomAttributes((MetadataType)containingType);
51-
dependencies.Add(metadataNode, "Containing type of a reflectable type");
52-
}
44+
dependencies.Add(factory.TypeMetadata((MetadataType)containingType), "Containing type of a reflectable type");
5345
else
54-
{
5546
dependencies.Add(factory.ModuleMetadata(_type.Module), "Containing module of a reflectable type");
56-
}
5747

5848
var mdManager = (UsageBasedMetadataManager)factory.MetadataManager;
5949

@@ -110,7 +100,7 @@ public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFacto
110100
/// Decomposes a constructed type into individual <see cref="TypeMetadataNode"/> units that will be needed to
111101
/// express the constructed type in metadata.
112102
/// </summary>
113-
public static void GetMetadataDependencies(ref DependencyList dependencies, NodeFactory nodeFactory, TypeDesc type, string reason, bool isFullType = true)
103+
public static void GetMetadataDependencies(ref DependencyList dependencies, NodeFactory nodeFactory, TypeDesc type, string reason)
114104
{
115105
MetadataManager mdManager = nodeFactory.MetadataManager;
116106

@@ -120,13 +110,13 @@ public static void GetMetadataDependencies(ref DependencyList dependencies, Node
120110
case TypeFlags.SzArray:
121111
case TypeFlags.ByRef:
122112
case TypeFlags.Pointer:
123-
GetMetadataDependencies(ref dependencies, nodeFactory, ((ParameterizedType)type).ParameterType, reason, isFullType);
113+
GetMetadataDependencies(ref dependencies, nodeFactory, ((ParameterizedType)type).ParameterType, reason);
124114
break;
125115
case TypeFlags.FunctionPointer:
126116
var pointerType = (FunctionPointerType)type;
127-
GetMetadataDependencies(ref dependencies, nodeFactory, pointerType.Signature.ReturnType, reason, isFullType);
117+
GetMetadataDependencies(ref dependencies, nodeFactory, pointerType.Signature.ReturnType, reason);
128118
foreach (TypeDesc paramType in pointerType.Signature)
129-
GetMetadataDependencies(ref dependencies, nodeFactory, paramType, reason, isFullType);
119+
GetMetadataDependencies(ref dependencies, nodeFactory, paramType, reason);
130120
break;
131121

132122
case TypeFlags.SignatureMethodVariable:
@@ -136,30 +126,35 @@ public static void GetMetadataDependencies(ref DependencyList dependencies, Node
136126
default:
137127
Debug.Assert(type.IsDefType);
138128

139-
var typeDefinition = (MetadataType)type.GetTypeDefinition();
129+
TypeDesc typeDefinition = type.GetTypeDefinition();
140130
if (typeDefinition != type)
141131
{
132+
if (mdManager.CanGenerateMetadata((MetadataType)typeDefinition))
133+
{
134+
dependencies ??= new DependencyList();
135+
dependencies.Add(nodeFactory.TypeMetadata((MetadataType)typeDefinition), reason);
136+
}
137+
142138
foreach (TypeDesc typeArg in type.Instantiation)
143139
{
144-
GetMetadataDependencies(ref dependencies, nodeFactory, typeArg, reason, isFullType);
140+
GetMetadataDependencies(ref dependencies, nodeFactory, typeArg, reason);
145141
}
146142
}
147-
148-
if (mdManager.CanGenerateMetadata(typeDefinition))
143+
else
149144
{
150-
dependencies ??= new DependencyList();
151-
TypeMetadataNode node = isFullType
152-
? nodeFactory.TypeMetadata(typeDefinition)
153-
: nodeFactory.TypeMetadataWithoutCustomAttributes(typeDefinition);
154-
dependencies.Add(node, reason);
145+
if (mdManager.CanGenerateMetadata((MetadataType)type))
146+
{
147+
dependencies ??= new DependencyList();
148+
dependencies.Add(nodeFactory.TypeMetadata((MetadataType)type), reason);
149+
}
155150
}
156151
break;
157152
}
158153
}
159154

160155
protected override string GetName(NodeFactory factory)
161156
{
162-
return $"Reflectable type: {_type}{(!_includeCustomAttributes ? " (No custom attributes)" : "")}";
157+
return "Reflectable type: " + _type.ToString();
163158
}
164159

165160
protected override void OnMarked(NodeFactory factory)

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,13 +478,13 @@ protected virtual void GetMetadataDependenciesDueToReflectability(ref Dependency
478478
/// <summary>
479479
/// This method is an extension point that can provide additional metadata-based dependencies to generated EETypes.
480480
/// </summary>
481-
public virtual void GetDependenciesDueToEETypePresence(ref DependencyList dependencies, NodeFactory factory, TypeDesc type, bool isFullType)
481+
public virtual void GetDependenciesDueToEETypePresence(ref DependencyList dependencies, NodeFactory factory, TypeDesc type)
482482
{
483483
MetadataCategory category = GetMetadataCategory(type);
484484

485485
if ((category & MetadataCategory.Description) != 0)
486486
{
487-
GetMetadataDependenciesDueToReflectability(ref dependencies, factory, type, isFullType);
487+
GetMetadataDependenciesDueToReflectability(ref dependencies, factory, type);
488488
}
489489
}
490490

@@ -493,7 +493,7 @@ internal virtual void GetDependenciesDueToModuleUse(ref DependencyList dependenc
493493
// MetadataManagers can override this to provide additional dependencies caused by using a module
494494
}
495495

496-
protected virtual void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, TypeDesc type, bool isFullType)
496+
protected virtual void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, TypeDesc type)
497497
{
498498
// MetadataManagers can override this to provide additional dependencies caused by the emission of metadata
499499
// (E.g. dependencies caused by the type having custom attributes applied to it: making sure we compile the attribute constructor

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/UsageBasedMetadataManager.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,9 +271,9 @@ internal override void GetDependenciesDueToModuleUse(ref DependencyList dependen
271271
}
272272
}
273273

274-
protected override void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, TypeDesc type, bool isFullType)
274+
protected override void GetMetadataDependenciesDueToReflectability(ref DependencyList dependencies, NodeFactory factory, TypeDesc type)
275275
{
276-
TypeMetadataNode.GetMetadataDependencies(ref dependencies, factory, type, "Reflectable type", isFullType);
276+
TypeMetadataNode.GetMetadataDependencies(ref dependencies, factory, type, "Reflectable type");
277277

278278
if (type.IsDelegate)
279279
{
@@ -385,9 +385,9 @@ private static bool IsTrimmableAssembly(ModuleDesc assembly)
385385
return false;
386386
}
387387

388-
public override void GetDependenciesDueToEETypePresence(ref DependencyList dependencies, NodeFactory factory, TypeDesc type, bool isFullType)
388+
public override void GetDependenciesDueToEETypePresence(ref DependencyList dependencies, NodeFactory factory, TypeDesc type)
389389
{
390-
base.GetDependenciesDueToEETypePresence(ref dependencies, factory, type, isFullType);
390+
base.GetDependenciesDueToEETypePresence(ref dependencies, factory, type);
391391

392392
DataflowAnalyzedTypeDefinitionNode.GetDependencies(ref dependencies, factory, FlowAnnotations, type);
393393
}
@@ -970,7 +970,7 @@ public bool GeneratesMetadata(MethodDesc methodDef)
970970

971971
public bool GeneratesMetadata(MetadataType typeDef)
972972
{
973-
return _factory.TypeMetadata(typeDef).Marked || _factory.TypeMetadataWithoutCustomAttributes(typeDef).Marked;
973+
return _factory.TypeMetadata(typeDef).Marked;
974974
}
975975

976976
public bool GeneratesMetadata(EcmaModule module, CustomAttributeHandle caHandle)

src/tests/nativeaot/SmokeTests/Reflection/Reflection.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ private static int Main()
6767
TestByRefTypeLoad.Run();
6868
TestGenericLdtoken.Run();
6969
TestAbstractGenericLdtoken.Run();
70+
TestTypeHandlesVisibleFromIDynamicInterfaceCastable.Run();
7071

7172
//
7273
// Mostly functionality tests
@@ -2457,6 +2458,35 @@ public static void Run()
24572458
}
24582459
}
24592460

2461+
class TestTypeHandlesVisibleFromIDynamicInterfaceCastable
2462+
{
2463+
class MyAttribute : Attribute { }
2464+
2465+
[My]
2466+
interface IUnusedInterface { }
2467+
2468+
class Foo : IDynamicInterfaceCastable
2469+
{
2470+
public RuntimeTypeHandle GetInterfaceImplementation(RuntimeTypeHandle interfaceType) => throw new NotImplementedException();
2471+
2472+
public bool IsInterfaceImplemented(RuntimeTypeHandle interfaceType, bool throwIfNotImplemented)
2473+
{
2474+
Type t = Type.GetTypeFromHandle(interfaceType);
2475+
if (t.GetCustomAttribute<MyAttribute>() == null)
2476+
throw new Exception();
2477+
2478+
return true;
2479+
}
2480+
}
2481+
2482+
public static void Run()
2483+
{
2484+
object myObject = new Foo();
2485+
if (myObject is not IUnusedInterface)
2486+
throw new Exception();
2487+
}
2488+
}
2489+
24602490
class TestEntryPoint
24612491
{
24622492
public static void Run()

src/tests/nativeaot/SmokeTests/TrimmingBehaviors/DeadCodeElimination.cs

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public static int Run()
2121
TestStaticVirtualMethodOptimizations.Run();
2222
TestTypeEquals.Run();
2323
TestBranchesInGenericCodeRemoval.Run();
24-
TestLimitedMetadataBlobs.Run();
2524

2625
return 100;
2726
}
@@ -379,51 +378,6 @@ public static void Run()
379378
}
380379
}
381380

382-
class TestLimitedMetadataBlobs
383-
{
384-
class MyAttribute : Attribute
385-
{
386-
public MyAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type t) { }
387-
}
388-
389-
class ShouldNotBeNeeded
390-
{
391-
}
392-
393-
[My(typeof(ShouldNotBeNeeded))]
394-
interface INeverImplemented
395-
{
396-
void Never();
397-
}
398-
399-
static INeverImplemented s_instance;
400-
#if !DEBUG
401-
static Type s_type;
402-
#endif
403-
404-
internal static void Run()
405-
{
406-
Console.WriteLine("Testing generation of limited metadata blobs");
407-
408-
// Force a reference to the interface from a dispatch cell
409-
if (s_instance != null)
410-
s_instance.Never();
411-
412-
// Following is for release only since it relies on optimizing the typeof into an unconstructed
413-
// MethodTable.
414-
#if !DEBUG
415-
// Force another reference from an LDTOKEN
416-
if (s_type == typeof(INeverImplemented))
417-
s_type = typeof(object);
418-
#endif
419-
420-
ThrowIfPresent(typeof(TestLimitedMetadataBlobs), nameof(ShouldNotBeNeeded));
421-
ThrowIfPresent(typeof(TestLimitedMetadataBlobs), nameof(MyAttribute));
422-
ThrowIfNotPresent(typeof(TestLimitedMetadataBlobs), nameof(INeverImplemented));
423-
}
424-
}
425-
426-
427381
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern",
428382
Justification = "That's the point")]
429383
private static Type GetTypeSecretly(Type testType, string typeName) => testType.GetNestedType(typeName, BindingFlags.NonPublic | BindingFlags.Public);

0 commit comments

Comments
 (0)