|
13 | 13 | #include "lldb/Utility/LLDBAssert.h" |
14 | 14 | #include "lldb/Utility/StreamString.h" |
15 | 15 | #include "lldb/Utility/Timer.h" |
| 16 | +#include "llvm/DebugInfo/DWARF/DWARFAddressRange.h" |
16 | 17 | #include "llvm/DebugInfo/DWARF/DWARFDebugAbbrev.h" |
17 | 18 | #include "llvm/DebugInfo/DWARF/DWARFDebugLoc.h" |
| 19 | +#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" |
18 | 20 | #include "llvm/Object/Error.h" |
19 | 21 |
|
20 | 22 | #include "DWARFCompileUnit.h" |
@@ -1029,43 +1031,49 @@ DWARFUnit::GetStringOffsetSectionItem(uint32_t index) const { |
1029 | 1031 |
|
1030 | 1032 | llvm::Expected<DWARFRangeList> |
1031 | 1033 | DWARFUnit::FindRnglistFromOffset(dw_offset_t offset) { |
| 1034 | + llvm::DWARFAddressRangesVector llvm_ranges; |
1032 | 1035 | if (GetVersion() <= 4) { |
1033 | | - const DWARFDebugRanges *debug_ranges = m_dwarf.GetDebugRanges(); |
1034 | | - if (!debug_ranges) |
1035 | | - return llvm::make_error<llvm::object::GenericBinaryError>( |
1036 | | - "No debug_ranges section"); |
1037 | | - return debug_ranges->FindRanges(this, offset); |
| 1036 | + llvm::DWARFDataExtractor data = |
| 1037 | + m_dwarf.GetDWARFContext().getOrLoadRangesData().GetAsLLVMDWARF(); |
| 1038 | + data.setAddressSize(m_header.getAddressByteSize()); |
| 1039 | + |
| 1040 | + llvm::DWARFDebugRangeList list; |
| 1041 | + if (llvm::Error e = list.extract(data, &offset)) |
| 1042 | + return e; |
| 1043 | + llvm_ranges = list.getAbsoluteRanges( |
| 1044 | + llvm::object::SectionedAddress{GetBaseAddress()}); |
| 1045 | + } else { |
| 1046 | + if (!GetRnglistTable()) |
| 1047 | + return llvm::createStringError(std::errc::invalid_argument, |
| 1048 | + "missing or invalid range list table"); |
| 1049 | + |
| 1050 | + llvm::DWARFDataExtractor data = GetRnglistData().GetAsLLVMDWARF(); |
| 1051 | + |
| 1052 | + // As DW_AT_rnglists_base may be missing we need to call setAddressSize. |
| 1053 | + data.setAddressSize(m_header.getAddressByteSize()); |
| 1054 | + auto range_list_or_error = GetRnglistTable()->findList(data, offset); |
| 1055 | + if (!range_list_or_error) |
| 1056 | + return range_list_or_error.takeError(); |
| 1057 | + |
| 1058 | + llvm::Expected<llvm::DWARFAddressRangesVector> expected_llvm_ranges = |
| 1059 | + range_list_or_error->getAbsoluteRanges( |
| 1060 | + llvm::object::SectionedAddress{GetBaseAddress()}, |
| 1061 | + GetAddressByteSize(), [&](uint32_t index) { |
| 1062 | + uint32_t index_size = GetAddressByteSize(); |
| 1063 | + dw_offset_t addr_base = GetAddrBase(); |
| 1064 | + lldb::offset_t offset = |
| 1065 | + addr_base + static_cast<lldb::offset_t>(index) * index_size; |
| 1066 | + return llvm::object::SectionedAddress{ |
| 1067 | + m_dwarf.GetDWARFContext().getOrLoadAddrData().GetMaxU64( |
| 1068 | + &offset, index_size)}; |
| 1069 | + }); |
| 1070 | + if (!expected_llvm_ranges) |
| 1071 | + return expected_llvm_ranges.takeError(); |
| 1072 | + llvm_ranges = std::move(*expected_llvm_ranges); |
1038 | 1073 | } |
1039 | 1074 |
|
1040 | | - if (!GetRnglistTable()) |
1041 | | - return llvm::createStringError(std::errc::invalid_argument, |
1042 | | - "missing or invalid range list table"); |
1043 | | - |
1044 | | - llvm::DWARFDataExtractor data = GetRnglistData().GetAsLLVMDWARF(); |
1045 | | - |
1046 | | - // As DW_AT_rnglists_base may be missing we need to call setAddressSize. |
1047 | | - data.setAddressSize(m_header.getAddressByteSize()); |
1048 | | - auto range_list_or_error = GetRnglistTable()->findList(data, offset); |
1049 | | - if (!range_list_or_error) |
1050 | | - return range_list_or_error.takeError(); |
1051 | | - |
1052 | | - llvm::Expected<llvm::DWARFAddressRangesVector> llvm_ranges = |
1053 | | - range_list_or_error->getAbsoluteRanges( |
1054 | | - llvm::object::SectionedAddress{GetBaseAddress()}, |
1055 | | - GetAddressByteSize(), [&](uint32_t index) { |
1056 | | - uint32_t index_size = GetAddressByteSize(); |
1057 | | - dw_offset_t addr_base = GetAddrBase(); |
1058 | | - lldb::offset_t offset = |
1059 | | - addr_base + static_cast<lldb::offset_t>(index) * index_size; |
1060 | | - return llvm::object::SectionedAddress{ |
1061 | | - m_dwarf.GetDWARFContext().getOrLoadAddrData().GetMaxU64( |
1062 | | - &offset, index_size)}; |
1063 | | - }); |
1064 | | - if (!llvm_ranges) |
1065 | | - return llvm_ranges.takeError(); |
1066 | | - |
1067 | 1075 | DWARFRangeList ranges; |
1068 | | - for (const llvm::DWARFAddressRange &llvm_range : *llvm_ranges) { |
| 1076 | + for (const llvm::DWARFAddressRange &llvm_range : llvm_ranges) { |
1069 | 1077 | ranges.Append(DWARFRangeList::Entry(llvm_range.LowPC, |
1070 | 1078 | llvm_range.HighPC - llvm_range.LowPC)); |
1071 | 1079 | } |
|
0 commit comments