[linker] Support linker descriptor files embedded in the assemblies being linked.
authorRadek Doulik <rodo@xamarin.com>
Thu, 28 May 2015 19:30:41 +0000 (21:30 +0200)
committerRadek Doulik <rodo@xamarin.com>
Sun, 19 Jul 2015 08:40:14 +0000 (10:40 +0200)
[merged from monodroid by rodo]

commit 3e19b22eb24ff9faeebe1ace7461d8f91f807041
Author: Alex Rønne Petersen <alexrp@xamarin.com>
Date:   Mon Jul 1 15:34:26 2013 +0200

    This is in addition to those files that are already embedded in the linker assembly
    itself (such as mscorlib.xml). People can use this feature to tell the linker that
    certain methods/fields/types must be kept if a particular assembly is being referenced
    by embedding a descriptor file in it.

mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs

index 08761871fd6c2ce4e517009daf8b127357828edf..47864f7917e973df65dbfe8d8c825e0a014d8895 100644 (file)
@@ -26,6 +26,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.Linq;
 using System.IO;
 using System.Reflection;
 using System.Xml.XPath;
@@ -49,6 +50,15 @@ namespace Mono.Linker.Steps {
 
                                Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetResolveStep (name));
                        }
+
+                       foreach (var rsc in Context.GetAssemblies ()
+                                                               .SelectMany (asm => asm.Modules)
+                                                               .SelectMany (mod => mod.Resources)
+                                                               .Where (res => res.ResourceType == ResourceType.Embedded)
+                                                               .Where (res => IsReferenced (GetAssemblyName (res.Name)))
+                                                               .Cast<EmbeddedResource> ()) {
+                               Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetExternalResolveStep (rsc));
+                       }
                }
 
                static string GetAssemblyName (string descriptor)
@@ -69,11 +79,23 @@ namespace Mono.Linker.Steps {
                        return false;
                }
 
+               static ResolveFromXmlStep GetExternalResolveStep (EmbeddedResource resource)
+               {
+                       return new ResolveFromXmlStep (GetExternalDescriptor (resource));
+               }
+
                static ResolveFromXmlStep GetResolveStep (string descriptor)
                {
                        return new ResolveFromXmlStep (GetDescriptor (descriptor));
                }
 
+               static XPathDocument GetExternalDescriptor (EmbeddedResource resource)
+               {
+                       using (var sr = new StreamReader (resource.GetResourceStream ())) {
+                               return new XPathDocument (new StringReader (sr.ReadToEnd ()));
+                       }
+               }
+
                static XPathDocument GetDescriptor (string descriptor)
                {
                        using (StreamReader sr = new StreamReader (GetResource (descriptor))) {