internal static List ParseAllCommandLineInfos()

in src/BinaryParsers/ElfBinary/Dwarf/DwarfSymbolProvider.cs [110:196]


        internal static List<DwarfCompileCommandLineInfo> ParseAllCommandLineInfos(List<DwarfCompilationUnit> compilationUnits)
        {
            var returnValue = new List<DwarfCompileCommandLineInfo>();

            foreach (DwarfCompilationUnit compilationUnit in compilationUnits)
            {
                foreach (DwarfSymbol symbol in compilationUnit.Symbols)
                {
                    var info = new DwarfCompileCommandLineInfo();

                    symbol.Attributes.TryGetValue(DwarfAttribute.Name, out DwarfAttributeValue name);
                    info.FullName = (name == null
                        || name.Value == null
                        || name.Value.ToString().All(char.IsDigit)
                        || name.Value.ToString().Equals(ElfUtility.LongUnsignedInt, StringComparison.OrdinalIgnoreCase))
                        ? string.Empty
                        : name.Value.ToString();

                    symbol.Attributes.TryGetValue(DwarfAttribute.CompDir, out DwarfAttributeValue compDir);
                    info.CompileDirectory = (compDir == null
                        || compDir.Value == null
                        || compDir.Value.ToString().All(char.IsDigit)
                        || compDir.Value.ToString().Equals(ElfUtility.LongUnsignedInt, StringComparison.OrdinalIgnoreCase))
                        ? string.Empty
                        : compDir.Value.ToString();

                    try
                    {
                        info.FileName = Path.GetFileName(info.FullName);
                    }
                    catch (ArgumentException)
                    {
                        info.FileName = string.Empty;
                    }
                    info.Language = DwarfLanguage.Unknown;
                    info.Type = symbol.Tag;

                    if (symbol.Tag == DwarfTag.CompileUnit
                        && symbol.Attributes.TryGetValue(DwarfAttribute.Producer, out DwarfAttributeValue producer)
                        && symbol.Attributes.TryGetValue(DwarfAttribute.Language, out DwarfAttributeValue language))
                    {
                        DwarfLanguage dwarfLanguage;
                        if (Enum.TryParse(language.Value?.ToString(), out dwarfLanguage))
                        {
                            info.Language = dwarfLanguage;
                        }
                        info.CommandLine = producer.Value?.ToString();

                        if (info.Language != DwarfLanguage.C89
                            && info.Language != DwarfLanguage.C
                            && info.Language != DwarfLanguage.CPlusPlus
                            && info.Language != DwarfLanguage.C99
                            && info.Language != DwarfLanguage.CPlusPlus03
                            && info.Language != DwarfLanguage.CPlusPlus11
                            && info.Language != DwarfLanguage.C11
                            && info.Language != DwarfLanguage.CPlusPlus14)
                        {
                            continue;
                        }
                    }
                    else if (symbol.Tag == DwarfTag.Subprogram
                        && symbol.Attributes.TryGetValue(DwarfAttribute.LinkageName, out DwarfAttributeValue linkageName))
                    {
                        // No Language property for Subprogram
                        info.CommandLine = linkageName.Value?.ToString();
                    }
                    else
                    {
                        continue;
                    }

                    if (info.CommandLine != null
                        && (info.CommandLine.Equals(ElfUtility.LongUnsignedInt, StringComparison.OrdinalIgnoreCase)
                        || info.CommandLine.All(char.IsDigit)))
                    {
                        info.CommandLine = string.Empty;
                    }

                    if (info.CommandLine != null)
                    {
                        returnValue.Add(info);
                    }
                }
            }

            return returnValue;
        }