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