Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.
/ corefx Public archive

Commit

Permalink
Merge pull request #17825 from ericstj/ILLinkTrimAssembly
Browse files Browse the repository at this point in the history
Add ILLink to the build
  • Loading branch information
ericstj committed Apr 5, 2017
2 parents fb6eca6 + 145762c commit 1662528
Show file tree
Hide file tree
Showing 16 changed files with 280 additions and 9 deletions.
32 changes: 26 additions & 6 deletions Tools-Override/FrameworkTargeting.targets
Original file line number Diff line number Diff line change
Expand Up @@ -222,17 +222,24 @@
</PropertyGroup>

<Target Name="BinPlace"
DependsOnTargets="GetBinPlaceDirs;BinPlaceFiles;BinPlaceProps"
DependsOnTargets="GetBinPlaceConfiguration;BinPlaceFiles;BinPlaceProps"
AfterTargets="CopyFilesToOutputDirectory"
Condition="'$(EnableBinPlacing)' == 'true'" />

<Target Name="BinPlaceFiles"
Condition="'@(BinPlaceDir)' != ''"
DependsOnTargets="GetBinPlaceItems" >
DependsOnTargets="GetBinPlaceItems"
Inputs="@(BinPlaceDir);%(BinPlaceDir.ItemName)"
Outputs="unused" >

<PropertyGroup>
<_BinPlaceItemName>%(BinPlaceDir.ItemName)</_BinPlaceItemName>
<_BinPlaceItemName Condition="'$(_BinPlaceItemName)' == ''">BinPlaceItem</_BinPlaceItemName>
</PropertyGroup>

<Message Importance="low" Text="BinPlaceDir: @(BinPlaceDir)" />

<Copy SourceFiles="@(BinPlaceItem)"
<Copy SourceFiles="@($(_BinPlaceItemName))"
DestinationFolder="%(BinPlaceDir.Identity)"
SkipUnchangedFiles="true"
OverwriteReadOnlyFiles="true"
Expand Down Expand Up @@ -284,7 +291,7 @@
</Target>

<UsingTask TaskName="FindBestConfigurations" AssemblyFile="$(CoreFxToolsTaskDir)CoreFx.Tools.dll"/>
<Target Name="GetBinPlaceDirs" DependsOnTargets="GetBuildConfigurations">
<Target Name="GetBinPlaceConfiguration" DependsOnTargets="GetBuildConfigurations">
<!-- find which, if any, build configuration of this project is best
for each binplace configuration -->
<FindBestConfigurations Properties="@(Property)"
Expand All @@ -297,12 +304,25 @@
<ItemGroup>
<_currentBinPlaceConfigurations Include="@(_bestBinlaceConfigurations)" Condition="'%(Identity)' == '$(Configuration)' OR '%(Identity)-$(ConfigurationGroup)' == '$(Configuration)'" />

<BinPlaceDir Condition="'$(BinPlaceRuntime)' == 'true'" Include="%(_currentBinPlaceConfigurations.RuntimePath)" />
<BinPlaceDir Condition="'$(BinPlaceRef)' == 'true'" Include="%(_currentBinPlaceConfigurations.RefPath)" />
<BinPlaceDir Condition="'$(BinPlaceRuntime)' == 'true'" Include="@(_currentBinPlaceConfigurations->'%(RuntimePath)')" />
<BinPlaceDir Condition="'$(BinPlaceRef)' == 'true'" Include="@(_currentBinPlaceConfigurations->'%(RefPath)')" />

<PackageFileDir Condition="'$(BinPlaceRuntime)' == 'true'" Include="%(_currentBinPlaceConfigurations.PackageFileRuntimePath)" />
<PackageFileDir Condition="'$(BinPlaceRef)' == 'true'" Include="%(_currentBinPlaceConfigurations.PackageFileRefPath)" />

<!-- permit BinplaceConfigurations to define SetProperties metadata,
set those properties when BinplaceConfiguration is active -->
<_binplacePropertyTuples Include="%(_currentBinPlaceConfigurations.SetProperties)" />

