From 56953b143ff7edc2aca26059e879ddfc6c9e4210 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 27 Aug 2020 15:43:22 +0200 Subject: [PATCH 1/4] [dotnet-linker] Add PreserveSmartEnumConversionsSubStep into the pipeline. Fixes this startup crash in link all: 2020-08-26 19:56:03.936330+0200 link all[45665:6121665] Could not register the assembly 'link all': ObjCRuntime.RuntimeException: The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the parameter 'value' in the method LinkAll.Attributes.SmartConsumer.SetSmartEnumValue. at Registrar.Registrar.ObjCMethod.get_NativeParameters() at Registrar.Registrar.ComputeSignature(Type DeclaringType, MethodBase Method, ObjCMember member, Boolean isCategoryInstance, Boolean isBlockSignature) at Registrar.Registrar.ObjCMethod.ComputeSignature() at Registrar.Registrar.ObjCMethod.get_Signature() at Registrar.Registrar.ObjCMethod.get_Trampoline() at Registrar.DynamicRegistrar.RegisterMethod(ObjCMethod method) at Registrar.DynamicRegistrar.OnRegisterType(ObjCType type) at Registrar.Registrar.RegisterTypeUnsafe(Type type, List`1& exceptions) at Registrar.Registrar.RegisterAssembly(Assembly assembly) 2020-08-26 19:56:03.939327+0200 link all[45665:6121665] System.AggregateException: One or more errors occurred. (The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the return value in the method LinkAll.Attributes.SmartConsumer.GetSmartEnumValue.) (The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the return value in the method LinkAll.Attributes.SmartConsumer.GetSmartEnumValue.) (The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the parameter 'value' in the method LinkAll.Attributes.SmartConsumer.SetSmartEnumValue.) ---> ObjCRuntime.RuntimeException: The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the return value in the method LinkAll.Attributes.SmartConsumer.GetSmartEnumValue. at Registrar.Registrar.ObjCMethod.get_NativeReturnType() at Registrar.Registrar.ComputeSignature(Type DeclaringType, MethodBase Method, ObjCMember member, Boolean isCategoryInstance, Boolean isBlockSignature) at Registrar.Registrar.ObjCMethod.ComputeSignature() at Registrar.Registrar.ObjCMethod.ValidateSignature(List`1& exceptions) --- End of inner exception stack trace --- ---> (Inner Exception #1) ObjCRuntime.RuntimeException: The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the return value in the method LinkAll.Attributes.SmartConsumer.GetSmartEnumValue. at Registrar.Registrar.ObjCMethod.get_NativeReturnType() at Registrar.Registrar.VerifyInSdk(List`1& exceptions, ObjCMethod method) at Registrar.Registrar.ObjCType.Add(ObjCMethod method, List`1& exceptions) at Registrar.Registrar.RegisterTypeUnsafe(Type type, List`1& exceptions)<--- ---> (Inner Exception #2) ObjCRuntime.RuntimeException: The registrar can't convert from 'LinkAll.Attributes.SmartEnum' to 'Foundation.NSString' for the parameter 'value' in the method LinkAll.Attributes.SmartConsumer.SetSmartEnumValue. at Registrar.Registrar.ObjCMethod.get_NativeParameters() at Registrar.Registrar.ComputeSignature(Type DeclaringType, MethodBase Method, ObjCMember member, Boolean isCategoryInstance, Boolean isBlockSignature) at Registrar.Registrar.ObjCMethod.ComputeSignature() at Registrar.Registrar.ObjCMethod.ValidateSignature(List`1& exceptions)<--- ================================================================= Native Crash Reporting ================================================================= Got a abrt while executing native code. This usually indicates a fatal error in the mono runtime or one of the native libraries used by your application. ================================================================= ================================================================= Native stacktrace: ================================================================= 0x10d57eb0e - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_dump_native_crash_info 0x10d52b437 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_handle_native_crash 0x10d57e365 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : sigabrt_signal_handler 0x7fff51c005fd - /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.5.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_platform.dylib : _sigtramp 0x0 - Unknown 0x7fff51af0b7c - /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.5.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libsystem_c.dylib : abort 0x10d32478f - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libxamarin-debug.dylib : xamarin_unhandled_exception_handler 0x10d5eef68 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_invoke_unhandled_exception_hook 0x10d52ade0 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_handle_exception_internal 0x10d5296c1 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_handle_exception 0x10d579582 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libmonosgen-2.0.dylib : mono_amd64_throw_exception 0x10d91b5b0 - Unknown 0x10d3244eb - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libxamarin-debug.dylib : xamarin_process_managed_exception 0x10d324367 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libxamarin-debug.dylib : xamarin_process_managed_exception_gchandle 0x10d336851 - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/libxamarin-debug.dylib : xamarin_main 0x10d217ced - /Users/rolf/Library/Developer/CoreSimulator/Devices/289E372A-501C-4499-A1A6-59C5B3B6A9AE/data/Containers/Bundle/Application/5CB344E3-EC61-4720-92E6-4C8B91A67A85/link all.app/link all : main 0x7fff51a231fd - /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 13.5.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/libdyld.dylib : start --- tools/dotnet-linker/SetupStep.cs | 1 + tools/dotnet-linker/dotnet-linker.csproj | 3 +++ .../MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/tools/dotnet-linker/SetupStep.cs b/tools/dotnet-linker/SetupStep.cs index e722f7b3345e..2d6e5525f8a5 100644 --- a/tools/dotnet-linker/SetupStep.cs +++ b/tools/dotnet-linker/SetupStep.cs @@ -55,6 +55,7 @@ protected override void Process () // [assembly: LinkSafe] attributes, which means we treat them as sdk assemblies and those may have // Preserve attributes. prelink_substeps.Add (new ApplyPreserveAttribute ()); + prelink_substeps.Add (new PreserveSmartEnumConversionsSubStep ()); } Steps.Add (new LoadNonSkippedAssembliesStep ()); diff --git a/tools/dotnet-linker/dotnet-linker.csproj b/tools/dotnet-linker/dotnet-linker.csproj index a826bc95db06..49711f497134 100644 --- a/tools/dotnet-linker/dotnet-linker.csproj +++ b/tools/dotnet-linker/dotnet-linker.csproj @@ -140,6 +140,9 @@ external\tools\linker\MonoTouch.Tuner\Extensions.cs + + external\tools\linker\MonoTouch.Tuner\PreserveSmartEnumConversionsSubStep.cs + external\tools\linker\MobileExtensions.cs diff --git a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs index b32c56df1761..248ed45418c9 100644 --- a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs +++ b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs @@ -7,7 +7,11 @@ using Mono.Cecil.Cil; using Mono.Linker; using Mono.Tuner; +#if NET +using Mono.Linker.Steps; +#else using MonoTouch.Tuner; +#endif using Xamarin.Bundler; From c71853b3d85eda4e204b03527d6fc0596c6472cd Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 27 Aug 2020 16:37:22 +0200 Subject: [PATCH 2/4] [dotnet-linker] Work around the linker's lack of AnnotationStore.AddPreservedMethod API. Ref: https://github.com/mono/linker/issues/1456 --- .../PreserveSmartEnumConversionsSubStep.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs index 248ed45418c9..365280f38a1b 100644 --- a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs +++ b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs @@ -45,6 +45,18 @@ public override bool IsActiveFor (AssemblyDefinition assembly) void Preserve (Tuple pair, MethodDefinition conditionA, MethodDefinition conditionB = null) { +#if NET + // The AddPreservedMethod (MethodDefinition, MethodDefinition) has not been exposed yet, so preserve the entire containing type instead. + // https://github.com/mono/linker/issues/1456 + if (conditionA != null) { + context.Annotations.AddPreservedMethod (conditionA.DeclaringType, pair.Item1); + context.Annotations.AddPreservedMethod (conditionA.DeclaringType, pair.Item2); + } + if (conditionB != null) { + context.Annotations.AddPreservedMethod (conditionB.DeclaringType, pair.Item1); + context.Annotations.AddPreservedMethod (conditionB.DeclaringType, pair.Item2); + } +#else if (conditionA != null) { context.Annotations.AddPreservedMethod (conditionA, pair.Item1); context.Annotations.AddPreservedMethod (conditionA, pair.Item2); @@ -53,6 +65,7 @@ void Preserve (Tuple pair, MethodDefinition context.Annotations.AddPreservedMethod (conditionB, pair.Item1); context.Annotations.AddPreservedMethod (conditionB, pair.Item2); } +#endif } void ProcessAttributeProvider (ICustomAttributeProvider provider, MethodDefinition conditionA, MethodDefinition conditionB = null) From e9d82a254e56bfa954b8ae0a6b4db7ed371bae60 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 27 Aug 2020 15:43:22 +0200 Subject: [PATCH 3/4] [dotnet-linker] Add ExceptionalSubStep to the build PreserveSmartEnumConversionsSubStep subclasses ExceptionalSubStep, so we need it now. --- tools/dotnet-linker/Compat.cs | 16 ++++++++++++++ tools/dotnet-linker/LinkerConfiguration.cs | 3 +++ tools/dotnet-linker/dotnet-linker.csproj | 3 +++ tools/linker/ExceptionalSubStep.cs | 25 ++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/tools/dotnet-linker/Compat.cs b/tools/dotnet-linker/Compat.cs index 4961c0a23bf1..b12dccb08d2f 100644 --- a/tools/dotnet-linker/Compat.cs +++ b/tools/dotnet-linker/Compat.cs @@ -119,6 +119,22 @@ public class Pipeline { } } +namespace Xamarin.Linker { + public class Profile { + public LinkerConfiguration Configuration { get; private set; } + + public Profile (LinkerConfiguration config) + { + Configuration = config; + } + + public bool IsProductAssembly (AssemblyDefinition assembly) + { + return assembly.Name.Name == Configuration.PlatformAssembly; + } + } +} + namespace Mono.Linker { public static class LinkContextExtensions { public static void LogMessage (this LinkContext context, string messsage) diff --git a/tools/dotnet-linker/LinkerConfiguration.cs b/tools/dotnet-linker/LinkerConfiguration.cs index e3b80f2d592c..412a4af200fc 100644 --- a/tools/dotnet-linker/LinkerConfiguration.cs +++ b/tools/dotnet-linker/LinkerConfiguration.cs @@ -10,6 +10,7 @@ using Xamarin.Bundler; using Xamarin.Utils; +using Xamarin.Tuner; using ObjCRuntime; @@ -38,6 +39,7 @@ public class LinkerConfiguration { public CompilerFlags CompilerFlags; public LinkContext Context { get; private set; } + public Profile Profile { get; private set; } // The list of assemblies is populated in CollectAssembliesStep. public List Assemblies = new List (); @@ -62,6 +64,7 @@ public static LinkerConfiguration GetInstance (LinkContext context) if (!File.Exists (linker_file)) throw new FileNotFoundException ($"The custom linker file {linker_file} does not exist."); + Profile = new Profile (this); Application = new Application (this); Target = new Target (Application); CompilerFlags = new CompilerFlags (Target); diff --git a/tools/dotnet-linker/dotnet-linker.csproj b/tools/dotnet-linker/dotnet-linker.csproj index 49711f497134..180401cff87f 100644 --- a/tools/dotnet-linker/dotnet-linker.csproj +++ b/tools/dotnet-linker/dotnet-linker.csproj @@ -137,6 +137,9 @@ external\tools\linker\ApplyPreserveAttribute.cs + + external\tools\linker\ExceptionalSubStep.cs + external\tools\linker\MonoTouch.Tuner\Extensions.cs diff --git a/tools/linker/ExceptionalSubStep.cs b/tools/linker/ExceptionalSubStep.cs index 6bcc8346d09c..3fe8ab3c0c90 100644 --- a/tools/linker/ExceptionalSubStep.cs +++ b/tools/linker/ExceptionalSubStep.cs @@ -7,15 +7,40 @@ using Xamarin.Tuner; +#if NET +using Mono.Linker; +using Mono.Linker.Steps; +#endif + namespace Xamarin.Linker { public abstract class ExceptionalSubStep : BaseSubStep { protected DerivedLinkContext LinkContext { get { +#if NET + throw new NotImplementedException (); +#else return (DerivedLinkContext) base.context; +#endif + } + } + +#if NET + protected LinkContext context { + get { return Context; } + } + + protected LinkerConfiguration Configuration { + get { return LinkerConfiguration.GetInstance (Context); } + } + + protected Profile Profile { + get { + return Configuration.Profile; } } +#endif public override sealed void ProcessAssembly (AssemblyDefinition assembly) { From 482151eea71da3c06749d34c129548ec6c822894 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Fri, 28 Aug 2020 12:52:57 +0200 Subject: [PATCH 4/4] [dotnet-linker] Make PreserveSmartEnumConversionsStep active for type as well to work around a linker bug. Fixes this linker crash when building the link sdk test: ILLink : error IL1012: IL Linker has encountered an unexpected error. Please report the issue at https://github.com/mono/linker/issues [/Users/builder/jenkins/workspace/xamarin-macios-pr-builder/tests/xharness/tmp-test-dir/link sdk33/link sdk.csproj] Fatal error in IL Linker (TaskId:212) Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object. (TaskId:212) at Mono.Linker.Steps.SubStepsDispatcher.DispatchType(TypeDefinition type) (TaskId:212) at Mono.Linker.Steps.SubStepsDispatcher.BrowseTypes(Collection`1 types) (TaskId:212) at Mono.Linker.Steps.SubStepsDispatcher.BrowseAssemblies(IEnumerable`1 assemblies) (TaskId:212) at Mono.Linker.Steps.SubStepsDispatcher.Mono.Linker.Steps.IStep.Process(LinkContext context) (TaskId:212) at Mono.Linker.Pipeline.Process(LinkContext context) (TaskId:212) at Mono.Linker.Driver.Run(ILogger customLogger) (TaskId:212) at Mono.Linker.Driver.Main(String[] args) (TaskId:212) The command exited with code 134. (TaskId:212) Ref: https://github.com/mono/linker/issues/1458 --- .../MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs index 365280f38a1b..b1850d520dd2 100644 --- a/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs +++ b/tools/linker/MonoTouch.Tuner/PreserveSmartEnumConversionsSubStep.cs @@ -25,7 +25,10 @@ public class PreserveSmartEnumConversionsSubStep : ExceptionalSubStep public override SubStepTargets Targets { get { - return SubStepTargets.Method | SubStepTargets.Property; + return + SubStepTargets.Method + | SubStepTargets.Type // SubStepTargets.Type is only needed to work around a linker bug: https://github.com/mono/linker/issues/1458 + | SubStepTargets.Property; } }