Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/linker.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/linker/Linker.Steps/MarkScopeStack.cs')
-rw-r--r--src/linker/Linker.Steps/MarkScopeStack.cs22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/linker/Linker.Steps/MarkScopeStack.cs b/src/linker/Linker.Steps/MarkScopeStack.cs
index 1804b4d69..4aea40c3f 100644
--- a/src/linker/Linker.Steps/MarkScopeStack.cs
+++ b/src/linker/Linker.Steps/MarkScopeStack.cs
@@ -15,12 +15,13 @@ namespace Mono.Linker.Steps
{
public readonly MessageOrigin Origin;
- public Scope (MessageOrigin origin)
+ public Scope (in MessageOrigin origin)
{
Origin = origin;
}
}
+ readonly LinkContext _context;
readonly Stack<Scope> _scopeStack;
readonly struct LocalScope : IDisposable
@@ -32,7 +33,16 @@ namespace Mono.Linker.Steps
{
_origin = origin;
_scopeStack = scopeStack;
- _scopeStack.Push (new Scope (origin));
+
+ // Compiler generated methods and types should "inherit" suppression context
+ // from the user defined method from which the compiler generated them.
+ // Detecting which method produced which piece of compiler generated code
+ // is currently not possible in all cases, but in cases where it works
+ // we will store the suppression context in the SuppressionContextMember.
+ // For code which is not compiler generated the suppression context
+ // is the same as the message's origin member.
+ IMemberDefinition suppressionContextMember = _scopeStack.GetSuppressionContext (origin.MemberDefinition);
+ _scopeStack.Push (new Scope (new MessageOrigin (origin.MemberDefinition, origin.ILOffset, suppressionContextMember)));
}
public LocalScope (in Scope scope, MarkScopeStack scopeStack)
@@ -73,8 +83,9 @@ namespace Mono.Linker.Steps
}
}
- public MarkScopeStack ()
+ public MarkScopeStack (LinkContext context)
{
+ _context = context;
_scopeStack = new Stack<Scope> ();
}
@@ -108,7 +119,7 @@ namespace Mono.Linker.Steps
if (scope.Origin.MemberDefinition is not MethodDefinition)
throw new InternalErrorException ($"Trying to update instruction offset of scope stack which is not a method. Current stack scope is '{scope}'.");
- _scopeStack.Push (new Scope (new MessageOrigin (scope.Origin.MemberDefinition, offset)));
+ _scopeStack.Push (new Scope (new MessageOrigin (scope.Origin.MemberDefinition, offset, scope.Origin.SuppressionContextMember)));
}
void Push (in Scope scope)
@@ -126,5 +137,8 @@ namespace Mono.Linker.Steps
[Conditional ("DEBUG")]
public void AssertIsEmpty () => Debug.Assert (_scopeStack.Count == 0);
+
+ IMemberDefinition GetSuppressionContext (IMemberDefinition sourceMember) =>
+ _context.CompilerGeneratedState.GetUserDefinedMethodForCompilerGeneratedMember (sourceMember) ?? sourceMember;
}
}