Example #1
0
        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);
        }
Example #2
0
        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);
        }