<_binplaceSetProperty Condition="'%(_binplacePropertyTuples.Identity)' != ''"
Include="$([System.String]::new('%(_binplacePropertyTuples.Identity)').Split('=')[0])">
<Value>$([System.String]::new('%(_binplacePropertyTuples.Identity)').Split('=')[1])</Value>
</_binplaceSetProperty>
</ItemGroup>

<CreateProperty Value="%(_binplaceSetProperty.Value)" Condition="'@(_binplaceSetProperty)' != ''" >
<Output TaskParameter="Value" PropertyName="%(_binplaceSetProperty.Identity)" />
</CreateProperty>
</Target>

<!-- Incremental clean only cleans paths under Intermediate or OutDir, handle additional paths -->
Expand Down
3 changes: 3 additions & 0 deletions dir.targets
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
<PackageFileRefPath Condition="'$(IsNETCoreAppRef)' == 'true'">$(NETCoreAppPackageRefPath)</PackageFileRefPath>
<PackageFileRuntimePath>$(NETCoreAppPackageRuntimePath)</PackageFileRuntimePath>
<RuntimePath Condition="'$(BinPlaceNETCoreAppPackage)' == 'true'">$(NETCoreAppPackageRuntimePath)\..\runtime</RuntimePath>
<!-- enable trimming for any runtime project that's part of the shared framework and hasn't already set ILLinkTrimAssembly -->
<SetProperties Condition="'$(BinPlaceRuntime)' == 'true' AND '$(ILLinkTrimAssembly)' == ''">ILLinkTrimAssembly=true</SetProperties>
</BinPlaceConfiguration>
<BinPlaceConfiguration Condition="'$(IsUAP)' == 'true' AND '$(BuildingUAPVertical)' == 'true'" Include="uap-$(_bc_OSGroup)">
<PackageFileRefPath Condition="'$(IsUAPRef)'=='true'">$(UAPPackageRefPath)</PackageFileRefPath>
Expand Down Expand Up @@ -107,6 +109,7 @@
<Import Condition="Exists('$(MSBuildThisFileDirectory)..\open.targets')" Project="$(MSBuildThisFileDirectory)..\open.targets" />

<Import Project="$(MSBuildThisFileDirectory)referenceFromRuntime.targets" />
<Import Project="$(MSBuildThisFileDirectory)illink.targets" />

<PropertyGroup>
<!-- We don't use any of MSBuild's resolution logic for resolving the framework, so just set these two properties to any folder that exists to skip
Expand Down
16 changes: 16 additions & 0 deletions external/ILLink/ILLink.depproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
<PropertyGroup>
<NuGetTargetMoniker>.NETCoreApp,Version=v1.1</NuGetTargetMoniker>
<OutputPath>$(ToolsDir)ILLink</OutputPath>
<IsRuntimeAssembly>false</IsRuntimeAssembly>
</PropertyGroup>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
<Target Name="IncludeAllFiles"
AfterTargets="ResolveNuGetPackages">
<ItemGroup>
<ReferenceCopyLocalPaths Include="%(ReferenceCopyLocalPaths.RootDir)%(ReferenceCopyLocalPaths.Directory)\*.*" />
</ItemGroup>
</Target>
</Project>
14 changes: 14 additions & 0 deletions external/ILLink/project.json.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"dependencies": {
"Microsoft.NETCore.ILLink": {
"version": "0.1.8-preview",
"exclude": "compile"
}
},
"frameworks": {
"netcoreapp1.1": { }
},
"runtimes": {
"{RID}": {}
}
}
1 change: 1 addition & 0 deletions external/dir.proj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<Project Include="portable\portable.depproj" />
<Project Include="uapaotredist/uapaotredist.depproj" />
<Project Include="ilasm/ilasm.depproj" />
<Project Condition="'$(ILLinkTrimAssembly)' != 'false'" Include="ILLink/ILLink.depproj" />
</ItemGroup>

<Import Project="../dir.traversal.targets" />
Expand Down
147 changes: 147 additions & 0 deletions illink.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetsTriggeredByCompilation>
$(TargetsTriggeredByCompilation);
_SetILLinkTrimAssembly;
ILLinkTrimAssembly
</TargetsTriggeredByCompilation>
</PropertyGroup>

