Skip to content

Commit 5c2d025

Browse files
Annotate Reflection.Emit for trimming (#38331)
Even though intuitively Reflection.Emit doesn't feel trimming friendly, it probably is if we enforce base types and interfaces of emitted things are preserved in their entirety.
1 parent 3b5522c commit 5c2d025

11 files changed

Lines changed: 84 additions & 42 deletions

File tree

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5+
using System.Diagnostics.CodeAnalysis;
56
using System.Globalization;
67

78
namespace System.Reflection.Emit
@@ -14,7 +15,7 @@ public sealed class ConstructorBuilder : ConstructorInfo
1415
#region Constructor
1516

1617
internal ConstructorBuilder(string name, MethodAttributes attributes, CallingConventions callingConvention,
17-
Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, ModuleBuilder mod, TypeBuilder type)
18+
Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, ModuleBuilder mod, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TypeBuilder type)
1819
{
1920
m_methodBuilder = new MethodBuilder(name, attributes, callingConvention, null, null, null,
2021
parameterTypes, requiredCustomModifiers, optionalCustomModifiers, mod, type);
@@ -40,6 +41,7 @@ internal override Type[] GetParameterTypes()
4041
return m_methodBuilder.GetParameterTypes();
4142
}
4243

44+
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
4345
private TypeBuilder GetTypeBuilder()
4446
{
4547
return m_methodBuilder.GetTypeBuilder();

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,9 @@ internal EnumBuilder(
337337
* private data members
338338
*
339339
*/
340+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
340341
internal TypeBuilder m_typeBuilder;
342+
341343
private FieldBuilder m_underlyingField;
342344
}
343345
}

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
203203
m_type.SetGenParamCustomAttribute(customBuilder);
204204
}
205205

206-
public void SetBaseTypeConstraint(Type? baseTypeConstraint)
206+
public void SetBaseTypeConstraint([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? baseTypeConstraint)
207207
{
208208
m_type.CheckContext(baseTypeConstraint);
209209
m_type.SetParent(baseTypeConstraint);

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System.Diagnostics;
6+
using System.Diagnostics.CodeAnalysis;
67
using System.Diagnostics.SymbolStore;
78
using System.Runtime.CompilerServices;
89
using System.Runtime.InteropServices;
@@ -18,6 +19,8 @@ public sealed class MethodBuilder : MethodInfo
1819
internal string m_strName; // The name of the method
1920
private MethodToken m_tkMethod; // The token of this method
2021
private readonly ModuleBuilder m_module;
22+
23+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
2124
internal TypeBuilder m_containingType;
2225

2326
// IL
@@ -57,7 +60,7 @@ public sealed class MethodBuilder : MethodInfo
5760
internal MethodBuilder(string name, MethodAttributes attributes, CallingConventions callingConvention,
5861
Type? returnType, Type[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers,
5962
Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers,
60-
ModuleBuilder mod, TypeBuilder type)
63+
ModuleBuilder mod, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TypeBuilder type)
6164
{
6265
if (name == null)
6366
throw new ArgumentNullException(nameof(name));
@@ -400,6 +403,7 @@ internal bool IsTypeCreated()
400403
return m_containingType != null && m_containingType.IsCreated();
401404
}
402405

406+
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
403407
internal TypeBuilder GetTypeBuilder()
404408
{
405409
return m_containingType;

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs

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

55
using System.Collections.Generic;
66
using System.Diagnostics;
7+
using System.Diagnostics.CodeAnalysis;
78
using System.Diagnostics.SymbolStore;
89
using System.Runtime.CompilerServices;
910
using System.Runtime.InteropServices;
@@ -770,7 +771,7 @@ public TypeBuilder DefineType(string name, TypeAttributes attr)
770771
}
771772
}
772773

773-
public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent)
774+
public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent)
774775
{
775776
lock (SyncRoot)
776777
{
@@ -780,44 +781,44 @@ public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent)
780781
}
781782
}
782783

783-
public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent, int typesize)
784+
public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, int typesize)
784785
{
785786
lock (SyncRoot)
786787
{
787788
return DefineTypeNoLock(name, attr, parent, null, PackingSize.Unspecified, typesize);
788789
}
789790
}
790791

791-
public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent, PackingSize packingSize, int typesize)
792+
public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packingSize, int typesize)
792793
{
793794
lock (SyncRoot)
794795
{
795796
return DefineTypeNoLock(name, attr, parent, null, packingSize, typesize);
796797
}
797798
}
798799

