//===-- 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; 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; class LVRange final : public LVObject { /// Map of where a user value is live, and its location. using LVRangesTree = IntervalTree; 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