public static byte[] PerfMapV1SignatureHelper(IEnumerable <AssemblyInfo> inputAssemblies, TargetDetails details) { IEnumerable <AssemblyInfo> orderedInputs = inputAssemblies.OrderBy(asm => asm.Name, StringComparer.OrdinalIgnoreCase); List <byte> inputHash = new List <byte>(); foreach (AssemblyInfo inputAssembly in orderedInputs) { inputHash.AddRange(inputAssembly.Mvid.ToByteArray()); } PerfmapTokensForTarget targetTokens = TranslateTargetDetailsToPerfmapConstants(details); byte[] buffer = new byte[12]; if (!BitConverter.TryWriteBytes(buffer.AsSpan(0, sizeof(uint)), (uint)targetTokens.OperatingSystem) || !BitConverter.TryWriteBytes(buffer.AsSpan(4, sizeof(uint)), (uint)targetTokens.Architecture) || !BitConverter.TryWriteBytes(buffer.AsSpan(8, sizeof(uint)), (uint)targetTokens.Abi)) { throw new InvalidOperationException(); } if (!BitConverter.IsLittleEndian) { buffer.AsSpan(0, sizeof(uint)).Reverse(); buffer.AsSpan(4, sizeof(uint)).Reverse(); buffer.AsSpan(8, sizeof(uint)).Reverse(); } inputHash.AddRange(buffer); byte[] hash = MD5.HashData(inputHash.ToArray()); return(hash); }
private static void WritePerfMapV1Header(IEnumerable <AssemblyInfo> inputAssemblies, TargetDetails details, PerfMapWriter perfMapWriter) { byte[] signature = PerfMapV1SignatureHelper(inputAssemblies, details); // Make sure these get emitted in this order, other tools in the ecosystem like the symbol uploader and PerfView rely on this. // In particular, the order of it. Append only. string signatureFormatted = Convert.ToHexString(signature); PerfmapTokensForTarget targetTokens = TranslateTargetDetailsToPerfmapConstants(details); perfMapWriter.WriteLine(signatureFormatted, (uint)PerfMapPseudoRVAToken.OutputSignature, HeaderEntriesPseudoLength); perfMapWriter.WriteLine(CurrentFormatVersion.ToString(), (uint)PerfMapPseudoRVAToken.FormatVersion, HeaderEntriesPseudoLength); perfMapWriter.WriteLine(((uint)targetTokens.OperatingSystem).ToString(), (uint)PerfMapPseudoRVAToken.TargetOS, HeaderEntriesPseudoLength); perfMapWriter.WriteLine(((uint)targetTokens.Architecture).ToString(), (uint)PerfMapPseudoRVAToken.TargetArchitecture, HeaderEntriesPseudoLength); perfMapWriter.WriteLine(((uint)targetTokens.Abi).ToString(), (uint)PerfMapPseudoRVAToken.TargetABI, HeaderEntriesPseudoLength); }