<!-- Inputs and outputs of ILLinkTrimAssembly -->
<PropertyGroup>
<ILLinkToolPath Condition="'$(ILLinkToolPath)' == ''">$(ToolsDir)ILLink/illink.dll</ILLinkToolPath>
<ILLinkTrimAssemblyPath>$(IntermediateOutputPath)$(TargetName)$(TargetExt)</ILLinkTrimAssemblyPath>
<ILLinkTrimAssemblySymbols>$(IntermediateOutputPath)$(TargetName).pdb</ILLinkTrimAssemblySymbols>
<ILLinkTrimInputPath>$(IntermediateOutputPath)PreTrim/</ILLinkTrimInputPath>
<ILLinkTrimInputAssembly>$(ILLinkTrimInputPath)$(TargetName)$(TargetExt)</ILLinkTrimInputAssembly>
<ILLinkTrimInputSymbols>$(ILLinkTrimInputPath)$(TargetName).pdb</ILLinkTrimInputSymbols>
<ILLinkTrimOutputPath>$(IntermediateOutputPath)</ILLinkTrimOutputPath>

<ILLinkTrimXml Condition="'$(ILLinkTrimXml)' == '' AND Exists('$(MSBuildProjectDirectory)/ILLinkTrim.xml')">$(MSBuildProjectDirectory)/ILLinkTrim.xml</ILLinkTrimXml>

<!-- if building a PDB, tell illink to rewrite the symbols file -->
<ILLinkRewritePDBs Condition="'$(ILLinkRewritePDBs)' == '' AND '$(DebugSymbols)' != 'false'">true</ILLinkRewritePDBs>
</PropertyGroup>

<!-- Custom binplacing for pre/post-trimming and reports that is useful for analysis
Must be enabled by setting BinPlaceILLinkTrimAssembly=true
-->
<ItemGroup Condition="'$(BinPlaceILLinkTrimAssembly)' == 'true'">
<BinPlaceConfiguration Include="$(BuildConfiguration)">
<RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/trimmed</RuntimePath>
<ItemName>TrimmedItem</ItemName>
</BinPlaceConfiguration>
<BinPlaceConfiguration Include="$(BuildConfiguration)">
<RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/reports</RuntimePath>
<ItemName>TrimmingReport</ItemName>
</BinPlaceConfiguration>
<BinPlaceConfiguration Include="$(BuildConfiguration)">
<RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/pretrimmed</RuntimePath>
<ItemName>PreTrimmedItem</ItemName>
</BinPlaceConfiguration>
</ItemGroup>

<Target Name="_SetILLinkTrimAssembly"
Condition="'$(ILLinkTrimAssembly)' == ''"
DependsOnTargets="GetBinPlaceConfiguration">
<PropertyGroup>
<!-- Currently ILLink cannot handle type projections from Windows.winmd, disable if the project references it -->
<ILLinkTrimAssembly Condition="'%(ReferencePath.FileName)%(ReferencePath.Extension)' == 'Windows.winmd'">false</ILLinkTrimAssembly>
</PropertyGroup>
</Target>

<!-- ILLinkTrimAssembly
Examines the "input assembly" for IL that is unreachable from public API and trims that,
rewriting the assembly to an "output assembly"
-->
<Target Name="ILLinkTrimAssembly" Condition="'$(ILLinkTrimAssembly)' == 'true'" DependsOnTargets="EnsureBuildToolsRuntime">
<ItemGroup>
<!-- currently only directories are supported by ILLink. -->
<_ILLinkReferenceDirectory Include="%(ReferencePath.RootDir)%(ReferencePath.Directory)" />
</ItemGroup>

