//===-- LVRange.h -----------------------------------------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// This file defines the LVRange class, which is used to describe a debug
 
// information range.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H
 
#define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H
 
 
 
#include "llvm/ADT/IntervalTree.h"
 
#include "llvm/DebugInfo/LogicalView/Core/LVObject.h"
 
 
 
namespace llvm {
 
namespace logicalview {
 
 
 
using LVAddressRange = std::pair<LVAddress, LVAddress>;
 
 
 
class LVRangeEntry final {
 
  LVAddress Lower = 0;
 
  LVAddress Upper = 0;
 
  LVScope *Scope = nullptr;
 
 
 
public:
 
  using RangeType = LVAddress;
 
 
 
  LVRangeEntry() = delete;
 
  LVRangeEntry(LVAddress LowerAddress, LVAddress UpperAddress, LVScope *Scope)
 
      : Lower(LowerAddress), Upper(UpperAddress), Scope(Scope) {}
 
 
 
  RangeType lower() const { return Lower; }
 
  RangeType upper() const { return Upper; }
 
  LVAddressRange addressRange() const {
 
    return LVAddressRange(lower(), upper());
 
  }
 
  LVScope *scope() const { return Scope; }
 
};
 
 
 
// Class to represent a list of range addresses associated with a
 
// scope; the addresses are stored in ascending order and can overlap.
 
using LVRangeEntries = std::vector<LVRangeEntry>;
 
 
 
class LVRange final : public LVObject {
 
  /// Map of where a user value is live, and its location.
 
  using LVRangesTree = IntervalTree<LVAddress, LVScope *>;
 
  using LVAllocator = LVRangesTree::Allocator;
 
 
 
  LVAllocator Allocator;
 
  LVRangesTree RangesTree;
 
  LVRangeEntries RangeEntries;
 
  LVAddress Lower = MaxAddress;
 
  LVAddress Upper = 0;
 
 
 
public:
 
  LVRange() : LVObject(), RangesTree(Allocator) {}
 
  LVRange(const LVRange &) = delete;
 
  LVRange &operator=(const LVRange &) = delete;
 
  ~LVRange() = default;
 
 
 
  void addEntry(LVScope *Scope, LVAddress LowerAddress, LVAddress UpperAddress);
 
  void addEntry(LVScope *Scope);
 
  LVScope *getEntry(LVAddress Address) const;
 
  LVScope *getEntry(LVAddress LowerAddress, LVAddress UpperAddress) const;
 
  bool hasEntry(LVAddress Low, LVAddress High) const;
 
  LVAddress getLower() const { return Lower; }
 
  LVAddress getUpper() const { return Upper; }
 
 
 
  const LVRangeEntries &getEntries() const { return RangeEntries; }
 
 
 
  void clear() {
 
    RangeEntries.clear();
 
    Lower = MaxAddress;
 
    Upper = 0;
 
  }
 
  bool empty() const { return RangeEntries.empty(); }
 
  void sort();
 
 
 
  void startSearch();
 
  void endSearch() {}
 
 
 
  void print(raw_ostream &OS, bool Full = true) const override;
 
  void printExtra(raw_ostream &OS, bool Full = true) const override {}
 
 
 
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
 
  void dump() const override { print(dbgs()); }
 
#endif
 
};
 
 
 
} // end namespace logicalview
 
} // end namespace llvm
 
 
 
#endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVRANGE_H