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); } }