]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / SymbolFile / DWARF / DWARFDebugRanges.h
1 //===-- DWARFDebugRanges.h --------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef SymbolFileDWARF_DWARFDebugRanges_h_
10 #define SymbolFileDWARF_DWARFDebugRanges_h_
11
12 #include "lldb/Core/dwarf.h"
13 #include <map>
14
15 class DWARFUnit;
16 namespace lldb_private {
17 class DWARFContext;
18 }
19
20 class DWARFDebugRangesBase {
21 public:
22   virtual ~DWARFDebugRangesBase(){};
23
24   virtual void Extract(lldb_private::DWARFContext &context) = 0;
25   virtual bool FindRanges(const DWARFUnit *cu, dw_offset_t debug_ranges_offset,
26                           DWARFRangeList &range_list) const = 0;
27   virtual uint64_t GetOffset(size_t Index) const = 0;
28 };
29
30 class DWARFDebugRanges final : public DWARFDebugRangesBase {
31 public:
32   DWARFDebugRanges();
33
34   void Extract(lldb_private::DWARFContext &context) override;
35   bool FindRanges(const DWARFUnit *cu, dw_offset_t debug_ranges_offset,
36                   DWARFRangeList &range_list) const override;
37   uint64_t GetOffset(size_t Index) const override;
38
39   static void Dump(lldb_private::Stream &s,
40                    const lldb_private::DWARFDataExtractor &debug_ranges_data,
41                    lldb::offset_t *offset_ptr, dw_addr_t cu_base_addr);
42
43 protected:
44   bool Extract(lldb_private::DWARFContext &context, lldb::offset_t *offset_ptr,
45                DWARFRangeList &range_list);
46
47   typedef std::map<dw_offset_t, DWARFRangeList> range_map;
48   typedef range_map::iterator range_map_iterator;
49   typedef range_map::const_iterator range_map_const_iterator;
50   range_map m_range_map;
51 };
52
53 // DWARF v5 .debug_rnglists section.
54 class DWARFDebugRngLists final : public DWARFDebugRangesBase {
55   struct RngListEntry {
56     uint8_t encoding;
57     uint64_t value0;
58     uint64_t value1;
59   };
60
61 public:
62   void Extract(lldb_private::DWARFContext &context) override;
63   bool FindRanges(const DWARFUnit *cu, dw_offset_t debug_ranges_offset,
64                   DWARFRangeList &range_list) const override;
65   uint64_t GetOffset(size_t Index) const override;
66
67 protected:
68   bool ExtractRangeList(const lldb_private::DWARFDataExtractor &data,
69                         uint8_t addrSize, lldb::offset_t *offset_ptr,
70                         std::vector<RngListEntry> &list);
71
72   std::vector<uint64_t> Offsets;
73   std::map<dw_offset_t, std::vector<RngListEntry>> m_range_map;
74 };
75
76 #endif // SymbolFileDWARF_DWARFDebugRanges_h_