Viewing file: LVRange.h (3.02 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===-- 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
|