From 4da653d1a6c03cdba12278786c2ebc02bf029459 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Tue, 19 Sep 2017 15:12:02 +0200 Subject: [PATCH] [linker] port #59015 fix to XA Make sure the methods required by the debugger are not linked out. Note that this commit doesn't fix the assert reported in #59015 on Android as it happens with linker turned off as well. So that will need another fix. --- .../MonoDroid.Tuner/MonoDroidMarkStep.cs | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs index 3bbcf2bbe7f..859094cd6db 100644 --- a/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs +++ b/src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/MonoDroidMarkStep.cs @@ -140,8 +140,14 @@ protected override TypeDefinition MarkType (TypeReference reference) if (type == null) return null; - if (type.Module.Assembly.Name.Name == "System.Core") + switch (type.Module.Assembly.Name.Name) { + case "mscorlib": + ProcessCorlib (type); + break; + case "System.Core": ProcessSystemCore (type); + break; + } if (type.HasMethods && type.HasInterfaces && type.Implements (ICustomMarshalerName)) { foreach (MethodDefinition method in type.Methods) { @@ -155,6 +161,40 @@ protected override TypeDefinition MarkType (TypeReference reference) return type; } + bool DebugBuild { + get { return _context.LinkSymbols; } + } + + void ProcessCorlib (TypeDefinition type) + { + switch (type.Namespace) { + case "System.Runtime.CompilerServices": + switch (type.Name) { + case "AsyncTaskMethodBuilder": + if (DebugBuild) { + MarkNamedMethod (type, "SetNotificationForWaitCompletion"); + MarkNamedMethod (type, "get_ObjectIdForDebugger"); + } + break; + case "AsyncTaskMethodBuilder`1": + if (DebugBuild) { + MarkNamedMethod (type, "SetNotificationForWaitCompletion"); + MarkNamedMethod (type, "get_ObjectIdForDebugger"); + } + break; + } + break; + case "System.Threading.Tasks": + switch (type.Name) { + case "Task": + if (DebugBuild) + MarkNamedMethod (type, "NotifyDebuggerOfWaitCompletion"); + break; + } + break; + } + } + void ProcessSystemCore (TypeDefinition type) { switch (type.Namespace) {