From dfe9806bc0cae8cdf049d37955c8e7ccb1808064 Mon Sep 17 00:00:00 2001 From: Fan Yang Date: Tue, 30 Jan 2024 10:06:48 -0500 Subject: [PATCH] Save trimmed methods list to a file --- src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs b/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs index 6a25bd26168b9c..707d4bd8b9bc2f 100644 --- a/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs +++ b/src/tasks/MonoTargetsTasks/ILStrip/ILStrip.cs @@ -164,6 +164,7 @@ private bool TrimMethods(ITaskItem assemblyItem, string trimmedAssemblyFolder) } string trimmedAssemblyFilePath = ComputeTrimmedAssemblyPath(trimmedAssemblyFolder, assemblyFilePath); + string trimmedMethodListFilePath = trimmedAssemblyFilePath.Replace(".dll", ".txt"); if (File.Exists(trimmedAssemblyFilePath)) { if (IsInputNewerThanOutput(assemblyFilePath, trimmedAssemblyFilePath)) @@ -171,6 +172,7 @@ private bool TrimMethods(ITaskItem assemblyItem, string trimmedAssemblyFolder) Log.LogMessage(MessageImportance.Low, $"Re-trimming {assemblyFilePath} because {trimmedAssemblyFilePath} is older than {assemblyFilePath} ."); Log.LogMessage(MessageImportance.Low, $"Deleting {trimmedAssemblyFilePath} ."); File.Delete(trimmedAssemblyFilePath); + File.Delete(trimmedMethodListFilePath); } else { @@ -196,12 +198,13 @@ private bool TrimMethods(ITaskItem assemblyItem, string trimmedAssemblyFolder) return true; } + Dictionary rvaToName = new(); string? line = sr.ReadLine(); if (!string.IsNullOrEmpty(line)) { isTrimmed = true; - Dictionary methodBodyUses = ComputeMethodBodyUsage(mr, sr, line, methodTokenFile); - CreateTrimmedAssembly(peReader, trimmedAssemblyFilePath, fs, methodBodyUses); + Dictionary methodBodyUses = ComputeMethodBodyUsage(mr, sr, line, methodTokenFile, ref rvaToName); + CreateTrimmedAssembly(peReader, trimmedAssemblyFilePath, fs, methodBodyUses, rvaToName, trimmedMethodListFilePath); } var outAssemblyItem = isTrimmed ? GetTrimmedAssemblyItem(assemblyItem, trimmedAssemblyFilePath, assemblyFilePathArg) : assemblyItem; @@ -237,7 +240,7 @@ private static string ComputeGuid(MetadataReader mr) return mvid.ToString(); } - private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamReader sr, string? line, string methodTokenFile) + private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamReader sr, string? line, string methodTokenFile, ref Dictionary rvaToName) { Dictionary tokenToRva = new(); Dictionary methodBodyUses = new(); @@ -247,6 +250,7 @@ private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamRea int methodToken = MetadataTokens.GetToken(mr, mdefh); MethodDefinition mdef = mr.GetMethodDefinition(mdefh); int rva = mdef.RelativeVirtualAddress; + string methodName = mr.GetString(mdef.Name); tokenToRva.Add(methodToken, rva); @@ -258,6 +262,15 @@ private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamRea { methodBodyUses.Add(rva, 1); } + + if (rvaToName.TryGetValue(rva, out var _)) + { + rvaToName[rva] = rvaToName[rva] + ", " + methodName; + } + else + { + rvaToName.Add(rva, methodName); + } } do @@ -280,8 +293,10 @@ private Dictionary ComputeMethodBodyUsage(MetadataReader mr, StreamRea return methodBodyUses; } - private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFilePath, FileStream fs, Dictionary methodBodyUses) + private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFilePath, FileStream fs, Dictionary methodBodyUses, Dictionary rvaToName, string trimmedMethodListFilePath) { + List trimmedMethods = new(); + using FileStream os = File.Open(trimmedAssemblyFilePath, FileMode.Create); { fs.Position = 0; @@ -300,6 +315,7 @@ private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFile if (headerSize == 1) //Set code size to zero for TinyFormat SetCodeSizeToZeroForTiny(ref memStream, actualLoc); ZeroOutMethodBody(ref memStream, methodSize, actualLoc, headerSize); + trimmedMethods.Add(rvaToName[rva]); } else if (count < 0) { @@ -310,6 +326,9 @@ private void CreateTrimmedAssembly(PEReader peReader, string trimmedAssemblyFile memStream.Position = 0; memStream.CopyTo(os); } + + string trimmedMethodsStr = string.Join(Environment.NewLine, trimmedMethods.ToArray()); + File.WriteAllText(trimmedMethodListFilePath, trimmedMethodsStr); } private static int ComputeMethodSize(PEReader peReader, int rva) => peReader.GetMethodBody(rva).Size;