Viewing file: DWARFDebugAranges.h (2.4 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- DWARFDebugAranges.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 // //===----------------------------------------------------------------------===//
#ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H #define LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H
#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/STLFunctionalExtras.h" #include <cstdint> #include <vector>
namespace llvm { class DWARFDataExtractor; class Error;
class DWARFContext;
class DWARFDebugAranges { public: void generate(DWARFContext *CTX); uint64_t findAddress(uint64_t Address) const;
private: void clear(); void extract(DWARFDataExtractor DebugArangesData, function_ref<void(Error)> RecoverableErrorHandler, function_ref<void(Error)> WarningHandler);
/// Call appendRange multiple times and then call construct. void appendRange(uint64_t CUOffset, uint64_t LowPC, uint64_t HighPC); void construct();
struct Range { explicit Range(uint64_t LowPC, uint64_t HighPC, uint64_t CUOffset) : 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 operator<(const Range &other) const { return LowPC < other.LowPC; }
uint64_t LowPC; /// Start of address range. uint64_t Length; /// End of address range (not including this address). uint64_t CUOffset; /// Offset of the compile unit or die. };
struct RangeEndpoint { uint64_t Address; uint64_t CUOffset; bool IsRangeStart;
RangeEndpoint(uint64_t Address, uint64_t CUOffset, bool IsRangeStart) : Address(Address), CUOffset(CUOffset), IsRangeStart(IsRangeStart) {}
bool operator<(const RangeEndpoint &Other) const { return Address < Other.Address; } };
using RangeColl = std::vector<Range>; using RangeCollIterator = RangeColl::const_iterator;
std::vector<RangeEndpoint> Endpoints; RangeColl Aranges; DenseSet<uint64_t> ParsedCUOffsets; };
} // end namespace llvm
#endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGARANGES_H
|