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_DWARF_DWARFDEBUGARANGES_H
10 #define LLVM_DEBUGINFO_DWARF_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_DWARF_DWARFDEBUGARANGES_H
85