<PropertyGroup>
<!-- Root public entry points in this assembly.
Currently this must be passed as name and directory.
Directory of this assembly *must* occur before directory of references. -->
<ILLinkArgs>$(ILLinkArgs) -r $(TargetName)</ILLinkArgs>
<ILLinkArgs>$(ILLinkArgs) -d $(ILLinkTrimInputPath)</ILLinkArgs>
<!-- directories to examine for assembly dependencies -->
<ILLinkArgs>$(ILLinkArgs) @(_ILLinkReferenceDirectory->'-d %(Identity)', ' ')</ILLinkArgs>
<!-- don't trim anything that's defined in core assemblies -->
<ILLinkArgs>$(ILLinkArgs) -c skip</ILLinkArgs>
<ILLinkArgs>$(ILLinkArgs) -p skip netstandard</ILLinkArgs>
<!-- keep type-forward assemblies (facades) -->
<ILLinkArgs>$(ILLinkArgs) -t</ILLinkArgs>
<ILLinkArgs>$(ILLinkArgs) -out $(ILLinkTrimOutputPath)</ILLinkArgs>
<ILLinkArgs Condition="'$(ILLinkTrimXml)' != ''">$(ILLinkArgs) -x $(ILLinkTrimXml)</ILLinkArgs>
<ILLinkArgs Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')">$(ILLinkArgs) -b true</ILLinkArgs>
</PropertyGroup>

<MakeDir Directories="$(ILLinkTrimInputPath)" />

<!-- Move the assembly into a subdirectory for ILLink -->
<Move SourceFiles="$(ILLinkTrimAssemblyPath)"
DestinationFolder="$(ILLinkTrimInputPath)"
/>

<!-- Move the PDB into a subdirectory for ILLink if we are rewriting PDBs -->
<Move SourceFiles="$(ILLinkTrimAssemblySymbols)"
DestinationFolder="$(ILLinkTrimInputPath)"
Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')"
/>

<PropertyGroup>
<ILLinkCmd>$(OverrideToolHost) "$(ILLinkToolPath)"</ILLinkCmd>
</PropertyGroup>

<Exec Command="$(ILLinkCmd) $(ILLinkArgs)" />
</Target>

<!-- ILLink reporting.
Only enabled when developer specifies a path to the AsmDiff tool with property AsmDiffCmd.
EG: AsmDiffCmd=d:\tools\asmdiff\asmdiff.exe
This is necessary until the AsmDiff tool is ported to .NET Core. -->
<Target Name="_CreateILLinkTrimAssemblyReports"
AfterTargets="ILLinkTrimAssembly"
Condition="'$(AsmDiffCmd)' != ''">
<PropertyGroup>
<AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimInputAssembly)</AsmDiffArgs>
<AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimAssemblyPath)</AsmDiffArgs>
<AsmDiffArgs>$(AsmDiffArgs) -includePrivateApis -includeInternalApis -alwaysDiffMembers -diffAttributes</AsmDiffArgs>

<AsmDiffReport>$(IntermediateOutputPath)$(TargetName).diff.html</AsmDiffReport>
<AsmDiffReportArgs>$(AsmDiffArgs) -out:$(AsmDiffReport)</AsmDiffReportArgs>
<AsmDiffReportArgs>$(AsmDiffReportArgs) -unchanged -changed -added -removed</AsmDiffReportArgs>

<AsmDiffList>$(IntermediateOutputPath)$(TargetName).diff.csv</AsmDiffList>
<AsmDiffListArgs>$(AsmDiffArgs) -out:$(AsmDiffList)</AsmDiffListArgs>
<AsmDiffListArgs>$(AsmDiffListArgs) -unchanged -changed -added -removed </AsmDiffListArgs>
<AsmDiffListArgs>$(AsmDiffListArgs) -diffWriter:CSV</AsmDiffListArgs>
</PropertyGroup>

<Exec Command="$(AsmDiffCmd) $(AsmDiffReportArgs)" />
<Message Text="Assembly trimming diff: $(AsmDiffReport)" />
<Exec Command="$(AsmDiffCmd) $(AsmDiffListArgs)" />
<Message Text="Assembly trimming report: $(AsmDiffList)" />
</Target>

<!-- Similar to _CheckForCompileOutputs and runs in the same places,
always set these even if compile didn't run. -->
<Target Name="_CheckForILLinkTrimAssemblyOutputs"
BeforeTargets="CopyFilesToOutputDirectory;_CleanGetCurrentAndPriorFileWrites"
Condition="'$(ILLinkTrimAssembly)' == 'true'">
<ItemGroup>
<PreTrimmedItem Condition="Exists('$(ILLinkTrimInputAssembly)')" Include="$(ILLinkTrimInputAssembly)" />
<PreTrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimInputSymbols)')" Include="$(ILLinkTrimInputSymbols)" />
<FileWrites Include="@(PreTrimmedItem)" />