799-
public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent, Type[]? interfaces)
800+
public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces)
800801
{
801802
lock (SyncRoot)
802803
{
803804
return DefineTypeNoLock(name, attr, parent, interfaces, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
804805
}
805806
}
806807

807-
private TypeBuilder DefineTypeNoLock(string name, TypeAttributes attr, Type? parent, Type[]? interfaces, PackingSize packingSize, int typesize)
808+
private TypeBuilder DefineTypeNoLock(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, PackingSize packingSize, int typesize)
808809
{
809810
return new TypeBuilder(name, attr, parent, interfaces, this, packingSize, typesize, null);
810811
}
811812

812-
public TypeBuilder DefineType(string name, TypeAttributes attr, Type? parent, PackingSize packsize)
813+
public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packsize)
813814
{
814815
lock (SyncRoot)
815816
{
816817
return DefineTypeNoLock(name, attr, parent, packsize);
817818
}
818819
}
819820

820-
private TypeBuilder DefineTypeNoLock(string name, TypeAttributes attr, Type? parent, PackingSize packsize)
821+
private TypeBuilder DefineTypeNoLock(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packsize)
821822
{
822823
return new TypeBuilder(name, attr, parent, null, this, packsize, TypeBuilder.UnspecifiedTypeSize, null);
823824
}

src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,10 @@ internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type
400400
private readonly string? m_strName;
401401
private readonly string? m_strNameSpace;
402402
private string? m_strFullQualName;
403+
404+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
403405
private Type? m_typeParent;
406+
404407
private List<Type>? m_typeInterfaces;
405408
private readonly TypeAttributes m_iAttr;
406409
private GenericParameterAttributes m_genParamAttributes;
@@ -415,6 +418,8 @@ internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type
415418
private Type? m_enumUnderlyingType;
416419
internal bool m_isHiddenGlobalType;
417420
private bool m_hasBeenCreated;
421+
422+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
418423
private RuntimeType m_bakedRuntimeType = null!;
419424

420425
private readonly int m_genParamPos;
@@ -465,7 +470,7 @@ private TypeBuilder(string szName, int genParamPos, TypeBuilder declType)
465470
}
466471

467472
internal TypeBuilder(
468-
string fullname, TypeAttributes attr, Type? parent, Type[]? interfaces, ModuleBuilder module,
473+
string fullname, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, ModuleBuilder module,
469474
PackingSize iPackingSize, int iTypeSize, TypeBuilder? enclosingType)
470475
{
471476
if (fullname == null)
@@ -1588,7 +1593,7 @@ public TypeBuilder DefineNestedType(string name)
15881593
}
15891594
}
15901595

1591-
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? parent, Type[]? interfaces)
1596+
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces)
15921597
{
15931598
lock (SyncRoot)
15941599
{
@@ -1600,7 +1605,7 @@ public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? pare
16001605
}
16011606
}
16021607

1603-
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? parent)
1608+
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent)
16041609
{
16051610
lock (SyncRoot)
16061611
{
@@ -1616,31 +1621,31 @@ public TypeBuilder DefineNestedType(string name, TypeAttributes attr)
16161621
}
16171622
}
16181623

1619-
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? parent, int typeSize)
1624+
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, int typeSize)
16201625
{
16211626
lock (SyncRoot)
16221627
{
16231628
return DefineNestedTypeNoLock(name, attr, parent, null, PackingSize.Unspecified, typeSize);
16241629
}
16251630
}
16261631

1627-
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? parent, PackingSize packSize)
1632+
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packSize)
16281633
{
16291634
lock (SyncRoot)
16301635
{
16311636
return DefineNestedTypeNoLock(name, attr, parent, null, packSize, UnspecifiedTypeSize);
16321637
}
16331638
}
16341639

1635-
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, Type? parent, PackingSize packSize, int typeSize)
1640+
public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packSize, int typeSize)
16361641
{
16371642
lock (SyncRoot)
16381643
{
16391644
return DefineNestedTypeNoLock(name, attr, parent, null, packSize, typeSize);
16401645
}
16411646
}
16421647

1643-
private TypeBuilder DefineNestedTypeNoLock(string name, TypeAttributes attr, Type? parent, Type[]? interfaces, PackingSize packSize, int typeSize)
1648+
private TypeBuilder DefineNestedTypeNoLock(string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, PackingSize packSize, int typeSize)
16441649
{
16451650
return new TypeBuilder(name, attr, parent, interfaces, m_module, packSize, typeSize, this);
16461651
}
@@ -2061,7 +2066,7 @@ internal void CheckContext(params Type?[]? types)
20612066

20622067
public PackingSize PackingSize => m_iPackingSize;
20632068

2064-
public void SetParent(Type? parent)
2069+
public void SetParent([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent)
20652070
{
20662071
ThrowIfCreated();
20672072

@@ -2091,7 +2096,7 @@ public void SetParent(Type? parent)
20912096
}
20922097
}
20932098

2094-
public void AddInterfaceImplementation(Type interfaceType)
2099+
public void AddInterfaceImplementation([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type interfaceType)
20952100
{
20962101
if (interfaceType == null)
20972102
{

0 commit comments

Comments
 (0)