Strip the ILLinkTrim.xml file from System.Private.Xml (#35547)
authorEric Erhardt <eric.erhardt@microsoft.com>
Fri, 1 May 2020 01:25:41 +0000 (20:25 -0500)
committerGitHub <noreply@github.com>
Fri, 1 May 2020 01:25:41 +0000 (20:25 -0500)
* Strip the ILLinkTrim.xml file from System.Private.Xml

The two methods being preserved in System.Private.Xml (CreateSqlReader and GenerateSerializer) are large, and are not necessary when linking a mobile app. These methods only need to be preserved when linking the shared framework. When a normal app is linked, the linker is able to figure out if the two methods are necessary.

Contributes to #35199

Fix #30912

* Respond to PR feedback

- Add PreserveDependencyAttribute to SqlXml to be explicit.
- Rename ILLinkTrim.xml to ILLinkTrim_LibraryBuild.xml when it shouldn't be embedded in the resulting assembly.

eng/illink.targets
src/libraries/System.Data.Common/src/System.Data.Common.csproj
src/libraries/System.Data.Common/src/System/Data/SQLTypes/SqlXml.cs
src/libraries/System.Private.Xml/src/ILLinkTrim.xml [deleted file]
src/libraries/System.Private.Xml/src/ILLinkTrim_LibraryBuild.xml [new file with mode: 0644]

index ea4989776ada7645fdc5369a71315e13ba13e101..6ac5e9ac2a1ee00d568eb072896e24a7265554ae 100644 (file)
@@ -29,6 +29,8 @@
     <ILLinkTrimOutputPath>$(IntermediateOutputPath)</ILLinkTrimOutputPath>
 
     <ILLinkTrimXml Condition="'$(ILLinkTrimXml)' == '' and Exists('$(MSBuildProjectDirectory)/ILLinkTrim.xml')">$(MSBuildProjectDirectory)/ILLinkTrim.xml</ILLinkTrimXml>
+    <!-- ILLinkTrim_LibraryBuild.xml files are only used during building the library, not an app. They shouldn't be embedded into the assembly. -->
+    <ILLinkTrimXmlLibraryBuild Condition="'$(ILLinkTrimXmlLibraryBuild)' == '' and Exists('$(MSBuildProjectDirectory)/ILLinkTrim_LibraryBuild.xml')">$(MSBuildProjectDirectory)/ILLinkTrim_LibraryBuild.xml</ILLinkTrimXmlLibraryBuild>
 
     <!-- if building a PDB, tell illink to rewrite the symbols file -->
     <ILLinkRewritePDBs Condition="'$(ILLinkRewritePDBs)' == '' and '$(DebugSymbols)' != 'false'">true</ILLinkRewritePDBs>
     </EmbeddedResource>
   </ItemGroup>
 
+  <ItemGroup Condition="'$(ILLinkTrimXmlLibraryBuild)' != ''">
+    <None Include="$(ILLinkTrimXmlLibraryBuild)" />
+  </ItemGroup>
+
   <!-- Custom binplacing for pre/post-trimming and reports that is useful for analysis 
        Must be enabled by setting BinPlaceILLinkTrimAssembly=true
   --> 
@@ -87,7 +93,9 @@
       <!-- keep types and members required by Debugger-related attributes -->
       <ILLinkArgs>$(ILLinkArgs) -v true</ILLinkArgs>
       <!-- don't remove the embedded root xml resource since ILLink may run again on the assembly -->
-      <ILLinkArgs>$(ILLinkArgs) --strip-descriptors false</ILLinkArgs>
+      <ILLinkArgs Condition="'$(ILLinkTrimXml)' != ''">$(ILLinkArgs) --strip-descriptors false</ILLinkArgs>
+      <!-- pass the non-embedded root xml file on the command line -->
+      <ILLinkArgs Condition="'$(ILLinkTrimXmlLibraryBuild)' != ''">$(ILLinkArgs) -x "$(ILLinkTrimXmlLibraryBuild)"</ILLinkArgs>
       <!-- ignore unresolved references -->
       <ILLinkArgs>$(ILLinkArgs) --skip-unresolved true</ILLinkArgs>
       <!-- keep interface implementations -->
index c30c770382051480aaef5d9729b27b5bfacebda8..a9583ce2d19146fbc209f944f4e43fa2366bfbe8 100644 (file)
     <Compile Include="System\Data\SQLTypes\SQLBytes.cs" />
     <Compile Include="System\Data\ProviderBase\DataReaderContainer.cs" />
     <Compile Include="System\Data\ProviderBase\SchemaMapping.cs" />
+    <Compile Include="$(CommonPath)System\Runtime\CompilerServices\PreserveDependencyAttribute.cs"
+             Link="Common\System\Runtime\CompilerServices\PreserveDependencyAttribute.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="System.Collections" />
index cb3efa48b6f7bf73764275b07b3e2c9767543558..76db4a101781570a7341fd87d2f1669d6ee886e9 100644 (file)
@@ -10,6 +10,7 @@ using System.Data.Common;
 using System.Diagnostics;
 using System.Text;
 using System.Reflection;
+using System.Runtime.CompilerServices;
 
 namespace System.Data.SqlTypes
 {
@@ -127,6 +128,7 @@ namespace System.Data.SqlTypes
 
         private static MethodInfo CreateSqlReaderMethodInfo
         {
+            [PreserveDependency("CreateSqlReader", "System.Xml.XmlReader", "System.Private.Xml")]
             get
             {
                 if (s_createSqlReaderMethodInfo == null)
diff --git a/src/libraries/System.Private.Xml/src/ILLinkTrim.xml b/src/libraries/System.Private.Xml/src/ILLinkTrim.xml
deleted file mode 100644 (file)
index 6dc4b78..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<linker>
-  <assembly fullname="System.Private.Xml">
-    <type fullname="System.Xml.XmlReader">
-      <!-- called via reflection from System.Data.Common.dll -->
-      <method name="CreateSqlReader" />
-    </type>
-    <type fullname="System.Xml.Serialization.XmlSerializer">
-      <!-- called via reflection from SGen tool -->
-      <method name="set_Mode" />
-      <method name="GenerateSerializer" />
-    </type>
-  </assembly>
-</linker>
\ No newline at end of file
diff --git a/src/libraries/System.Private.Xml/src/ILLinkTrim_LibraryBuild.xml b/src/libraries/System.Private.Xml/src/ILLinkTrim_LibraryBuild.xml
new file mode 100644 (file)
index 0000000..6dc4b78
--- /dev/null
@@ -0,0 +1,13 @@
+<linker>
+  <assembly fullname="System.Private.Xml">
+    <type fullname="System.Xml.XmlReader">
+      <!-- called via reflection from System.Data.Common.dll -->
+      <method name="CreateSqlReader" />
+    </type>
+    <type fullname="System.Xml.Serialization.XmlSerializer">
+      <!-- called via reflection from SGen tool -->
+      <method name="set_Mode" />
+      <method name="GenerateSerializer" />
+    </type>
+  </assembly>
+</linker>
\ No newline at end of file