1 //===-- LVRange.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 // This file defines the LVRange class, which is used to describe a debug
10 // information range.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H
15 #define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H
16 
17 #include "llvm/ADT/IntervalTree.h"
18 #include "llvm/DebugInfo/LogicalView/Core/LVObject.h"
19 
20 namespace llvm {
21 namespace logicalview {
22 
23 using LVAddressRange = std::pair<LVAddress, LVAddress>;
24 
25 class LVRangeEntry final {
26   LVAddress Lower = 0;
27   LVAddress Upper = 0;
28   LVScope *Scope = nullptr;
29 
30 public:
31   using RangeType = LVAddress;
32 
33   LVRangeEntry() = delete;
34   LVRangeEntry(LVAddress LowerAddress, LVAddress UpperAddress, LVScope *Scope)
35       : Lower(LowerAddress), Upper(UpperAddress), Scope(Scope) {}
36 
37   RangeType lower() const { return Lower; }
38   RangeType upper() const { return Upper; }
39   LVAddressRange addressRange() const {
40     return LVAddressRange(lower(), upper());
41   }
42   LVScope *scope() const { return Scope; }
43 };
44 
45 // Class to represent a list of range addresses associated with a
46 // scope; the addresses are stored in ascending order and can overlap.
47 using LVRangeEntries = std::vector<LVRangeEntry>;
48 
49 class LVRange final : public LVObject {
50   /// Map of where a user value is live, and its location.
51   using LVRangesTree = IntervalTree<LVAddress, LVScope *>;
52   using LVAllocator = LVRangesTree::Allocator;
53 
54   LVAllocator Allocator;
55   LVRangesTree RangesTree;
56   LVRangeEntries RangeEntries;
57   LVAddress Lower = MaxAddress;
58   LVAddress Upper = 0;
59 
60 public:
61   LVRange() : LVObject(), RangesTree(Allocator) {}
62   LVRange(const LVRange &) = delete;
63   LVRange &operator=(const LVRange &) = delete;
64   ~LVRange() = default;
65 
66   void addEntry(LVScope *Scope, LVAddress LowerAddress, LVAddress UpperAddress);
67   void addEntry(LVScope *Scope);
68   LVScope *getEntry(LVAddress Address) const;
69   LVScope *getEntry(LVAddress LowerAddress, LVAddress UpperAddress) const;
70   bool hasEntry(LVAddress Low, LVAddress High) const;
71   LVAddress getLower() const { return Lower; }
72   LVAddress getUpper() const { return Upper; }
73 
74   const LVRangeEntries &getEntries() const { return RangeEntries; }
75 
76   void clear() {
77     RangeEntries.clear();
78     Lower = MaxAddress;
79     Upper = 0;
80   }
81   bool empty() const { return RangeEntries.empty(); }
82   void sort();
83 
84   void startSearch();
85   void endSearch() {}
86 
87   void print(raw_ostream &OS, bool Full = true) const override;
88   void printExtra(raw_ostream &OS, bool Full = true) const override {}
89 
90 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
91   void dump() const override { print(dbgs()); }
92 #endif
93 };
94 
95 } // end namespace logicalview
96 } // end namespace llvm
97 
98 #endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H
99