diff options
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp')
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp index 8935f7143e48..75934f966bcd 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp +++ b/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp @@ -51,6 +51,7 @@ DWARFCompileUnit::DWARFCompileUnit(SymbolFileDWARF* dwarf2Data) : m_producer_version_major (0), m_producer_version_minor (0), m_producer_version_update (0), + m_language_type (eLanguageTypeUnknown), m_is_dwarf64 (false) { } @@ -68,6 +69,7 @@ DWARFCompileUnit::Clear() m_func_aranges_ap.reset(); m_user_data = NULL; m_producer = eProducerInvalid; + m_language_type = eLanguageTypeUnknown; m_is_dwarf64 = false; } @@ -444,6 +446,31 @@ DWARFCompileUnit::BuildAddressRangeTable (SymbolFileDWARF* dwarf2Data, } } + if (debug_aranges->IsEmpty()) + { + // We got nothing from the functions, maybe we have a line tables only + // situation. Check the line tables and build the arange table from this. + SymbolContext sc; + sc.comp_unit = dwarf2Data->GetCompUnitForDWARFCompUnit(this); + if (sc.comp_unit) + { + LineTable *line_table = sc.comp_unit->GetLineTable(); + + if (line_table) + { + LineTable::FileAddressRanges file_ranges; + const bool append = true; + const size_t num_ranges = line_table->GetContiguousFileAddressRanges (file_ranges, append); + for (uint32_t idx=0; idx<num_ranges; ++idx) + { + const LineTable::FileAddressRanges::Entry &range = file_ranges.GetEntryRef(idx); + debug_aranges->AppendRange(GetOffset(), range.GetRangeBase(), range.GetRangeEnd()); + printf ("0x%8.8x: [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", GetOffset(), range.GetRangeBase(), range.GetRangeEnd()); + } + } + } + } + // Keep memory down by clearing DIEs if this generate function // caused them to be parsed if (clear_dies) @@ -1042,6 +1069,35 @@ DWARFCompileUnit::GetProducerVersionUpdate() return m_producer_version_update; } +LanguageType +DWARFCompileUnit::LanguageTypeFromDWARF(uint64_t val) +{ + // Note: user languages between lo_user and hi_user + // must be handled explicitly here. + switch (val) + { + case DW_LANG_Mips_Assembler: + return eLanguageTypeMipsAssembler; + case 0x8e57: // FIXME: needs to be added to llvm + return eLanguageTypeExtRenderScript; + default: + return static_cast<LanguageType>(val); + } +} + +LanguageType +DWARFCompileUnit::GetLanguageType() +{ + if (m_language_type != eLanguageTypeUnknown) + return m_language_type; + + const DWARFDebugInfoEntry *die = GetCompileUnitDIEOnly(); + if (die) + m_language_type = LanguageTypeFromDWARF( + die->GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_language, 0)); + return m_language_type; +} + bool DWARFCompileUnit::IsDWARF64() const { |