Skip to content

Commit 3f18473

Browse files
authored
Clean up ILLink validation logic (#117449)
For compiler-generated code. This makes the logic more uniform for types/fields/methods/properties/events. Also makes the logic more consistent between ILLink and ILC.
1 parent f8b5e9c commit 3f18473

File tree

3 files changed

+120
-114
lines changed

3 files changed

+120
-114
lines changed

src/coreclr/tools/aot/ILCompiler.Trimming.Tests/TestCasesRunner/AssemblyChecker.cs

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -357,15 +357,10 @@ IEnumerable<string> VerifyTypeDefinition (TypeDefinition original, LinkedEntity?
357357
if (linked == null)
358358
yield break;
359359

360-
// Compiler generated members can't be annotated with `Kept` attributes directly
361-
// For some of them we have special attributes (backing fields for example), but it's impractical to define
362-
// special attributes for all types of compiler generated members (there are quite a few of them and they're
363-
// going to change/increase over time).
364-
// So we're effectively disabling Kept validation on compiler generated members
365-
// Note that we still want to go "inside" each such member, as it might have additional attributes
360+
// Note that we still want to go "inside" each skipped type, as it might have additional attributes
366361
// we do want to validate. There's no specific use case right now, but I can easily imagine one
367362
// for more detailed testing of for example custom attributes on local functions, or similar.
368-
if (!IsCompilerGeneratedMember (original))
363+
if (!SkipKeptItemsValidation (original))
369364
yield return $"Type `{original}' should have been removed";
370365
}
371366

@@ -408,8 +403,7 @@ protected virtual IEnumerable<string> VerifyTypeDefinitionKept (TypeDefinition o
408403
}
409404

410405
#if false
411-
// Skip verification of type metadata for compiler generated types (we don't currently need it yet)
412-
if (!IsCompilerGeneratedMember (original)) {
406+
if (!SkipKeptItemsValidation (original)) {
413407
foreach(var err in VerifyKeptByAttributes (original, linked))
414408
yield return err;
415409
if (!original.IsInterface)
@@ -422,7 +416,7 @@ protected virtual IEnumerable<string> VerifyTypeDefinitionKept (TypeDefinition o
422416
yield return err;
423417
foreach(var err in VerifyPseudoAttributes (original, linked))
424418
yield return err;
425-
foreach(var err in VerifyGenericParameters (original, linked))
419+
foreach(var err in VerifyGenericParameters (original, linked, skipKeptItemsValidation: false))
426420
yield return err;
427421
foreach(var err in VerifyCustomAttributes (original, linked))
428422
yield return err;
@@ -557,21 +551,21 @@ private static string FormatBaseOrInterfaceAttributeValue (CustomAttribute attr)
557551

558552
private IEnumerable<string> VerifyField (FieldDefinition src, FieldDesc? linked)
559553
{
560-
bool compilerGenerated = IsCompilerGeneratedMember (src);
561-
bool expectedKept = ShouldBeKept (src) | compilerGenerated;
554+
bool skipKeptItemsValidation = SkipKeptItemsValidation (src);
555+
bool expectedKept = ShouldBeKept(src);
562556

563557
if (!expectedKept) {
564-
if (linked != null)
558+
if (linked != null && !skipKeptItemsValidation)
565559
yield return $"Field `{src}' should have been removed";
566560

567561
yield break;
568562
}
569563

570-
foreach(var err in VerifyFieldKept (src, linked, compilerGenerated))
564+
foreach(var err in VerifyFieldKept (src, linked, skipKeptItemsValidation))
571565
yield return err;
572566
}
573567

574-
private static IEnumerable<string> VerifyFieldKept (FieldDefinition src, FieldDesc? linked, bool compilerGenerated)
568+
private static IEnumerable<string> VerifyFieldKept (FieldDefinition src, FieldDesc? linked, bool skipKeptItemsValidation)
575569
{
576570
if (linked == null) {
577571
yield return $"Field `{src}' should have been kept";
@@ -590,7 +584,7 @@ private static IEnumerable<string> VerifyFieldKept (FieldDefinition src, FieldDe
590584
#if false
591585
foreach(var err in VerifyPseudoAttributes (src, linked))
592586
yield return err;
593-
if (!compilerGenerated)
587+
if (!skipKeptItemsValidation)
594588
foreach(var err in VerifyCustomAttributes (src, linked))
595589
yield return err;
596590
#endif
@@ -601,11 +595,11 @@ private IEnumerable<string> VerifyProperty (PropertyDefinition src, LinkedEntity
601595
PropertyPseudoDesc? linked = linkedEntity?.Entity as PropertyPseudoDesc;
602596
VerifyMemberBackingField (src, linkedType);
603597

604-
bool compilerGenerated = IsCompilerGeneratedMember (src);
605-
bool expectedKept = ShouldBeKept (src) || compilerGenerated;
598+
bool skipKeptItemsValidation = SkipKeptItemsValidation (src);
599+
bool expectedKept = ShouldBeKept(src);
606600

607601
if (!expectedKept) {
608-
if (linked is not null)
602+
if (linked is not null && !skipKeptItemsValidation)
609603
yield return $"Property `{src}' should have been removed";
610604

611605
yield break;
@@ -627,7 +621,7 @@ private IEnumerable<string> VerifyProperty (PropertyDefinition src, LinkedEntity
627621
#if false
628622
foreach(var err in VerifyPseudoAttributes (src, linked))
629623
yield return err;
630-
if (!compilerGenerated)
624+
if (!skipKeptItemsValidation)
631625
{
632626
foreach(var err in VerifyCustomAttributes (src, linked))
633627
yield return err;
@@ -641,11 +635,11 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
641635
foreach(var err in VerifyMemberBackingField (src, linkedType))
642636
yield return err;
643637

644-
bool compilerGenerated = IsCompilerGeneratedMember (src);
645-
bool expectedKept = ShouldBeKept (src) | compilerGenerated;
638+
bool skipKeptItemsValidation = SkipKeptItemsValidation (src);
639+
bool expectedKept = ShouldBeKept (src);
646640

647641
if (!expectedKept) {
648-
if (linked is not null)
642+
if (linked is not null && !skipKeptItemsValidation)
649643
yield return $"Event `{src}' should have been removed";
650644

651645
yield break;
@@ -659,7 +653,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
659653
if (src.CustomAttributes.Any (attr => attr.AttributeType.Name == nameof (KeptEventAddMethodAttribute))) {
660654
// TODO: This is wrong - we can't validate that the method is present by looking at linked (as that is not actually linked)
661655
// we need to look into linkedMembers to see if the method was actually preserved by the compiler (and has an entry point)
662-
foreach(var err in VerifyMethodInternal (src.AddMethod, new LinkedMethodEntity(linked.AddMethod, false), true, compilerGenerated))
656+
foreach(var err in VerifyMethodInternal (src.AddMethod, new LinkedMethodEntity(linked.AddMethod, false), true, skipKeptItemsValidation))
663657
yield return err;
664658
verifiedEventMethods.Add (src.AddMethod.FullName);
665659
linkedMembers.Remove (new AssemblyQualifiedToken (src.AddMethod));
@@ -668,7 +662,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
668662
if (src.CustomAttributes.Any (attr => attr.AttributeType.Name == nameof (KeptEventRemoveMethodAttribute))) {
669663
// TODO: This is wrong - we can't validate that the method is present by looking at linked (as that is not actually linked)
670664
// we need to look into linkedMembers to see if the method was actually preserved by the compiler (and has an entry point)
671-
foreach(var err in VerifyMethodInternal (src.RemoveMethod, new LinkedMethodEntity(linked.RemoveMethod, false), true, compilerGenerated))
665+
foreach(var err in VerifyMethodInternal (src.RemoveMethod, new LinkedMethodEntity(linked.RemoveMethod, false), true, skipKeptItemsValidation))
672666
yield return err;
673667
verifiedEventMethods.Add (src.RemoveMethod.FullName);
674668
linkedMembers.Remove (new AssemblyQualifiedToken (src.RemoveMethod));
@@ -677,7 +671,7 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
677671
#if false
678672
foreach(var err in VerifyPseudoAttributes (src, linked))
679673
yield return err;
680-
if (!compilerGenerated)
674+
if (!skipKeptItemsValidation)
681675
{
682676
foreach(var err in VerifyCustomAttributes (src, linned))
683677
yield return err;
@@ -688,26 +682,25 @@ private IEnumerable<string> VerifyEvent (EventDefinition src, LinkedEntity? link
688682
private IEnumerable<string> VerifyMethod (MethodDefinition src, LinkedEntity? linkedEntity)
689683
{
690684
LinkedMethodEntity? linked = linkedEntity as LinkedMethodEntity;
691-
bool compilerGenerated = IsCompilerGeneratedMember (src);
685+
bool skipKeptItemsValidation = SkipKeptItemsValidation (src);
692686
bool expectedKept = ShouldMethodBeKept (src);
693-
foreach(var err in VerifyMethodInternal (src, linked, expectedKept, compilerGenerated))
687+
foreach(var err in VerifyMethodInternal (src, linked, expectedKept, skipKeptItemsValidation))
694688
yield return err;
695689
}
696690

697-
private IEnumerable<string> VerifyMethodInternal (MethodDefinition src, LinkedMethodEntity? linked, bool expectedKept, bool compilerGenerated)
691+
private IEnumerable<string> VerifyMethodInternal (MethodDefinition src, LinkedMethodEntity? linked, bool expectedKept, bool skipKeptItemsValidation)
698692
{
699693
if (!expectedKept) {
700694
if (linked == null)
701695
yield break;
702696

703-
// Similar to comment on types, compiler-generated methods can't be annotated with Kept attribute directly
704-
// so we're not going to validate kept/remove on them. Note that we're still going to go validate "into" them
705-
// to check for other properties (like parameter name presence/removal for example)
706-
if (!compilerGenerated)
697+
// Note that we're still going to go validate "into" the skipped methods to check for other properties
698+
// (like parameter name presence/removal for example)
699+
if (!skipKeptItemsValidation)
707700
yield return $"Method `{NameUtils.GetExpectedOriginDisplayName (src)}' should have been removed";
708701
}
709702

710-
foreach(var err in VerifyMethodKept (src, linked, compilerGenerated))
703+
foreach(var err in VerifyMethodKept (src, linked, skipKeptItemsValidation))
711704
yield return err;
712705
}
713706

@@ -735,13 +728,13 @@ private IEnumerable<string> VerifyMemberBackingField (IMemberDefinition src, Typ
735728
yield break;
736729
}
737730

738-
foreach(var err in VerifyFieldKept (srcField, linkedType?.GetFields ()?.FirstOrDefault (l => srcField.Name == l.Name), compilerGenerated: true))
731+
foreach(var err in VerifyFieldKept (srcField, linkedType?.GetFields ()?.FirstOrDefault (l => srcField.Name == l.Name), skipKeptItemsValidation: true))
739732
yield return err;
740733
verifiedGeneratedFields.Add (srcField.FullName);
741734
linkedMembers.Remove (new AssemblyQualifiedToken (srcField));
742735
}
743736

744-
IEnumerable<string> VerifyMethodKept (MethodDefinition src, LinkedMethodEntity? linked, bool compilerGenerated)
737+
IEnumerable<string> VerifyMethodKept (MethodDefinition src, LinkedMethodEntity? linked, bool skipKeptItemsValidation)
745738
{
746739
if (linked == null) {
747740
yield return $"Method `{NameUtils.GetExpectedOriginDisplayName (src)}' should have been kept";
@@ -751,16 +744,16 @@ IEnumerable<string> VerifyMethodKept (MethodDefinition src, LinkedMethodEntity?
751744
#if false
752745
foreach(var err in VerifyPseudoAttributes (src, linked))
753746
yield return err;
754-
foreach(var err in VerifyGenericParameters (src, linked))
747+
foreach(var err in VerifyGenericParameters (src, linked, skipKeptItemsValidation))
755748
yield return err;
756-
if (!compilerGenerated) {
749+
if (!skipKeptItemsValidation) {
757750
foreach(var err in VerifyCustomAttributes (src, linked))
758751
yield return err;
759752
foreach(var err in VerifyCustomAttributes (src.MethodReturnType, linked.MethodReturnType))
760753
yield return err;
761754
}
762755
#endif
763-
foreach(var err in VerifyParameters (src, linked))
756+
foreach(var err in VerifyParameters (src, linked, skipKeptItemsValidation))
764757
yield return err;
765758
#if false
766759
foreach(var err in VerifySecurityAttributes (src, linked))
@@ -1156,7 +1149,7 @@ protected virtual IEnumerable<string> VerifyArrayInitializers (MethodDefinition
11561149

11571150
private IEnumerable<string> VerifyInitializerField (FieldDefinition src, FieldDefinition? linked)
11581151
{
1159-
foreach(var err in VerifyFieldKept (src, linked))
1152+
foreach(var err in VerifyFieldKept (src, linked, skipKeptItemsValidation: true))
11601153
yield return err;
11611154
verifiedGeneratedFields.Add (linked!.FullName);
11621155
linkedMembers.Remove (new (linked));
@@ -1264,7 +1257,7 @@ private IEnumerable<string> VerifyFixedBufferFields (TypeDefinition src, TypeDef
12641257
}
12651258

12661259
var linkedField = linkedCompilerGeneratedBufferType?.Fields.FirstOrDefault ();
1267-
foreach(var err in VerifyFieldKept (originalElementField, linkedField))
1260+
foreach(var err in VerifyFieldKept (originalElementField, linkedField, skipKeptItemsValidation: true))
12681261
yield return err;
12691262
verifiedGeneratedFields.Add (originalElementField.FullName);
12701263
linkedMembers.Remove (new (linkedField!));
@@ -1289,15 +1282,15 @@ private IEnumerable<string> VerifyDelegateBackingFields (TypeDefinition src, Typ
12891282
continue;
12901283

12911284
var linkedField = linked?.Fields.FirstOrDefault (l => l.Name == srcField.Name);
1292-
foreach(var err in VerifyFieldKept (srcField, linkedField))
1285+
foreach(var err in VerifyFieldKept (srcField, linkedField, skipKeptItemsValidation: true))
12931286
yield return err;
12941287
verifiedGeneratedFields.Add (srcField.FullName);
12951288
linkedMembers.Remove (new (srcField));
12961289
}
12971290
}
12981291
#endif
12991292

1300-
private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider src, IGenericParameterProvider linked)
1293+
private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider src, IGenericParameterProvider linked, bool skipKeptItemsValidation)
13011294
{
13021295
if (src.HasGenericParameters != linked.HasGenericParameters)
13031296
yield return $"Mismatch in having generic paramters. Expected {src.HasGenericParameters}, actual {linked.HasGenericParameters}";
@@ -1307,8 +1300,12 @@ private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider s
13071300
// TODO: Verify constraints
13081301
var srcp = src.GenericParameters[i];
13091302
var lnkp = linked.GenericParameters[i];
1310-
foreach(var err in VerifyCustomAttributes (srcp, lnkp))
1311-
yield return err;
1303+
1304+
if (!skipKeptItemsValidation)
1305+
{
1306+
foreach (var err in VerifyCustomAttributes(srcp, lnkp))
1307+
yield return err;
1308+
}
13121309

13131310
if (checkNames) {
13141311
if (srcp.CustomAttributes.Any (attr => attr.AttributeType.Name == nameof (RemovedNameValueAttribute))) {
@@ -1324,7 +1321,7 @@ private IEnumerable<string> VerifyGenericParameters (IGenericParameterProvider s
13241321
}
13251322
}
13261323

1327-
private IEnumerable<string> VerifyParameters (IMethodSignature src, LinkedMethodEntity linked)
1324+
private IEnumerable<string> VerifyParameters (IMethodSignature src, LinkedMethodEntity linked, bool skipKeptItemsValidation)
13281325
{
13291326
if (src.HasParameters != linked.Method.Signature.Length > 0)
13301327
yield return $"Mismatch in having parameters in {src as MethodDefinition}: Expected {src.HasParameters}, actual {linked.Method.Signature.Length > 0}";
@@ -1334,8 +1331,11 @@ private IEnumerable<string> VerifyParameters (IMethodSignature src, LinkedMethod
13341331
//var lnkp = linked.Parameters[i];
13351332

13361333
#if false
1337-
foreach(var err in VerifyCustomAttributes (srcp, lnkp))
1338-
yield return err;
1334+
if (!skipKeptItemsValidation)
1335+
{
1336+
foreach(var err in VerifyCustomAttributes (srcp, lnkp))
1337+
yield return err;
1338+
}
13391339
#endif
13401340

13411341
if (checkNames) {

0 commit comments

Comments
 (0)