1 //===- DWARFDebugRangeList.h ------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGRANGELIST_H 10 #define LLVM_DEBUGINFO_DWARF_DWARFDEBUGRANGELIST_H 11 12 #include "llvm/DebugInfo/DWARF/DWARFAddressRange.h" 13 #include <cstdint> 14 #include <vector> 15 16 namespace llvm { 17 18 class raw_ostream; 19 class DWARFDataExtractor; 20 namespace object { 21 struct SectionedAddress; 22 } 23 24 class DWARFDebugRangeList { 25 public: 26 struct RangeListEntry { 27 /// A beginning address offset. This address offset has the size of an 28 /// address and is relative to the applicable base address of the 29 /// compilation unit referencing this range list. It marks the beginning 30 /// of an address range. 31 uint64_t StartAddress; 32 /// An ending address offset. This address offset again has the size of 33 /// an address and is relative to the applicable base address of the 34 /// compilation unit referencing this range list. It marks the first 35 /// address past the end of the address range. The ending address must 36 /// be greater than or equal to the beginning address. 37 uint64_t EndAddress; 38 /// A section index this range belongs to. 39 uint64_t SectionIndex; 40 41 /// The end of any given range list is marked by an end of list entry, 42 /// which consists of a 0 for the beginning address offset 43 /// and a 0 for the ending address offset. isEndOfListEntryRangeListEntry44 bool isEndOfListEntry() const { 45 return (StartAddress == 0) && (EndAddress == 0); 46 } 47 48 /// A base address selection entry consists of: 49 /// 1. The value of the largest representable address offset 50 /// (for example, 0xffffffff when the size of an address is 32 bits). 51 /// 2. An address, which defines the appropriate base address for 52 /// use in interpreting the beginning and ending address offsets of 53 /// subsequent entries of the location list. 54 bool isBaseAddressSelectionEntry(uint8_t AddressSize) const; 55 }; 56 57 private: 58 /// Offset in .debug_ranges section. 59 uint64_t Offset; 60 uint8_t AddressSize; 61 std::vector<RangeListEntry> Entries; 62 63 public: DWARFDebugRangeList()64 DWARFDebugRangeList() { clear(); } 65 66 void clear(); 67 void dump(raw_ostream &OS) const; 68 Error extract(const DWARFDataExtractor &data, uint64_t *offset_ptr); getEntries()69 const std::vector<RangeListEntry> &getEntries() { return Entries; } 70 71 /// getAbsoluteRanges - Returns absolute address ranges defined by this range 72 /// list. Has to be passed base address of the compile unit referencing this 73 /// range list. 74 DWARFAddressRangesVector 75 getAbsoluteRanges(std::optional<object::SectionedAddress> BaseAddr) const; 76 }; 77 78 } // end namespace llvm 79 80 #endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGRANGELIST_H 81