Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.