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