1*f6aab3d8Srobert //===-- SymbolFileDWARFDebugMap.cpp ---------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert
9*f6aab3d8Srobert #include "lldb/Symbol/SymbolFileOnDemand.h"
10*f6aab3d8Srobert
11*f6aab3d8Srobert #include "lldb/Core/Module.h"
12*f6aab3d8Srobert #include "lldb/Symbol/SymbolFile.h"
13*f6aab3d8Srobert
14*f6aab3d8Srobert #include <memory>
15*f6aab3d8Srobert #include <optional>
16*f6aab3d8Srobert
17*f6aab3d8Srobert using namespace lldb;
18*f6aab3d8Srobert using namespace lldb_private;
19*f6aab3d8Srobert
20*f6aab3d8Srobert char SymbolFileOnDemand::ID;
21*f6aab3d8Srobert
SymbolFileOnDemand(std::unique_ptr<SymbolFile> && symbol_file)22*f6aab3d8Srobert SymbolFileOnDemand::SymbolFileOnDemand(
23*f6aab3d8Srobert std::unique_ptr<SymbolFile> &&symbol_file)
24*f6aab3d8Srobert : m_sym_file_impl(std::move(symbol_file)) {}
25*f6aab3d8Srobert
26*f6aab3d8Srobert SymbolFileOnDemand::~SymbolFileOnDemand() = default;
27*f6aab3d8Srobert
CalculateAbilities()28*f6aab3d8Srobert uint32_t SymbolFileOnDemand::CalculateAbilities() {
29*f6aab3d8Srobert // Explicitly allow ability checking to pass though.
30*f6aab3d8Srobert // This should be a cheap operation.
31*f6aab3d8Srobert return m_sym_file_impl->CalculateAbilities();
32*f6aab3d8Srobert }
33*f6aab3d8Srobert
GetModuleMutex() const34*f6aab3d8Srobert std::recursive_mutex &SymbolFileOnDemand::GetModuleMutex() const {
35*f6aab3d8Srobert return m_sym_file_impl->GetModuleMutex();
36*f6aab3d8Srobert }
37*f6aab3d8Srobert
InitializeObject()38*f6aab3d8Srobert void SymbolFileOnDemand::InitializeObject() {
39*f6aab3d8Srobert if (!m_debug_info_enabled) {
40*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
41*f6aab3d8Srobert __FUNCTION__);
42*f6aab3d8Srobert return;
43*f6aab3d8Srobert }
44*f6aab3d8Srobert return m_sym_file_impl->InitializeObject();
45*f6aab3d8Srobert }
46*f6aab3d8Srobert
ParseLanguage(CompileUnit & comp_unit)47*f6aab3d8Srobert lldb::LanguageType SymbolFileOnDemand::ParseLanguage(CompileUnit &comp_unit) {
48*f6aab3d8Srobert if (!m_debug_info_enabled) {
49*f6aab3d8Srobert Log *log = GetLog();
50*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
51*f6aab3d8Srobert if (log) {
52*f6aab3d8Srobert lldb::LanguageType langType = m_sym_file_impl->ParseLanguage(comp_unit);
53*f6aab3d8Srobert if (langType != eLanguageTypeUnknown)
54*f6aab3d8Srobert LLDB_LOG(log, "Language {0} would return if hydrated.", langType);
55*f6aab3d8Srobert }
56*f6aab3d8Srobert return eLanguageTypeUnknown;
57*f6aab3d8Srobert }
58*f6aab3d8Srobert return m_sym_file_impl->ParseLanguage(comp_unit);
59*f6aab3d8Srobert }
60*f6aab3d8Srobert
ParseXcodeSDK(CompileUnit & comp_unit)61*f6aab3d8Srobert XcodeSDK SymbolFileOnDemand::ParseXcodeSDK(CompileUnit &comp_unit) {
62*f6aab3d8Srobert if (!m_debug_info_enabled) {
63*f6aab3d8Srobert Log *log = GetLog();
64*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
65*f6aab3d8Srobert XcodeSDK defaultValue{};
66*f6aab3d8Srobert if (log) {
67*f6aab3d8Srobert XcodeSDK sdk = m_sym_file_impl->ParseXcodeSDK(comp_unit);
68*f6aab3d8Srobert if (!(sdk == defaultValue))
69*f6aab3d8Srobert LLDB_LOG(log, "SDK {0} would return if hydrated.", sdk.GetString());
70*f6aab3d8Srobert }
71*f6aab3d8Srobert return defaultValue;
72*f6aab3d8Srobert }
73*f6aab3d8Srobert return m_sym_file_impl->ParseXcodeSDK(comp_unit);
74*f6aab3d8Srobert }
75*f6aab3d8Srobert
ParseFunctions(CompileUnit & comp_unit)76*f6aab3d8Srobert size_t SymbolFileOnDemand::ParseFunctions(CompileUnit &comp_unit) {
77*f6aab3d8Srobert if (!m_debug_info_enabled) {
78*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
79*f6aab3d8Srobert __FUNCTION__);
80*f6aab3d8Srobert return 0;
81*f6aab3d8Srobert }
82*f6aab3d8Srobert return m_sym_file_impl->ParseFunctions(comp_unit);
83*f6aab3d8Srobert }
84*f6aab3d8Srobert
ParseLineTable(CompileUnit & comp_unit)85*f6aab3d8Srobert bool SymbolFileOnDemand::ParseLineTable(CompileUnit &comp_unit) {
86*f6aab3d8Srobert if (!m_debug_info_enabled) {
87*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
88*f6aab3d8Srobert __FUNCTION__);
89*f6aab3d8Srobert return false;
90*f6aab3d8Srobert }
91*f6aab3d8Srobert return m_sym_file_impl->ParseLineTable(comp_unit);
92*f6aab3d8Srobert }
93*f6aab3d8Srobert
ParseDebugMacros(CompileUnit & comp_unit)94*f6aab3d8Srobert bool SymbolFileOnDemand::ParseDebugMacros(CompileUnit &comp_unit) {
95*f6aab3d8Srobert if (!m_debug_info_enabled) {
96*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
97*f6aab3d8Srobert __FUNCTION__);
98*f6aab3d8Srobert return false;
99*f6aab3d8Srobert }
100*f6aab3d8Srobert return m_sym_file_impl->ParseDebugMacros(comp_unit);
101*f6aab3d8Srobert }
102*f6aab3d8Srobert
ForEachExternalModule(CompileUnit & comp_unit,llvm::DenseSet<lldb_private::SymbolFile * > & visited_symbol_files,llvm::function_ref<bool (Module &)> lambda)103*f6aab3d8Srobert bool SymbolFileOnDemand::ForEachExternalModule(
104*f6aab3d8Srobert CompileUnit &comp_unit,
105*f6aab3d8Srobert llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
106*f6aab3d8Srobert llvm::function_ref<bool(Module &)> lambda) {
107*f6aab3d8Srobert if (!m_debug_info_enabled) {
108*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
109*f6aab3d8Srobert __FUNCTION__);
110*f6aab3d8Srobert // Return false to not early exit.
111*f6aab3d8Srobert return false;
112*f6aab3d8Srobert }
113*f6aab3d8Srobert return m_sym_file_impl->ForEachExternalModule(comp_unit, visited_symbol_files,
114*f6aab3d8Srobert lambda);
115*f6aab3d8Srobert }
116*f6aab3d8Srobert
ParseSupportFiles(CompileUnit & comp_unit,FileSpecList & support_files)117*f6aab3d8Srobert bool SymbolFileOnDemand::ParseSupportFiles(CompileUnit &comp_unit,
118*f6aab3d8Srobert FileSpecList &support_files) {
119*f6aab3d8Srobert LLDB_LOG(GetLog(),
120*f6aab3d8Srobert "[{0}] {1} is not skipped: explicitly allowed to support breakpoint",
121*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
122*f6aab3d8Srobert // Explicitly allow this API through to support source line breakpoint.
123*f6aab3d8Srobert return m_sym_file_impl->ParseSupportFiles(comp_unit, support_files);
124*f6aab3d8Srobert }
125*f6aab3d8Srobert
ParseIsOptimized(CompileUnit & comp_unit)126*f6aab3d8Srobert bool SymbolFileOnDemand::ParseIsOptimized(CompileUnit &comp_unit) {
127*f6aab3d8Srobert if (!m_debug_info_enabled) {
128*f6aab3d8Srobert Log *log = GetLog();
129*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
130*f6aab3d8Srobert if (log) {
131*f6aab3d8Srobert bool optimized = m_sym_file_impl->ParseIsOptimized(comp_unit);
132*f6aab3d8Srobert if (optimized) {
133*f6aab3d8Srobert LLDB_LOG(log, "Would return optimized if hydrated.");
134*f6aab3d8Srobert }
135*f6aab3d8Srobert }
136*f6aab3d8Srobert return false;
137*f6aab3d8Srobert }
138*f6aab3d8Srobert return m_sym_file_impl->ParseIsOptimized(comp_unit);
139*f6aab3d8Srobert }
140*f6aab3d8Srobert
ParseTypes(CompileUnit & comp_unit)141*f6aab3d8Srobert size_t SymbolFileOnDemand::ParseTypes(CompileUnit &comp_unit) {
142*f6aab3d8Srobert if (!m_debug_info_enabled) {
143*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
144*f6aab3d8Srobert __FUNCTION__);
145*f6aab3d8Srobert return 0;
146*f6aab3d8Srobert }
147*f6aab3d8Srobert return m_sym_file_impl->ParseTypes(comp_unit);
148*f6aab3d8Srobert }
149*f6aab3d8Srobert
ParseImportedModules(const lldb_private::SymbolContext & sc,std::vector<SourceModule> & imported_modules)150*f6aab3d8Srobert bool SymbolFileOnDemand::ParseImportedModules(
151*f6aab3d8Srobert const lldb_private::SymbolContext &sc,
152*f6aab3d8Srobert std::vector<SourceModule> &imported_modules) {
153*f6aab3d8Srobert if (!m_debug_info_enabled) {
154*f6aab3d8Srobert Log *log = GetLog();
155*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
156*f6aab3d8Srobert if (log) {
157*f6aab3d8Srobert std::vector<SourceModule> tmp_imported_modules;
158*f6aab3d8Srobert bool succeed =
159*f6aab3d8Srobert m_sym_file_impl->ParseImportedModules(sc, tmp_imported_modules);
160*f6aab3d8Srobert if (succeed)
161*f6aab3d8Srobert LLDB_LOG(log, "{0} imported modules would be parsed if hydrated.",
162*f6aab3d8Srobert tmp_imported_modules.size());
163*f6aab3d8Srobert }
164*f6aab3d8Srobert return false;
165*f6aab3d8Srobert }
166*f6aab3d8Srobert return m_sym_file_impl->ParseImportedModules(sc, imported_modules);
167*f6aab3d8Srobert }
168*f6aab3d8Srobert
ParseBlocksRecursive(Function & func)169*f6aab3d8Srobert size_t SymbolFileOnDemand::ParseBlocksRecursive(Function &func) {
170*f6aab3d8Srobert if (!m_debug_info_enabled) {
171*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
172*f6aab3d8Srobert __FUNCTION__);
173*f6aab3d8Srobert return 0;
174*f6aab3d8Srobert }
175*f6aab3d8Srobert return m_sym_file_impl->ParseBlocksRecursive(func);
176*f6aab3d8Srobert }
177*f6aab3d8Srobert
ParseVariablesForContext(const SymbolContext & sc)178*f6aab3d8Srobert size_t SymbolFileOnDemand::ParseVariablesForContext(const SymbolContext &sc) {
179*f6aab3d8Srobert if (!m_debug_info_enabled) {
180*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
181*f6aab3d8Srobert __FUNCTION__);
182*f6aab3d8Srobert return 0;
183*f6aab3d8Srobert }
184*f6aab3d8Srobert return m_sym_file_impl->ParseVariablesForContext(sc);
185*f6aab3d8Srobert }
186*f6aab3d8Srobert
ResolveTypeUID(lldb::user_id_t type_uid)187*f6aab3d8Srobert Type *SymbolFileOnDemand::ResolveTypeUID(lldb::user_id_t type_uid) {
188*f6aab3d8Srobert if (!m_debug_info_enabled) {
189*f6aab3d8Srobert Log *log = GetLog();
190*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
191*f6aab3d8Srobert if (log) {
192*f6aab3d8Srobert Type *resolved_type = m_sym_file_impl->ResolveTypeUID(type_uid);
193*f6aab3d8Srobert if (resolved_type)
194*f6aab3d8Srobert LLDB_LOG(log, "Type would be parsed for {0} if hydrated.", type_uid);
195*f6aab3d8Srobert }
196*f6aab3d8Srobert return nullptr;
197*f6aab3d8Srobert }
198*f6aab3d8Srobert return m_sym_file_impl->ResolveTypeUID(type_uid);
199*f6aab3d8Srobert }
200*f6aab3d8Srobert
201*f6aab3d8Srobert std::optional<SymbolFile::ArrayInfo>
GetDynamicArrayInfoForUID(lldb::user_id_t type_uid,const lldb_private::ExecutionContext * exe_ctx)202*f6aab3d8Srobert SymbolFileOnDemand::GetDynamicArrayInfoForUID(
203*f6aab3d8Srobert lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) {
204*f6aab3d8Srobert if (!m_debug_info_enabled) {
205*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
206*f6aab3d8Srobert __FUNCTION__);
207*f6aab3d8Srobert return std::nullopt;
208*f6aab3d8Srobert }
209*f6aab3d8Srobert return m_sym_file_impl->GetDynamicArrayInfoForUID(type_uid, exe_ctx);
210*f6aab3d8Srobert }
211*f6aab3d8Srobert
CompleteType(CompilerType & compiler_type)212*f6aab3d8Srobert bool SymbolFileOnDemand::CompleteType(CompilerType &compiler_type) {
213*f6aab3d8Srobert if (!m_debug_info_enabled) {
214*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
215*f6aab3d8Srobert __FUNCTION__);
216*f6aab3d8Srobert return false;
217*f6aab3d8Srobert }
218*f6aab3d8Srobert return m_sym_file_impl->CompleteType(compiler_type);
219*f6aab3d8Srobert }
220*f6aab3d8Srobert
GetDeclForUID(lldb::user_id_t type_uid)221*f6aab3d8Srobert CompilerDecl SymbolFileOnDemand::GetDeclForUID(lldb::user_id_t type_uid) {
222*f6aab3d8Srobert if (!m_debug_info_enabled) {
223*f6aab3d8Srobert Log *log = GetLog();
224*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
225*f6aab3d8Srobert if (log) {
226*f6aab3d8Srobert CompilerDecl parsed_decl = m_sym_file_impl->GetDeclForUID(type_uid);
227*f6aab3d8Srobert if (parsed_decl != CompilerDecl()) {
228*f6aab3d8Srobert LLDB_LOG(log, "CompilerDecl {0} would be parsed for {1} if hydrated.",
229*f6aab3d8Srobert parsed_decl.GetName(), type_uid);
230*f6aab3d8Srobert }
231*f6aab3d8Srobert }
232*f6aab3d8Srobert return CompilerDecl();
233*f6aab3d8Srobert }
234*f6aab3d8Srobert return m_sym_file_impl->GetDeclForUID(type_uid);
235*f6aab3d8Srobert }
236*f6aab3d8Srobert
237*f6aab3d8Srobert CompilerDeclContext
GetDeclContextForUID(lldb::user_id_t type_uid)238*f6aab3d8Srobert SymbolFileOnDemand::GetDeclContextForUID(lldb::user_id_t type_uid) {
239*f6aab3d8Srobert if (!m_debug_info_enabled) {
240*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
241*f6aab3d8Srobert __FUNCTION__);
242*f6aab3d8Srobert return CompilerDeclContext();
243*f6aab3d8Srobert }
244*f6aab3d8Srobert return m_sym_file_impl->GetDeclContextForUID(type_uid);
245*f6aab3d8Srobert }
246*f6aab3d8Srobert
247*f6aab3d8Srobert CompilerDeclContext
GetDeclContextContainingUID(lldb::user_id_t type_uid)248*f6aab3d8Srobert SymbolFileOnDemand::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
249*f6aab3d8Srobert if (!m_debug_info_enabled) {
250*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
251*f6aab3d8Srobert __FUNCTION__);
252*f6aab3d8Srobert return CompilerDeclContext();
253*f6aab3d8Srobert }
254*f6aab3d8Srobert return m_sym_file_impl->GetDeclContextContainingUID(type_uid);
255*f6aab3d8Srobert }
256*f6aab3d8Srobert
ParseDeclsForContext(CompilerDeclContext decl_ctx)257*f6aab3d8Srobert void SymbolFileOnDemand::ParseDeclsForContext(CompilerDeclContext decl_ctx) {
258*f6aab3d8Srobert if (!m_debug_info_enabled) {
259*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
260*f6aab3d8Srobert __FUNCTION__);
261*f6aab3d8Srobert return;
262*f6aab3d8Srobert }
263*f6aab3d8Srobert return m_sym_file_impl->ParseDeclsForContext(decl_ctx);
264*f6aab3d8Srobert }
265*f6aab3d8Srobert
266*f6aab3d8Srobert uint32_t
ResolveSymbolContext(const Address & so_addr,SymbolContextItem resolve_scope,SymbolContext & sc)267*f6aab3d8Srobert SymbolFileOnDemand::ResolveSymbolContext(const Address &so_addr,
268*f6aab3d8Srobert SymbolContextItem resolve_scope,
269*f6aab3d8Srobert SymbolContext &sc) {
270*f6aab3d8Srobert if (!m_debug_info_enabled) {
271*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
272*f6aab3d8Srobert __FUNCTION__);
273*f6aab3d8Srobert return 0;
274*f6aab3d8Srobert }
275*f6aab3d8Srobert return m_sym_file_impl->ResolveSymbolContext(so_addr, resolve_scope, sc);
276*f6aab3d8Srobert }
277*f6aab3d8Srobert
CalculateFrameVariableError(StackFrame & frame)278*f6aab3d8Srobert Status SymbolFileOnDemand::CalculateFrameVariableError(StackFrame &frame) {
279*f6aab3d8Srobert if (!m_debug_info_enabled) {
280*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
281*f6aab3d8Srobert __FUNCTION__);
282*f6aab3d8Srobert return Status();
283*f6aab3d8Srobert }
284*f6aab3d8Srobert return m_sym_file_impl->CalculateFrameVariableError(frame);
285*f6aab3d8Srobert }
286*f6aab3d8Srobert
ResolveSymbolContext(const SourceLocationSpec & src_location_spec,SymbolContextItem resolve_scope,SymbolContextList & sc_list)287*f6aab3d8Srobert uint32_t SymbolFileOnDemand::ResolveSymbolContext(
288*f6aab3d8Srobert const SourceLocationSpec &src_location_spec,
289*f6aab3d8Srobert SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
290*f6aab3d8Srobert if (!m_debug_info_enabled) {
291*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
292*f6aab3d8Srobert __FUNCTION__);
293*f6aab3d8Srobert return 0;
294*f6aab3d8Srobert }
295*f6aab3d8Srobert return m_sym_file_impl->ResolveSymbolContext(src_location_spec, resolve_scope,
296*f6aab3d8Srobert sc_list);
297*f6aab3d8Srobert }
298*f6aab3d8Srobert
Dump(lldb_private::Stream & s)299*f6aab3d8Srobert void SymbolFileOnDemand::Dump(lldb_private::Stream &s) {
300*f6aab3d8Srobert if (!m_debug_info_enabled) {
301*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
302*f6aab3d8Srobert __FUNCTION__);
303*f6aab3d8Srobert return;
304*f6aab3d8Srobert }
305*f6aab3d8Srobert return m_sym_file_impl->Dump(s);
306*f6aab3d8Srobert }
307*f6aab3d8Srobert
DumpClangAST(lldb_private::Stream & s)308*f6aab3d8Srobert void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s) {
309*f6aab3d8Srobert if (!m_debug_info_enabled) {
310*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
311*f6aab3d8Srobert __FUNCTION__);
312*f6aab3d8Srobert return;
313*f6aab3d8Srobert }
314*f6aab3d8Srobert return m_sym_file_impl->DumpClangAST(s);
315*f6aab3d8Srobert }
316*f6aab3d8Srobert
FindGlobalVariables(const RegularExpression & regex,uint32_t max_matches,VariableList & variables)317*f6aab3d8Srobert void SymbolFileOnDemand::FindGlobalVariables(const RegularExpression ®ex,
318*f6aab3d8Srobert uint32_t max_matches,
319*f6aab3d8Srobert VariableList &variables) {
320*f6aab3d8Srobert if (!m_debug_info_enabled) {
321*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
322*f6aab3d8Srobert __FUNCTION__);
323*f6aab3d8Srobert return;
324*f6aab3d8Srobert }
325*f6aab3d8Srobert return m_sym_file_impl->FindGlobalVariables(regex, max_matches, variables);
326*f6aab3d8Srobert }
327*f6aab3d8Srobert
FindGlobalVariables(ConstString name,const CompilerDeclContext & parent_decl_ctx,uint32_t max_matches,VariableList & variables)328*f6aab3d8Srobert void SymbolFileOnDemand::FindGlobalVariables(
329*f6aab3d8Srobert ConstString name, const CompilerDeclContext &parent_decl_ctx,
330*f6aab3d8Srobert uint32_t max_matches, VariableList &variables) {
331*f6aab3d8Srobert if (!m_debug_info_enabled) {
332*f6aab3d8Srobert Log *log = GetLog();
333*f6aab3d8Srobert Symtab *symtab = GetSymtab();
334*f6aab3d8Srobert if (!symtab) {
335*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
336*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
337*f6aab3d8Srobert return;
338*f6aab3d8Srobert }
339*f6aab3d8Srobert Symbol *sym = symtab->FindFirstSymbolWithNameAndType(
340*f6aab3d8Srobert name, eSymbolTypeData, Symtab::eDebugAny, Symtab::eVisibilityAny);
341*f6aab3d8Srobert if (!sym) {
342*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
343*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
344*f6aab3d8Srobert return;
345*f6aab3d8Srobert }
346*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
347*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
348*f6aab3d8Srobert
349*f6aab3d8Srobert // Found match in symbol table hydrate debug info and
350*f6aab3d8Srobert // allow the FindGlobalVariables to go through.
351*f6aab3d8Srobert SetLoadDebugInfoEnabled();
352*f6aab3d8Srobert }
353*f6aab3d8Srobert return m_sym_file_impl->FindGlobalVariables(name, parent_decl_ctx,
354*f6aab3d8Srobert max_matches, variables);
355*f6aab3d8Srobert }
356*f6aab3d8Srobert
FindFunctions(const RegularExpression & regex,bool include_inlines,SymbolContextList & sc_list)357*f6aab3d8Srobert void SymbolFileOnDemand::FindFunctions(const RegularExpression ®ex,
358*f6aab3d8Srobert bool include_inlines,
359*f6aab3d8Srobert SymbolContextList &sc_list) {
360*f6aab3d8Srobert if (!m_debug_info_enabled) {
361*f6aab3d8Srobert Log *log = GetLog();
362*f6aab3d8Srobert Symtab *symtab = GetSymtab();
363*f6aab3d8Srobert if (!symtab) {
364*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
365*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
366*f6aab3d8Srobert return;
367*f6aab3d8Srobert }
368*f6aab3d8Srobert std::vector<uint32_t> symbol_indexes;
369*f6aab3d8Srobert symtab->AppendSymbolIndexesMatchingRegExAndType(
370*f6aab3d8Srobert regex, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny,
371*f6aab3d8Srobert symbol_indexes);
372*f6aab3d8Srobert if (symbol_indexes.empty()) {
373*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
374*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
375*f6aab3d8Srobert return;
376*f6aab3d8Srobert }
377*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
378*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
379*f6aab3d8Srobert
380*f6aab3d8Srobert // Found match in symbol table hydrate debug info and
381*f6aab3d8Srobert // allow the FindFucntions to go through.
382*f6aab3d8Srobert SetLoadDebugInfoEnabled();
383*f6aab3d8Srobert }
384*f6aab3d8Srobert return m_sym_file_impl->FindFunctions(regex, include_inlines, sc_list);
385*f6aab3d8Srobert }
386*f6aab3d8Srobert
FindFunctions(const Module::LookupInfo & lookup_info,const CompilerDeclContext & parent_decl_ctx,bool include_inlines,SymbolContextList & sc_list)387*f6aab3d8Srobert void SymbolFileOnDemand::FindFunctions(
388*f6aab3d8Srobert const Module::LookupInfo &lookup_info,
389*f6aab3d8Srobert const CompilerDeclContext &parent_decl_ctx, bool include_inlines,
390*f6aab3d8Srobert SymbolContextList &sc_list) {
391*f6aab3d8Srobert ConstString name = lookup_info.GetLookupName();
392*f6aab3d8Srobert FunctionNameType name_type_mask = lookup_info.GetNameTypeMask();
393*f6aab3d8Srobert if (!m_debug_info_enabled) {
394*f6aab3d8Srobert Log *log = GetLog();
395*f6aab3d8Srobert
396*f6aab3d8Srobert Symtab *symtab = GetSymtab();
397*f6aab3d8Srobert if (!symtab) {
398*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1}({2}) is skipped - fail to get symtab",
399*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__, name);
400*f6aab3d8Srobert return;
401*f6aab3d8Srobert }
402*f6aab3d8Srobert
403*f6aab3d8Srobert SymbolContextList sc_list_helper;
404*f6aab3d8Srobert symtab->FindFunctionSymbols(name, name_type_mask, sc_list_helper);
405*f6aab3d8Srobert if (sc_list_helper.GetSize() == 0) {
406*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1}({2}) is skipped - fail to find match in symtab",
407*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__, name);
408*f6aab3d8Srobert return;
409*f6aab3d8Srobert }
410*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1}({2}) is NOT skipped - found match in symtab",
411*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__, name);
412*f6aab3d8Srobert
413*f6aab3d8Srobert // Found match in symbol table hydrate debug info and
414*f6aab3d8Srobert // allow the FindFucntions to go through.
415*f6aab3d8Srobert SetLoadDebugInfoEnabled();
416*f6aab3d8Srobert }
417*f6aab3d8Srobert return m_sym_file_impl->FindFunctions(lookup_info, parent_decl_ctx,
418*f6aab3d8Srobert include_inlines, sc_list);
419*f6aab3d8Srobert }
420*f6aab3d8Srobert
GetMangledNamesForFunction(const std::string & scope_qualified_name,std::vector<ConstString> & mangled_names)421*f6aab3d8Srobert void SymbolFileOnDemand::GetMangledNamesForFunction(
422*f6aab3d8Srobert const std::string &scope_qualified_name,
423*f6aab3d8Srobert std::vector<ConstString> &mangled_names) {
424*f6aab3d8Srobert if (!m_debug_info_enabled) {
425*f6aab3d8Srobert Log *log = GetLog();
426*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
427*f6aab3d8Srobert __FUNCTION__, scope_qualified_name);
428*f6aab3d8Srobert return;
429*f6aab3d8Srobert }
430*f6aab3d8Srobert return m_sym_file_impl->GetMangledNamesForFunction(scope_qualified_name,
431*f6aab3d8Srobert mangled_names);
432*f6aab3d8Srobert }
433*f6aab3d8Srobert
FindTypes(ConstString name,const CompilerDeclContext & parent_decl_ctx,uint32_t max_matches,llvm::DenseSet<lldb_private::SymbolFile * > & searched_symbol_files,TypeMap & types)434*f6aab3d8Srobert void SymbolFileOnDemand::FindTypes(
435*f6aab3d8Srobert ConstString name, const CompilerDeclContext &parent_decl_ctx,
436*f6aab3d8Srobert uint32_t max_matches,
437*f6aab3d8Srobert llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
438*f6aab3d8Srobert TypeMap &types) {
439*f6aab3d8Srobert if (!m_debug_info_enabled) {
440*f6aab3d8Srobert Log *log = GetLog();
441*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
442*f6aab3d8Srobert __FUNCTION__, name);
443*f6aab3d8Srobert return;
444*f6aab3d8Srobert }
445*f6aab3d8Srobert return m_sym_file_impl->FindTypes(name, parent_decl_ctx, max_matches,
446*f6aab3d8Srobert searched_symbol_files, types);
447*f6aab3d8Srobert }
448*f6aab3d8Srobert
FindTypes(llvm::ArrayRef<CompilerContext> pattern,LanguageSet languages,llvm::DenseSet<SymbolFile * > & searched_symbol_files,TypeMap & types)449*f6aab3d8Srobert void SymbolFileOnDemand::FindTypes(
450*f6aab3d8Srobert llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
451*f6aab3d8Srobert llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) {
452*f6aab3d8Srobert if (!m_debug_info_enabled) {
453*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
454*f6aab3d8Srobert __FUNCTION__);
455*f6aab3d8Srobert return;
456*f6aab3d8Srobert }
457*f6aab3d8Srobert return m_sym_file_impl->FindTypes(pattern, languages, searched_symbol_files,
458*f6aab3d8Srobert types);
459*f6aab3d8Srobert }
460*f6aab3d8Srobert
GetTypes(SymbolContextScope * sc_scope,TypeClass type_mask,TypeList & type_list)461*f6aab3d8Srobert void SymbolFileOnDemand::GetTypes(SymbolContextScope *sc_scope,
462*f6aab3d8Srobert TypeClass type_mask, TypeList &type_list) {
463*f6aab3d8Srobert if (!m_debug_info_enabled) {
464*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
465*f6aab3d8Srobert __FUNCTION__);
466*f6aab3d8Srobert return;
467*f6aab3d8Srobert }
468*f6aab3d8Srobert return m_sym_file_impl->GetTypes(sc_scope, type_mask, type_list);
469*f6aab3d8Srobert }
470*f6aab3d8Srobert
471*f6aab3d8Srobert llvm::Expected<lldb::TypeSystemSP>
GetTypeSystemForLanguage(LanguageType language)472*f6aab3d8Srobert SymbolFileOnDemand::GetTypeSystemForLanguage(LanguageType language) {
473*f6aab3d8Srobert if (!m_debug_info_enabled) {
474*f6aab3d8Srobert Log *log = GetLog();
475*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped for language type {2}",
476*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__, language);
477*f6aab3d8Srobert return llvm::make_error<llvm::StringError>(
478*f6aab3d8Srobert "GetTypeSystemForLanguage is skipped by SymbolFileOnDemand",
479*f6aab3d8Srobert llvm::inconvertibleErrorCode());
480*f6aab3d8Srobert }
481*f6aab3d8Srobert return m_sym_file_impl->GetTypeSystemForLanguage(language);
482*f6aab3d8Srobert }
483*f6aab3d8Srobert
484*f6aab3d8Srobert CompilerDeclContext
FindNamespace(ConstString name,const CompilerDeclContext & parent_decl_ctx)485*f6aab3d8Srobert SymbolFileOnDemand::FindNamespace(ConstString name,
486*f6aab3d8Srobert const CompilerDeclContext &parent_decl_ctx) {
487*f6aab3d8Srobert if (!m_debug_info_enabled) {
488*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
489*f6aab3d8Srobert __FUNCTION__, name);
490*f6aab3d8Srobert return SymbolFile::FindNamespace(name, parent_decl_ctx);
491*f6aab3d8Srobert }
492*f6aab3d8Srobert return m_sym_file_impl->FindNamespace(name, parent_decl_ctx);
493*f6aab3d8Srobert }
494*f6aab3d8Srobert
495*f6aab3d8Srobert std::vector<std::unique_ptr<lldb_private::CallEdge>>
ParseCallEdgesInFunction(UserID func_id)496*f6aab3d8Srobert SymbolFileOnDemand::ParseCallEdgesInFunction(UserID func_id) {
497*f6aab3d8Srobert if (!m_debug_info_enabled) {
498*f6aab3d8Srobert Log *log = GetLog();
499*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
500*f6aab3d8Srobert if (log) {
501*f6aab3d8Srobert std::vector<std::unique_ptr<lldb_private::CallEdge>> call_edges =
502*f6aab3d8Srobert m_sym_file_impl->ParseCallEdgesInFunction(func_id);
503*f6aab3d8Srobert if (call_edges.size() > 0) {
504*f6aab3d8Srobert LLDB_LOG(log, "{0} call edges would be parsed for {1} if hydrated.",
505*f6aab3d8Srobert call_edges.size(), func_id.GetID());
506*f6aab3d8Srobert }
507*f6aab3d8Srobert }
508*f6aab3d8Srobert return {};
509*f6aab3d8Srobert }
510*f6aab3d8Srobert return m_sym_file_impl->ParseCallEdgesInFunction(func_id);
511*f6aab3d8Srobert }
512*f6aab3d8Srobert
513*f6aab3d8Srobert lldb::UnwindPlanSP
GetUnwindPlan(const Address & address,const RegisterInfoResolver & resolver)514*f6aab3d8Srobert SymbolFileOnDemand::GetUnwindPlan(const Address &address,
515*f6aab3d8Srobert const RegisterInfoResolver &resolver) {
516*f6aab3d8Srobert if (!m_debug_info_enabled) {
517*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
518*f6aab3d8Srobert __FUNCTION__);
519*f6aab3d8Srobert return nullptr;
520*f6aab3d8Srobert }
521*f6aab3d8Srobert return m_sym_file_impl->GetUnwindPlan(address, resolver);
522*f6aab3d8Srobert }
523*f6aab3d8Srobert
524*f6aab3d8Srobert llvm::Expected<lldb::addr_t>
GetParameterStackSize(Symbol & symbol)525*f6aab3d8Srobert SymbolFileOnDemand::GetParameterStackSize(Symbol &symbol) {
526*f6aab3d8Srobert if (!m_debug_info_enabled) {
527*f6aab3d8Srobert Log *log = GetLog();
528*f6aab3d8Srobert LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
529*f6aab3d8Srobert if (log) {
530*f6aab3d8Srobert llvm::Expected<lldb::addr_t> stack_size =
531*f6aab3d8Srobert m_sym_file_impl->GetParameterStackSize(symbol);
532*f6aab3d8Srobert if (stack_size) {
533*f6aab3d8Srobert LLDB_LOG(log, "{0} stack size would return for symbol {1} if hydrated.",
534*f6aab3d8Srobert *stack_size, symbol.GetName());
535*f6aab3d8Srobert }
536*f6aab3d8Srobert }
537*f6aab3d8Srobert return SymbolFile::GetParameterStackSize(symbol);
538*f6aab3d8Srobert }
539*f6aab3d8Srobert return m_sym_file_impl->GetParameterStackSize(symbol);
540*f6aab3d8Srobert }
541*f6aab3d8Srobert
PreloadSymbols()542*f6aab3d8Srobert void SymbolFileOnDemand::PreloadSymbols() {
543*f6aab3d8Srobert m_preload_symbols = true;
544*f6aab3d8Srobert if (!m_debug_info_enabled) {
545*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
546*f6aab3d8Srobert __FUNCTION__);
547*f6aab3d8Srobert return;
548*f6aab3d8Srobert }
549*f6aab3d8Srobert return m_sym_file_impl->PreloadSymbols();
550*f6aab3d8Srobert }
551*f6aab3d8Srobert
GetDebugInfoSize()552*f6aab3d8Srobert uint64_t SymbolFileOnDemand::GetDebugInfoSize() {
553*f6aab3d8Srobert // Always return the real debug info size.
554*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
555*f6aab3d8Srobert __FUNCTION__);
556*f6aab3d8Srobert return m_sym_file_impl->GetDebugInfoSize();
557*f6aab3d8Srobert }
558*f6aab3d8Srobert
GetDebugInfoParseTime()559*f6aab3d8Srobert StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoParseTime() {
560*f6aab3d8Srobert // Always return the real parse time.
561*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
562*f6aab3d8Srobert __FUNCTION__);
563*f6aab3d8Srobert return m_sym_file_impl->GetDebugInfoParseTime();
564*f6aab3d8Srobert }
565*f6aab3d8Srobert
GetDebugInfoIndexTime()566*f6aab3d8Srobert StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoIndexTime() {
567*f6aab3d8Srobert // Always return the real index time.
568*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
569*f6aab3d8Srobert __FUNCTION__);
570*f6aab3d8Srobert return m_sym_file_impl->GetDebugInfoIndexTime();
571*f6aab3d8Srobert }
572*f6aab3d8Srobert
SetLoadDebugInfoEnabled()573*f6aab3d8Srobert void SymbolFileOnDemand::SetLoadDebugInfoEnabled() {
574*f6aab3d8Srobert if (m_debug_info_enabled)
575*f6aab3d8Srobert return;
576*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] Hydrate debug info", GetSymbolFileName());
577*f6aab3d8Srobert m_debug_info_enabled = true;
578*f6aab3d8Srobert InitializeObject();
579*f6aab3d8Srobert if (m_preload_symbols)
580*f6aab3d8Srobert PreloadSymbols();
581*f6aab3d8Srobert }
582*f6aab3d8Srobert
GetNumCompileUnits()583*f6aab3d8Srobert uint32_t SymbolFileOnDemand::GetNumCompileUnits() {
584*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
585*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
586*f6aab3d8Srobert return m_sym_file_impl->GetNumCompileUnits();
587*f6aab3d8Srobert }
588*f6aab3d8Srobert
GetCompileUnitAtIndex(uint32_t idx)589*f6aab3d8Srobert CompUnitSP SymbolFileOnDemand::GetCompileUnitAtIndex(uint32_t idx) {
590*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
591*f6aab3d8Srobert GetSymbolFileName(), __FUNCTION__);
592*f6aab3d8Srobert return m_sym_file_impl->GetCompileUnitAtIndex(idx);
593*f6aab3d8Srobert }
594*f6aab3d8Srobert
GetAbilities()595*f6aab3d8Srobert uint32_t SymbolFileOnDemand::GetAbilities() {
596*f6aab3d8Srobert if (!m_debug_info_enabled) {
597*f6aab3d8Srobert LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
598*f6aab3d8Srobert __FUNCTION__);
599*f6aab3d8Srobert return 0;
600*f6aab3d8Srobert }
601*f6aab3d8Srobert return m_sym_file_impl->GetAbilities();
602*f6aab3d8Srobert }
603