//===-- DWARFDebugAranges.h -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_DWARFDEBUGARANGES_H #define LLVM_DEBUGINFO_DWARFDEBUGARANGES_H #include "DWARFDebugArangeSet.h" #include "llvm/ADT/DenseSet.h" #include namespace llvm { class DWARFContext; class DWARFDebugAranges { public: void clear() { Aranges.clear(); ParsedCUOffsets.clear(); } void generate(DWARFContext *CTX); // Use appendRange multiple times and then call sortAndMinimize. void appendRange(uint32_t CUOffset, uint64_t LowPC, uint64_t HighPC); uint32_t findAddress(uint64_t Address) const; private: void extract(DataExtractor DebugArangesData); void sortAndMinimize(); struct Range { explicit Range(uint64_t LowPC = -1ULL, uint64_t HighPC = -1ULL, uint32_t CUOffset = -1U) : LowPC(LowPC), Length(HighPC - LowPC), CUOffset(CUOffset) {} void setHighPC(uint64_t HighPC) { if (HighPC == -1ULL || HighPC <= LowPC) Length = 0; else Length = HighPC - LowPC; } uint64_t HighPC() const { if (Length) return LowPC + Length; return -1ULL; } bool containsAddress(uint64_t Address) const { return LowPC <= Address && Address < HighPC(); } bool operator <(const Range &other) const { return LowPC < other.LowPC; } static bool SortedOverlapCheck(const Range &Left, const Range &Right) { if (Left.CUOffset != Right.CUOffset) return false; return Left.HighPC() >= Right.LowPC; } uint64_t LowPC; // Start of address range. uint32_t Length; // End of address range (not including this address). uint32_t CUOffset; // Offset of the compile unit or die. }; typedef std::vector RangeColl; typedef RangeColl::const_iterator RangeCollIterator; typedef DenseSet ParsedCUOffsetColl; RangeColl Aranges; ParsedCUOffsetColl ParsedCUOffsets; }; } #endif