1226584Sdim//===-- DWARFDebugAranges.h -------------------------------------*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim 10226584Sdim#ifndef LLVM_DEBUGINFO_DWARFDEBUGARANGES_H 11226584Sdim#define LLVM_DEBUGINFO_DWARFDEBUGARANGES_H 12226584Sdim 13226584Sdim#include "DWARFDebugArangeSet.h" 14249423Sdim#include "llvm/ADT/DenseSet.h" 15226584Sdim#include <list> 16226584Sdim 17226584Sdimnamespace llvm { 18226584Sdim 19226584Sdimclass DWARFContext; 20226584Sdim 21226584Sdimclass DWARFDebugAranges { 22226584Sdimpublic: 23263508Sdim void clear() { 24263508Sdim Aranges.clear(); 25263508Sdim ParsedCUOffsets.clear(); 26263508Sdim } 27263508Sdim 28263508Sdim void generate(DWARFContext *CTX); 29263508Sdim 30263508Sdim // Use appendRange multiple times and then call sortAndMinimize. 31263508Sdim void appendRange(uint32_t CUOffset, uint64_t LowPC, uint64_t HighPC); 32263508Sdim 33263508Sdim uint32_t findAddress(uint64_t Address) const; 34263508Sdim 35263508Sdimprivate: 36263508Sdim void extract(DataExtractor DebugArangesData); 37263508Sdim void sortAndMinimize(); 38263508Sdim 39226584Sdim struct Range { 40263508Sdim explicit Range(uint64_t LowPC = -1ULL, uint64_t HighPC = -1ULL, 41263508Sdim uint32_t CUOffset = -1U) 42263508Sdim : LowPC(LowPC), Length(HighPC - LowPC), CUOffset(CUOffset) {} 43226584Sdim 44263508Sdim void setHighPC(uint64_t HighPC) { 45263508Sdim if (HighPC == -1ULL || HighPC <= LowPC) 46226584Sdim Length = 0; 47226584Sdim else 48263508Sdim Length = HighPC - LowPC; 49226584Sdim } 50263508Sdim uint64_t HighPC() const { 51226584Sdim if (Length) 52263508Sdim return LowPC + Length; 53226584Sdim return -1ULL; 54226584Sdim } 55263508Sdim bool containsAddress(uint64_t Address) const { 56263508Sdim return LowPC <= Address && Address < HighPC(); 57263508Sdim } 58226584Sdim 59263508Sdim bool operator <(const Range &other) const { 60263508Sdim return LowPC < other.LowPC; 61226584Sdim } 62226584Sdim 63263508Sdim static bool SortedOverlapCheck(const Range &Left, const Range &Right) { 64263508Sdim if (Left.CUOffset != Right.CUOffset) 65263508Sdim return false; 66263508Sdim return Left.HighPC() >= Right.LowPC; 67226584Sdim } 68226584Sdim 69263508Sdim uint64_t LowPC; // Start of address range. 70263508Sdim uint32_t Length; // End of address range (not including this address). 71263508Sdim uint32_t CUOffset; // Offset of the compile unit or die. 72226584Sdim }; 73226584Sdim 74226584Sdim typedef std::vector<Range> RangeColl; 75226584Sdim typedef RangeColl::const_iterator RangeCollIterator; 76249423Sdim typedef DenseSet<uint32_t> ParsedCUOffsetColl; 77226584Sdim 78226584Sdim RangeColl Aranges; 79249423Sdim ParsedCUOffsetColl ParsedCUOffsets; 80226584Sdim}; 81226584Sdim 82226584Sdim} 83226584Sdim 84226584Sdim#endif 85