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