LLDB  mainline
DWARFContext.cpp
Go to the documentation of this file.
1 //===-- DWARFContext.cpp --------------------------------------------------===//
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 #include "DWARFContext.h"
10 
11 #include "lldb/Core/Section.h"
12 
13 using namespace lldb;
14 using namespace lldb_private;
15 
17  SectionType section_type) {
18  if (!section_list)
19  return DWARFDataExtractor();
20 
21  auto section_sp = section_list->FindSectionByType(section_type, true);
22  if (!section_sp)
23  return DWARFDataExtractor();
24 
25  DWARFDataExtractor data;
26  section_sp->GetSectionData(data);
27  return data;
28 }
29 
30 const DWARFDataExtractor &
31 DWARFContext::LoadOrGetSection(llvm::Optional<SectionType> main_section_type,
32  llvm::Optional<SectionType> dwo_section_type,
33  SectionData &data) {
34  llvm::call_once(data.flag, [&] {
35  if (dwo_section_type && isDwo())
36  data.data = LoadSection(m_dwo_section_list, *dwo_section_type);
37  else if (main_section_type)
38  data.data = LoadSection(m_main_section_list, *main_section_type);
39  });
40  return data.data;
41 }
42 
43 const DWARFDataExtractor &DWARFContext::getOrLoadCuIndexData() {
44  return LoadOrGetSection(llvm::None, eSectionTypeDWARFDebugCuIndex,
45  m_data_debug_cu_index);
46 }
47 
48 const DWARFDataExtractor &DWARFContext::getOrLoadTuIndexData() {
49  return LoadOrGetSection(llvm::None, eSectionTypeDWARFDebugTuIndex,
50  m_data_debug_tu_index);
51 }
52 
53 const DWARFDataExtractor &DWARFContext::getOrLoadAbbrevData() {
54  return LoadOrGetSection(eSectionTypeDWARFDebugAbbrev,
55  eSectionTypeDWARFDebugAbbrevDwo, m_data_debug_abbrev);
56 }
57 
58 const DWARFDataExtractor &DWARFContext::getOrLoadArangesData() {
59  return LoadOrGetSection(eSectionTypeDWARFDebugAranges, llvm::None,
60  m_data_debug_aranges);
61 }
62 
63 const DWARFDataExtractor &DWARFContext::getOrLoadAddrData() {
64  return LoadOrGetSection(eSectionTypeDWARFDebugAddr, llvm::None,
65  m_data_debug_addr);
66 }
67 
68 const DWARFDataExtractor &DWARFContext::getOrLoadDebugInfoData() {
69  return LoadOrGetSection(eSectionTypeDWARFDebugInfo,
70  eSectionTypeDWARFDebugInfoDwo, m_data_debug_info);
71 }
72 
73 const DWARFDataExtractor &DWARFContext::getOrLoadLineData() {
74  return LoadOrGetSection(eSectionTypeDWARFDebugLine, llvm::None,
75  m_data_debug_line);
76 }
77 
78 const DWARFDataExtractor &DWARFContext::getOrLoadLineStrData() {
79  return LoadOrGetSection(eSectionTypeDWARFDebugLineStr, llvm::None,
80  m_data_debug_line_str);
81 }
82 
83 const DWARFDataExtractor &DWARFContext::getOrLoadLocData() {
84  return LoadOrGetSection(eSectionTypeDWARFDebugLoc,
85  eSectionTypeDWARFDebugLocDwo, m_data_debug_loc);
86 }
87 
88 const DWARFDataExtractor &DWARFContext::getOrLoadLocListsData() {
89  return LoadOrGetSection(eSectionTypeDWARFDebugLocLists,
91  m_data_debug_loclists);
92 }
93 
94 const DWARFDataExtractor &DWARFContext::getOrLoadMacroData() {
95  return LoadOrGetSection(eSectionTypeDWARFDebugMacro, llvm::None,
96  m_data_debug_macro);
97 }
98 
99 const DWARFDataExtractor &DWARFContext::getOrLoadRangesData() {
100  return LoadOrGetSection(eSectionTypeDWARFDebugRanges, llvm::None,
101  m_data_debug_ranges);
102 }
103 
104 const DWARFDataExtractor &DWARFContext::getOrLoadRngListsData() {
105  return LoadOrGetSection(eSectionTypeDWARFDebugRngLists,
107  m_data_debug_rnglists);
108 }
109 
110 const DWARFDataExtractor &DWARFContext::getOrLoadStrData() {
111  return LoadOrGetSection(eSectionTypeDWARFDebugStr,
112  eSectionTypeDWARFDebugStrDwo, m_data_debug_str);
113 }
114 
115 const DWARFDataExtractor &DWARFContext::getOrLoadStrOffsetsData() {
116  return LoadOrGetSection(eSectionTypeDWARFDebugStrOffsets,
118  m_data_debug_str_offsets);
119 }
120 
121 const DWARFDataExtractor &DWARFContext::getOrLoadDebugTypesData() {
122  return LoadOrGetSection(eSectionTypeDWARFDebugTypes,
123  eSectionTypeDWARFDebugTypesDwo, m_data_debug_types);
124 }
125 
126 llvm::DWARFContext &DWARFContext::GetAsLLVM() {
127  if (!m_llvm_context) {
128  llvm::StringMap<std::unique_ptr<llvm::MemoryBuffer>> section_map;
129  uint8_t addr_size = 0;
130  auto AddSection = [&](llvm::StringRef name, DWARFDataExtractor data) {
131  // Set the address size the first time we see it.
132  if (addr_size == 0)
133  addr_size = data.GetAddressByteSize();
134 
135  section_map.try_emplace(
136  name, llvm::MemoryBuffer::getMemBuffer(toStringRef(data.GetData()),
137  name, false));
138  };
139 
140  AddSection("debug_line_str", getOrLoadLineStrData());
141  AddSection("debug_cu_index", getOrLoadCuIndexData());
142  AddSection("debug_tu_index", getOrLoadTuIndexData());
143 
144  m_llvm_context = llvm::DWARFContext::create(section_map, addr_size);
145  }
146  return *m_llvm_context;
147 }
A class that represents a running process on the host machine.
lldb::SectionSP FindSectionByType(lldb::SectionType sect_type, bool check_children, size_t start_idx=0) const
Definition: Section.cpp:524
DWARF .debug_types section.
static DWARFDataExtractor LoadSection(SectionList *section_list, SectionType section_type)
Definition: SBAddress.h:15