diff options
Diffstat (limited to 'contrib/llvm/lib/DebugInfo/DWARFDebugAranges.h')
-rw-r--r-- | contrib/llvm/lib/DebugInfo/DWARFDebugAranges.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/contrib/llvm/lib/DebugInfo/DWARFDebugAranges.h b/contrib/llvm/lib/DebugInfo/DWARFDebugAranges.h new file mode 100644 index 000000000000..35ad8e53d63d --- /dev/null +++ b/contrib/llvm/lib/DebugInfo/DWARFDebugAranges.h @@ -0,0 +1,84 @@ +//===-- 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 <list> + +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<Range> RangeColl; + typedef RangeColl::const_iterator RangeCollIterator; + typedef DenseSet<uint32_t> ParsedCUOffsetColl; + + RangeColl Aranges; + ParsedCUOffsetColl ParsedCUOffsets; +}; + +} + +#endif |