<TrimmedItem Condition="Exists('$(ILLinkTrimAssemblyPath)')" Include="$(ILLinkTrimAssemblyPath)" />
<TrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')" Include="$(ILLinkTrimAssemblySymbols)" />

<TrimmingReport Condition="Exists('$(AsmDiffReport)')" Include="$(AsmDiffReport)" />
<TrimmingReport Condition="Exists('$(AsmDiffList)')" Include="$(AsmDiffList)" />
</ItemGroup>
</Target>
</Project>
13 changes: 13 additions & 0 deletions src/System.Diagnostics.DiagnosticSource/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<linker>
<assembly fullname="System.Diagnostics.DiagnosticSource">
<type fullname="System.Diagnostics.DiagnosticSourceEventSource">
<!-- DiagnosticSourceEventSource calls these methods through reflection based on strings passed from user code -->
<method name="Activity1Start" />
<method name="Activity1Stop" />
<method name="Activity2Start" />
<method name="Activity2Stop" />
<method name="RecursiveActivity1Start" />
<method name="RecursiveActivity1Stop" />
</type>
</assembly>
</linker>
8 changes: 8 additions & 0 deletions src/System.Linq.Expressions/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<linker>
<assembly fullname="System.Linq.Expressions">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda">
<!-- required by debugger -->
<method name="get_DebugView" />
</type>
</assembly>
</linker>
8 changes: 8 additions & 0 deletions src/System.Linq/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<linker>
<assembly fullname="System.Linq">
<!-- required by debugger, see comment in System/Linq/DebugView.cs -->
<type fullname="System.Linq.SystemCore_EnumerableDebugView" />
<type fullname="System.Linq.SystemCore_EnumerableDebugView`1" />
<type fullname="System.Linq.SystemCore_EnumerableDebugViewEmptyException" />
</assembly>
</linker>
6 changes: 6 additions & 0 deletions src/System.Net.Http/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<linker>
<assembly fullname="System.Net.Http">
<!-- Anonymous types are used with DiagnosticSource logging and subscribers reflect over those, calling their public getters. -->
<type fullname="*f__AnonymousType*" />
</assembly>
</linker>
6 changes: 6 additions & 0 deletions src/System.Net.NetworkInformation/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<linker>
<assembly fullname="System.Net.NetworkInformation">
<!-- NetEventSource isn't used by this assembly but tests check for its presence -->
<type fullname="System.Net.NetEventSource" />
</assembly>
</linker>
6 changes: 6 additions & 0 deletions src/System.Net.Ping/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<linker>
<assembly fullname="System.Net.Ping">
<!-- NetEventSource isn't used by this assembly but tests check for its presence -->
<type fullname="System.Net.NetEventSource" />
</assembly>
</linker>
12 changes: 12 additions & 0 deletions src/System.Net.Security/src/ILLinkTrim.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<linker>
<assembly fullname="System.Net.Security">
<type fullname="System.Net.NTAuthentication">
<!-- Called through reflection by System.Net.Mail tests -->
<method name="GetOutgoingBlob" />
<method name="MakeSignature" />
<method name="VerifySignature" />
</type>
<!-- required by tests -->
<type fullname="System.Net.NetEventSource" />
</assembly>
</linker>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<linker>
<assembly fullname="System.Private.DataContractSerialization">
<type fullname="System.Runtime.Serialization.DataContractSerializer">
<!-- called through reflection by tests -->
<method name="set_Option" />
</type>
</assembly>
</linker>
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,5 @@
<Compile Include="System.Runtime.CompilerServices.Unsafe.il" />
<Reference Include="System.Runtime" />
</ItemGroup>
<Target Name="RunAfterCoreCompile" AfterTargets="CoreCompile">
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''" />
</Target>
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
</Project>
6 changes: 6 additions & 0 deletions src/Tools/dir.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\dir.targets" />

<!-- this depends on the tasks and targets that we're building -->
<Target Name="GetBinPlaceConfiguration" />
</Project>

0 comments on commit 1662528

Please sign in to comment.