1 //===- DWARFDebugAranges.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_DWARFDEBUGARANGES_H 10 #define LLVM_DEBUGINFO_DWARFDEBUGARANGES_H 11 12 #include "llvm/ADT/DenseSet.h" 13 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" 14 #include <cstdint> 15 #include <vector> 16 17 namespace llvm { 18 19 class DWARFContext; 20 21 class DWARFDebugAranges { 22 public: 23 void generate(DWARFContext *CTX); 24 uint64_t findAddress(uint64_t Address) const; 25 26 private: 27 void clear(); 28 void extract(DWARFDataExtractor DebugArangesData, 29 function_ref<void(Error)> RecoverableErrorHandler); 30 31 /// Call appendRange multiple times and then call construct. 32 void appendRange(uint64_t CUOffset, uint64_t LowPC, uint64_t HighPC); 33 void construct(); 34 35 struct Range { 36 explicit Range(uint64_t LowPC, uint64_t HighPC, uint64_t CUOffset) 37 : LowPC(LowPC), Length(HighPC - LowPC), CUOffset(CUOffset) {} 38 39 void setHighPC(uint64_t HighPC) { 40 if (HighPC == -1ULL || HighPC <= LowPC) 41 Length = 0; 42 else 43 Length = HighPC - LowPC; 44 } 45 46 uint64_t HighPC() const { 47 if (Length) 48 return LowPC + Length; 49 return -1ULL; 50 } 51 52 bool operator<(const Range &other) const { 53 return LowPC < other.LowPC; 54 } 55 56 uint64_t LowPC; /// Start of address range. 57 uint64_t Length; /// End of address range (not including this address). 58 uint64_t CUOffset; /// Offset of the compile unit or die. 59 }; 60 61 struct RangeEndpoint { 62 uint64_t Address; 63 uint64_t CUOffset; 64 bool IsRangeStart; 65 66 RangeEndpoint(uint64_t Address, uint64_t CUOffset, bool IsRangeStart) 67 : Address(Address), CUOffset(CUOffset), IsRangeStart(IsRangeStart) {} 68 69 bool operator<(const RangeEndpoint &Other) const { 70 return Address < Other.Address; 71 } 72 }; 73 74 using RangeColl = std::vector<Range>; 75 using RangeCollIterator = RangeColl::const_iterator; 76 77 std::vector<RangeEndpoint> Endpoints; 78 RangeColl Aranges; 79 DenseSet<uint64_t> ParsedCUOffsets; 80 }; 81 82 } // end namespace llvm 83 84 #endif // LLVM_DEBUGINFO_DWARFDEBUGARANGES_H 85