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