示例#1
0
        private void AddNode(Architecture arch, SyntaxNode node)
        {
            string name          = SyntaxUtils.GetFullName(node, true);
            string fullSignature = GetFullSignature(node);

            if (!this.namesToInfos.TryGetValue(name, out var crossArchInfos))
            {
                crossArchInfos          = new List <CrossArchInfo>();
                this.namesToInfos[name] = crossArchInfos;
            }

            foreach (var info in crossArchInfos)
            {
                if (info.FullSignature == fullSignature)
                {
                    info.Arch |= arch;
                    return;
                }
            }

            var newInfo = new CrossArchInfo()
            {
                Arch = arch, FullSignature = fullSignature
            };

            crossArchInfos.Add(newInfo);
        }
        private void AddNode(Architecture arch, SyntaxNode node)
        {
            string name          = SyntaxUtils.GetFullName(node, true);
            string fullSignature = GetFullSignature(node);
            string altSignature  = string.Empty;

            if (arch == Architecture.X86 && node is StructDeclarationSyntax structNode)
            {
                var packing4AttrList =
                    SyntaxFactory.AttributeList(
                        SyntaxFactory.SingletonSeparatedList <AttributeSyntax>(
                            SyntaxFactory.Attribute(
                                SyntaxFactory.ParseName("StructLayout"),
                                SyntaxFactory.ParseAttributeArgumentList("(LayoutKind.Sequential, Pack = 4)"))));

                var tempNode = structNode.AddAttributeLists(packing4AttrList);
                altSignature = GetFullSignature(tempNode);
            }

            lock (this.namesToInfos)
            {
                if (!this.namesToInfos.TryGetValue(name, out var crossArchInfos))
                {
                    crossArchInfos          = new List <CrossArchInfo>();
                    this.namesToInfos[name] = crossArchInfos;
                }

                foreach (var info in crossArchInfos)
                {
                    if (info.FullSignature == fullSignature || info.FullSignature == altSignature)
                    {
                        info.Arch |= arch;
                        return;
                    }
                }

                var newInfo = new CrossArchInfo()
                {
                    Arch = arch, FullSignature = fullSignature
                };
                crossArchInfos.Add(newInfo);
            }
        }