Recommit [NFC] Better encapsulation of llvm::Optional Storage
[llvm-complete.git] / include / llvm / DebugInfo / DWARF / DWARFDebugAranges.h
blob6d3af24f90a848124a64ac94ef43af6f211caa57
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 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_DEBUGINFO_DWARFDEBUGARANGES_H
10 #define LLVM_DEBUGINFO_DWARFDEBUGARANGES_H
12 #include "llvm/ADT/DenseSet.h"
13 #include "llvm/Support/DataExtractor.h"
14 #include <cstdint>
15 #include <vector>
17 namespace llvm {
19 class DWARFContext;
21 class DWARFDebugAranges {
22 public:
23 void generate(DWARFContext *CTX);
24 uint32_t findAddress(uint64_t Address) const;
26 private:
27 void clear();
28 void extract(DataExtractor DebugArangesData);
30 /// Call appendRange multiple times and then call construct.
31 void appendRange(uint32_t CUOffset, uint64_t LowPC, uint64_t HighPC);
32 void construct();
34 struct Range {
35 explicit Range(uint64_t LowPC = -1ULL, uint64_t HighPC = -1ULL,
36 uint32_t CUOffset = -1U)
37 : LowPC(LowPC), Length(HighPC - LowPC), CUOffset(CUOffset) {}
39 void setHighPC(uint64_t HighPC) {
40 if (HighPC == -1ULL || HighPC <= LowPC)
41 Length = 0;
42 else
43 Length = HighPC - LowPC;
46 uint64_t HighPC() const {
47 if (Length)
48 return LowPC + Length;
49 return -1ULL;
52 bool containsAddress(uint64_t Address) const {
53 return LowPC <= Address && Address < HighPC();
56 bool operator<(const Range &other) const {
57 return LowPC < other.LowPC;
60 uint64_t LowPC; /// Start of address range.
61 uint32_t Length; /// End of address range (not including this address).
62 uint32_t CUOffset; /// Offset of the compile unit or die.
65 struct RangeEndpoint {
66 uint64_t Address;
67 uint32_t CUOffset;
68 bool IsRangeStart;
70 RangeEndpoint(uint64_t Address, uint32_t CUOffset, bool IsRangeStart)
71 : Address(Address), CUOffset(CUOffset), IsRangeStart(IsRangeStart) {}
73 bool operator<(const RangeEndpoint &Other) const {
74 return Address < Other.Address;
78 using RangeColl = std::vector<Range>;
79 using RangeCollIterator = RangeColl::const_iterator;
81 std::vector<RangeEndpoint> Endpoints;
82 RangeColl Aranges;
83 DenseSet<uint32_t> ParsedCUOffsets;
86 } // end namespace llvm
88 #endif // LLVM_DEBUGINFO_DWARFDEBUGARANGES_H