1 //===-- DWARFContext.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 LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFCONTEXT_H
10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFCONTEXT_H
11 
12 #include "DWARFDataExtractor.h"
13 #include "lldb/Core/Section.h"
14 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
15 #include "llvm/Support/Threading.h"
16 #include <memory>
17 #include <optional>
18 
19 namespace lldb_private::plugin {
20 namespace dwarf {
21 class DWARFContext {
22 private:
23   SectionList *m_main_section_list;
24   SectionList *m_dwo_section_list;
25   mutable std::unique_ptr<llvm::DWARFContext> m_llvm_context;
26 
27   struct SectionData {
28     llvm::once_flag flag;
29     DWARFDataExtractor data;
30   };
31 
32   SectionData m_data_debug_abbrev;
33   SectionData m_data_debug_addr;
34   SectionData m_data_debug_aranges;
35   SectionData m_data_debug_cu_index;
36   SectionData m_data_debug_info;
37   SectionData m_data_debug_line;
38   SectionData m_data_debug_line_str;
39   SectionData m_data_debug_loc;
40   SectionData m_data_debug_loclists;
41   SectionData m_data_debug_macro;
42   SectionData m_data_debug_ranges;
43   SectionData m_data_debug_rnglists;
44   SectionData m_data_debug_str;
45   SectionData m_data_debug_str_offsets;
46   SectionData m_data_debug_tu_index;
47   SectionData m_data_debug_types;
48 
49   const DWARFDataExtractor &
50   LoadOrGetSection(std::optional<lldb::SectionType> main_section_type,
51                    std::optional<lldb::SectionType> dwo_section_type,
52                    SectionData &data);
53 
54   const DWARFDataExtractor &getOrLoadCuIndexData();
55   const DWARFDataExtractor &getOrLoadTuIndexData();
56 
57 public:
58   explicit DWARFContext(SectionList *main_section_list,
59                         SectionList *dwo_section_list)
60       : m_main_section_list(main_section_list),
61         m_dwo_section_list(dwo_section_list) {}
62 
63   const DWARFDataExtractor &getOrLoadAbbrevData();
64   const DWARFDataExtractor &getOrLoadAddrData();
65   const DWARFDataExtractor &getOrLoadArangesData();
66   const DWARFDataExtractor &getOrLoadDebugInfoData();
67   const DWARFDataExtractor &getOrLoadLineData();
68   const DWARFDataExtractor &getOrLoadLineStrData();
69   const DWARFDataExtractor &getOrLoadLocData();
70   const DWARFDataExtractor &getOrLoadLocListsData();
71   const DWARFDataExtractor &getOrLoadMacroData();
72   const DWARFDataExtractor &getOrLoadRangesData();
73   const DWARFDataExtractor &getOrLoadRngListsData();
74   const DWARFDataExtractor &getOrLoadStrData();
75   const DWARFDataExtractor &getOrLoadStrOffsetsData();
76   const DWARFDataExtractor &getOrLoadDebugTypesData();
77 
78   bool isDwo() { return m_dwo_section_list != nullptr; }
79 
80   llvm::DWARFContext &GetAsLLVM();
81 };
82 } // namespace dwarf
83 } // namespace lldb_private::plugin
84 
85 #endif
86