Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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