xref: /freebsd-src/contrib/llvm-project/lldb/source/Symbol/SymbolFileOnDemand.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15f757f3fSDimitry Andric //===-- SymbolFileOnDemand.cpp ---------------------------------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric 
981ad6265SDimitry Andric #include "lldb/Symbol/SymbolFileOnDemand.h"
1081ad6265SDimitry Andric 
1181ad6265SDimitry Andric #include "lldb/Core/Module.h"
1281ad6265SDimitry Andric #include "lldb/Symbol/SymbolFile.h"
1381ad6265SDimitry Andric 
1481ad6265SDimitry Andric #include <memory>
15bdd1243dSDimitry Andric #include <optional>
1681ad6265SDimitry Andric 
1781ad6265SDimitry Andric using namespace lldb;
1881ad6265SDimitry Andric using namespace lldb_private;
1981ad6265SDimitry Andric 
2081ad6265SDimitry Andric char SymbolFileOnDemand::ID;
2181ad6265SDimitry Andric 
2281ad6265SDimitry Andric SymbolFileOnDemand::SymbolFileOnDemand(
2381ad6265SDimitry Andric     std::unique_ptr<SymbolFile> &&symbol_file)
2481ad6265SDimitry Andric     : m_sym_file_impl(std::move(symbol_file)) {}
2581ad6265SDimitry Andric 
2681ad6265SDimitry Andric SymbolFileOnDemand::~SymbolFileOnDemand() = default;
2781ad6265SDimitry Andric 
2881ad6265SDimitry Andric uint32_t SymbolFileOnDemand::CalculateAbilities() {
2981ad6265SDimitry Andric   // Explicitly allow ability checking to pass though.
3081ad6265SDimitry Andric   // This should be a cheap operation.
3181ad6265SDimitry Andric   return m_sym_file_impl->CalculateAbilities();
3281ad6265SDimitry Andric }
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric std::recursive_mutex &SymbolFileOnDemand::GetModuleMutex() const {
3581ad6265SDimitry Andric   return m_sym_file_impl->GetModuleMutex();
3681ad6265SDimitry Andric }
3781ad6265SDimitry Andric 
3881ad6265SDimitry Andric void SymbolFileOnDemand::InitializeObject() {
3981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
4081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
4181ad6265SDimitry Andric              __FUNCTION__);
4281ad6265SDimitry Andric     return;
4381ad6265SDimitry Andric   }
4481ad6265SDimitry Andric   return m_sym_file_impl->InitializeObject();
4581ad6265SDimitry Andric }
4681ad6265SDimitry Andric 
4781ad6265SDimitry Andric lldb::LanguageType SymbolFileOnDemand::ParseLanguage(CompileUnit &comp_unit) {
4881ad6265SDimitry Andric   if (!m_debug_info_enabled) {
4981ad6265SDimitry Andric     Log *log = GetLog();
5081ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
5181ad6265SDimitry Andric     if (log) {
5281ad6265SDimitry Andric       lldb::LanguageType langType = m_sym_file_impl->ParseLanguage(comp_unit);
5381ad6265SDimitry Andric       if (langType != eLanguageTypeUnknown)
5481ad6265SDimitry Andric         LLDB_LOG(log, "Language {0} would return if hydrated.", langType);
5581ad6265SDimitry Andric     }
5681ad6265SDimitry Andric     return eLanguageTypeUnknown;
5781ad6265SDimitry Andric   }
5881ad6265SDimitry Andric   return m_sym_file_impl->ParseLanguage(comp_unit);
5981ad6265SDimitry Andric }
6081ad6265SDimitry Andric 
6181ad6265SDimitry Andric XcodeSDK SymbolFileOnDemand::ParseXcodeSDK(CompileUnit &comp_unit) {
6281ad6265SDimitry Andric   if (!m_debug_info_enabled) {
6381ad6265SDimitry Andric     Log *log = GetLog();
6481ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
6581ad6265SDimitry Andric     XcodeSDK defaultValue{};
6681ad6265SDimitry Andric     if (log) {
6781ad6265SDimitry Andric       XcodeSDK sdk = m_sym_file_impl->ParseXcodeSDK(comp_unit);
6881ad6265SDimitry Andric       if (!(sdk == defaultValue))
6981ad6265SDimitry Andric         LLDB_LOG(log, "SDK {0} would return if hydrated.", sdk.GetString());
7081ad6265SDimitry Andric     }
7181ad6265SDimitry Andric     return defaultValue;
7281ad6265SDimitry Andric   }
7381ad6265SDimitry Andric   return m_sym_file_impl->ParseXcodeSDK(comp_unit);
7481ad6265SDimitry Andric }
7581ad6265SDimitry Andric 
7681ad6265SDimitry Andric size_t SymbolFileOnDemand::ParseFunctions(CompileUnit &comp_unit) {
7781ad6265SDimitry Andric   if (!m_debug_info_enabled) {
7881ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
7981ad6265SDimitry Andric              __FUNCTION__);
8081ad6265SDimitry Andric     return 0;
8181ad6265SDimitry Andric   }
8281ad6265SDimitry Andric   return m_sym_file_impl->ParseFunctions(comp_unit);
8381ad6265SDimitry Andric }
8481ad6265SDimitry Andric 
8581ad6265SDimitry Andric bool SymbolFileOnDemand::ParseLineTable(CompileUnit &comp_unit) {
8681ad6265SDimitry Andric   if (!m_debug_info_enabled) {
8781ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
8881ad6265SDimitry Andric              __FUNCTION__);
8981ad6265SDimitry Andric     return false;
9081ad6265SDimitry Andric   }
9181ad6265SDimitry Andric   return m_sym_file_impl->ParseLineTable(comp_unit);
9281ad6265SDimitry Andric }
9381ad6265SDimitry Andric 
9481ad6265SDimitry Andric bool SymbolFileOnDemand::ParseDebugMacros(CompileUnit &comp_unit) {
9581ad6265SDimitry Andric   if (!m_debug_info_enabled) {
9681ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
9781ad6265SDimitry Andric              __FUNCTION__);
9881ad6265SDimitry Andric     return false;
9981ad6265SDimitry Andric   }
10081ad6265SDimitry Andric   return m_sym_file_impl->ParseDebugMacros(comp_unit);
10181ad6265SDimitry Andric }
10281ad6265SDimitry Andric 
10381ad6265SDimitry Andric bool SymbolFileOnDemand::ForEachExternalModule(
10481ad6265SDimitry Andric     CompileUnit &comp_unit,
10581ad6265SDimitry Andric     llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
10681ad6265SDimitry Andric     llvm::function_ref<bool(Module &)> lambda) {
10781ad6265SDimitry Andric   if (!m_debug_info_enabled) {
10881ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
10981ad6265SDimitry Andric              __FUNCTION__);
11081ad6265SDimitry Andric     // Return false to not early exit.
11181ad6265SDimitry Andric     return false;
11281ad6265SDimitry Andric   }
11381ad6265SDimitry Andric   return m_sym_file_impl->ForEachExternalModule(comp_unit, visited_symbol_files,
11481ad6265SDimitry Andric                                                 lambda);
11581ad6265SDimitry Andric }
11681ad6265SDimitry Andric 
11781ad6265SDimitry Andric bool SymbolFileOnDemand::ParseSupportFiles(CompileUnit &comp_unit,
1181db9f3b2SDimitry Andric                                            SupportFileList &support_files) {
11981ad6265SDimitry Andric   LLDB_LOG(GetLog(),
12081ad6265SDimitry Andric            "[{0}] {1} is not skipped: explicitly allowed to support breakpoint",
12181ad6265SDimitry Andric            GetSymbolFileName(), __FUNCTION__);
12281ad6265SDimitry Andric   // Explicitly allow this API through to support source line breakpoint.
12381ad6265SDimitry Andric   return m_sym_file_impl->ParseSupportFiles(comp_unit, support_files);
12481ad6265SDimitry Andric }
12581ad6265SDimitry Andric 
12681ad6265SDimitry Andric bool SymbolFileOnDemand::ParseIsOptimized(CompileUnit &comp_unit) {
12781ad6265SDimitry Andric   if (!m_debug_info_enabled) {
12881ad6265SDimitry Andric     Log *log = GetLog();
12981ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
13081ad6265SDimitry Andric     if (log) {
13181ad6265SDimitry Andric       bool optimized = m_sym_file_impl->ParseIsOptimized(comp_unit);
13281ad6265SDimitry Andric       if (optimized) {
13381ad6265SDimitry Andric         LLDB_LOG(log, "Would return optimized if hydrated.");
13481ad6265SDimitry Andric       }
13581ad6265SDimitry Andric     }
13681ad6265SDimitry Andric     return false;
13781ad6265SDimitry Andric   }
13881ad6265SDimitry Andric   return m_sym_file_impl->ParseIsOptimized(comp_unit);
13981ad6265SDimitry Andric }
14081ad6265SDimitry Andric 
14181ad6265SDimitry Andric size_t SymbolFileOnDemand::ParseTypes(CompileUnit &comp_unit) {
14281ad6265SDimitry Andric   if (!m_debug_info_enabled) {
14381ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
14481ad6265SDimitry Andric              __FUNCTION__);
14581ad6265SDimitry Andric     return 0;
14681ad6265SDimitry Andric   }
14781ad6265SDimitry Andric   return m_sym_file_impl->ParseTypes(comp_unit);
14881ad6265SDimitry Andric }
14981ad6265SDimitry Andric 
15081ad6265SDimitry Andric bool SymbolFileOnDemand::ParseImportedModules(
15181ad6265SDimitry Andric     const lldb_private::SymbolContext &sc,
15281ad6265SDimitry Andric     std::vector<SourceModule> &imported_modules) {
15381ad6265SDimitry Andric   if (!m_debug_info_enabled) {
15481ad6265SDimitry Andric     Log *log = GetLog();
15581ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
15681ad6265SDimitry Andric     if (log) {
15781ad6265SDimitry Andric       std::vector<SourceModule> tmp_imported_modules;
15881ad6265SDimitry Andric       bool succeed =
15981ad6265SDimitry Andric           m_sym_file_impl->ParseImportedModules(sc, tmp_imported_modules);
16081ad6265SDimitry Andric       if (succeed)
16181ad6265SDimitry Andric         LLDB_LOG(log, "{0} imported modules would be parsed if hydrated.",
16281ad6265SDimitry Andric                  tmp_imported_modules.size());
16381ad6265SDimitry Andric     }
16481ad6265SDimitry Andric     return false;
16581ad6265SDimitry Andric   }
16681ad6265SDimitry Andric   return m_sym_file_impl->ParseImportedModules(sc, imported_modules);
16781ad6265SDimitry Andric }
16881ad6265SDimitry Andric 
16981ad6265SDimitry Andric size_t SymbolFileOnDemand::ParseBlocksRecursive(Function &func) {
17081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
17181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
17281ad6265SDimitry Andric              __FUNCTION__);
17381ad6265SDimitry Andric     return 0;
17481ad6265SDimitry Andric   }
17581ad6265SDimitry Andric   return m_sym_file_impl->ParseBlocksRecursive(func);
17681ad6265SDimitry Andric }
17781ad6265SDimitry Andric 
17881ad6265SDimitry Andric size_t SymbolFileOnDemand::ParseVariablesForContext(const SymbolContext &sc) {
17981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
18081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
18181ad6265SDimitry Andric              __FUNCTION__);
18281ad6265SDimitry Andric     return 0;
18381ad6265SDimitry Andric   }
18481ad6265SDimitry Andric   return m_sym_file_impl->ParseVariablesForContext(sc);
18581ad6265SDimitry Andric }
18681ad6265SDimitry Andric 
18781ad6265SDimitry Andric Type *SymbolFileOnDemand::ResolveTypeUID(lldb::user_id_t type_uid) {
18881ad6265SDimitry Andric   if (!m_debug_info_enabled) {
18981ad6265SDimitry Andric     Log *log = GetLog();
19081ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
19181ad6265SDimitry Andric     if (log) {
19281ad6265SDimitry Andric       Type *resolved_type = m_sym_file_impl->ResolveTypeUID(type_uid);
19381ad6265SDimitry Andric       if (resolved_type)
19481ad6265SDimitry Andric         LLDB_LOG(log, "Type would be parsed for {0} if hydrated.", type_uid);
19581ad6265SDimitry Andric     }
19681ad6265SDimitry Andric     return nullptr;
19781ad6265SDimitry Andric   }
19881ad6265SDimitry Andric   return m_sym_file_impl->ResolveTypeUID(type_uid);
19981ad6265SDimitry Andric }
20081ad6265SDimitry Andric 
201bdd1243dSDimitry Andric std::optional<SymbolFile::ArrayInfo>
20281ad6265SDimitry Andric SymbolFileOnDemand::GetDynamicArrayInfoForUID(
20381ad6265SDimitry Andric     lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) {
20481ad6265SDimitry Andric   if (!m_debug_info_enabled) {
20581ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
20681ad6265SDimitry Andric              __FUNCTION__);
207bdd1243dSDimitry Andric     return std::nullopt;
20881ad6265SDimitry Andric   }
20981ad6265SDimitry Andric   return m_sym_file_impl->GetDynamicArrayInfoForUID(type_uid, exe_ctx);
21081ad6265SDimitry Andric }
21181ad6265SDimitry Andric 
21281ad6265SDimitry Andric bool SymbolFileOnDemand::CompleteType(CompilerType &compiler_type) {
21381ad6265SDimitry Andric   if (!m_debug_info_enabled) {
21481ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
21581ad6265SDimitry Andric              __FUNCTION__);
21681ad6265SDimitry Andric     return false;
21781ad6265SDimitry Andric   }
21881ad6265SDimitry Andric   return m_sym_file_impl->CompleteType(compiler_type);
21981ad6265SDimitry Andric }
22081ad6265SDimitry Andric 
22181ad6265SDimitry Andric CompilerDecl SymbolFileOnDemand::GetDeclForUID(lldb::user_id_t type_uid) {
22281ad6265SDimitry Andric   if (!m_debug_info_enabled) {
22381ad6265SDimitry Andric     Log *log = GetLog();
22481ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
22581ad6265SDimitry Andric     if (log) {
22681ad6265SDimitry Andric       CompilerDecl parsed_decl = m_sym_file_impl->GetDeclForUID(type_uid);
22781ad6265SDimitry Andric       if (parsed_decl != CompilerDecl()) {
22881ad6265SDimitry Andric         LLDB_LOG(log, "CompilerDecl {0} would be parsed for {1} if hydrated.",
22981ad6265SDimitry Andric                  parsed_decl.GetName(), type_uid);
23081ad6265SDimitry Andric       }
23181ad6265SDimitry Andric     }
23281ad6265SDimitry Andric     return CompilerDecl();
23381ad6265SDimitry Andric   }
23481ad6265SDimitry Andric   return m_sym_file_impl->GetDeclForUID(type_uid);
23581ad6265SDimitry Andric }
23681ad6265SDimitry Andric 
23781ad6265SDimitry Andric CompilerDeclContext
23881ad6265SDimitry Andric SymbolFileOnDemand::GetDeclContextForUID(lldb::user_id_t type_uid) {
23981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
24081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
24181ad6265SDimitry Andric              __FUNCTION__);
24281ad6265SDimitry Andric     return CompilerDeclContext();
24381ad6265SDimitry Andric   }
24481ad6265SDimitry Andric   return m_sym_file_impl->GetDeclContextForUID(type_uid);
24581ad6265SDimitry Andric }
24681ad6265SDimitry Andric 
24781ad6265SDimitry Andric CompilerDeclContext
24881ad6265SDimitry Andric SymbolFileOnDemand::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
24981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
25081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
25181ad6265SDimitry Andric              __FUNCTION__);
25281ad6265SDimitry Andric     return CompilerDeclContext();
25381ad6265SDimitry Andric   }
25481ad6265SDimitry Andric   return m_sym_file_impl->GetDeclContextContainingUID(type_uid);
25581ad6265SDimitry Andric }
25681ad6265SDimitry Andric 
25781ad6265SDimitry Andric void SymbolFileOnDemand::ParseDeclsForContext(CompilerDeclContext decl_ctx) {
25881ad6265SDimitry Andric   if (!m_debug_info_enabled) {
25981ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
26081ad6265SDimitry Andric              __FUNCTION__);
26181ad6265SDimitry Andric     return;
26281ad6265SDimitry Andric   }
26381ad6265SDimitry Andric   return m_sym_file_impl->ParseDeclsForContext(decl_ctx);
26481ad6265SDimitry Andric }
26581ad6265SDimitry Andric 
26681ad6265SDimitry Andric uint32_t
26781ad6265SDimitry Andric SymbolFileOnDemand::ResolveSymbolContext(const Address &so_addr,
26881ad6265SDimitry Andric                                          SymbolContextItem resolve_scope,
26981ad6265SDimitry Andric                                          SymbolContext &sc) {
27081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
27181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
27281ad6265SDimitry Andric              __FUNCTION__);
27381ad6265SDimitry Andric     return 0;
27481ad6265SDimitry Andric   }
27581ad6265SDimitry Andric   return m_sym_file_impl->ResolveSymbolContext(so_addr, resolve_scope, sc);
27681ad6265SDimitry Andric }
27781ad6265SDimitry Andric 
278bdd1243dSDimitry Andric Status SymbolFileOnDemand::CalculateFrameVariableError(StackFrame &frame) {
279bdd1243dSDimitry Andric   if (!m_debug_info_enabled) {
280bdd1243dSDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
281bdd1243dSDimitry Andric              __FUNCTION__);
282bdd1243dSDimitry Andric     return Status();
283bdd1243dSDimitry Andric   }
284bdd1243dSDimitry Andric   return m_sym_file_impl->CalculateFrameVariableError(frame);
285bdd1243dSDimitry Andric }
286bdd1243dSDimitry Andric 
28781ad6265SDimitry Andric uint32_t SymbolFileOnDemand::ResolveSymbolContext(
28881ad6265SDimitry Andric     const SourceLocationSpec &src_location_spec,
28981ad6265SDimitry Andric     SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
29081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
29181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
29281ad6265SDimitry Andric              __FUNCTION__);
29381ad6265SDimitry Andric     return 0;
29481ad6265SDimitry Andric   }
29581ad6265SDimitry Andric   return m_sym_file_impl->ResolveSymbolContext(src_location_spec, resolve_scope,
29681ad6265SDimitry Andric                                                sc_list);
29781ad6265SDimitry Andric }
29881ad6265SDimitry Andric 
29981ad6265SDimitry Andric void SymbolFileOnDemand::Dump(lldb_private::Stream &s) {
30081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
30181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
30281ad6265SDimitry Andric              __FUNCTION__);
30381ad6265SDimitry Andric     return;
30481ad6265SDimitry Andric   }
30581ad6265SDimitry Andric   return m_sym_file_impl->Dump(s);
30681ad6265SDimitry Andric }
30781ad6265SDimitry Andric 
30881ad6265SDimitry Andric void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s) {
30981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
31081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
31181ad6265SDimitry Andric              __FUNCTION__);
31281ad6265SDimitry Andric     return;
31381ad6265SDimitry Andric   }
31481ad6265SDimitry Andric   return m_sym_file_impl->DumpClangAST(s);
31581ad6265SDimitry Andric }
31681ad6265SDimitry Andric 
31781ad6265SDimitry Andric void SymbolFileOnDemand::FindGlobalVariables(const RegularExpression &regex,
31881ad6265SDimitry Andric                                              uint32_t max_matches,
31981ad6265SDimitry Andric                                              VariableList &variables) {
32081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
32181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
32281ad6265SDimitry Andric              __FUNCTION__);
32381ad6265SDimitry Andric     return;
32481ad6265SDimitry Andric   }
32581ad6265SDimitry Andric   return m_sym_file_impl->FindGlobalVariables(regex, max_matches, variables);
32681ad6265SDimitry Andric }
32781ad6265SDimitry Andric 
32881ad6265SDimitry Andric void SymbolFileOnDemand::FindGlobalVariables(
32981ad6265SDimitry Andric     ConstString name, const CompilerDeclContext &parent_decl_ctx,
33081ad6265SDimitry Andric     uint32_t max_matches, VariableList &variables) {
33181ad6265SDimitry Andric   if (!m_debug_info_enabled) {
33281ad6265SDimitry Andric     Log *log = GetLog();
33381ad6265SDimitry Andric     Symtab *symtab = GetSymtab();
33481ad6265SDimitry Andric     if (!symtab) {
33581ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
33681ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__);
33781ad6265SDimitry Andric       return;
33881ad6265SDimitry Andric     }
33981ad6265SDimitry Andric     Symbol *sym = symtab->FindFirstSymbolWithNameAndType(
34081ad6265SDimitry Andric         name, eSymbolTypeData, Symtab::eDebugAny, Symtab::eVisibilityAny);
34181ad6265SDimitry Andric     if (!sym) {
34281ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
34381ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__);
34481ad6265SDimitry Andric       return;
34581ad6265SDimitry Andric     }
34681ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
34781ad6265SDimitry Andric              GetSymbolFileName(), __FUNCTION__);
34881ad6265SDimitry Andric 
34981ad6265SDimitry Andric     // Found match in symbol table hydrate debug info and
35081ad6265SDimitry Andric     // allow the FindGlobalVariables to go through.
35181ad6265SDimitry Andric     SetLoadDebugInfoEnabled();
35281ad6265SDimitry Andric   }
35381ad6265SDimitry Andric   return m_sym_file_impl->FindGlobalVariables(name, parent_decl_ctx,
35481ad6265SDimitry Andric                                               max_matches, variables);
35581ad6265SDimitry Andric }
35681ad6265SDimitry Andric 
35781ad6265SDimitry Andric void SymbolFileOnDemand::FindFunctions(const RegularExpression &regex,
35881ad6265SDimitry Andric                                        bool include_inlines,
35981ad6265SDimitry Andric                                        SymbolContextList &sc_list) {
36081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
36181ad6265SDimitry Andric     Log *log = GetLog();
36281ad6265SDimitry Andric     Symtab *symtab = GetSymtab();
36381ad6265SDimitry Andric     if (!symtab) {
36481ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
36581ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__);
36681ad6265SDimitry Andric       return;
36781ad6265SDimitry Andric     }
36881ad6265SDimitry Andric     std::vector<uint32_t> symbol_indexes;
36981ad6265SDimitry Andric     symtab->AppendSymbolIndexesMatchingRegExAndType(
37081ad6265SDimitry Andric         regex, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny,
37181ad6265SDimitry Andric         symbol_indexes);
37281ad6265SDimitry Andric     if (symbol_indexes.empty()) {
37381ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
37481ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__);
37581ad6265SDimitry Andric       return;
37681ad6265SDimitry Andric     }
37781ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
37881ad6265SDimitry Andric              GetSymbolFileName(), __FUNCTION__);
37981ad6265SDimitry Andric 
38081ad6265SDimitry Andric     // Found match in symbol table hydrate debug info and
38181ad6265SDimitry Andric     // allow the FindFucntions to go through.
38281ad6265SDimitry Andric     SetLoadDebugInfoEnabled();
38381ad6265SDimitry Andric   }
38481ad6265SDimitry Andric   return m_sym_file_impl->FindFunctions(regex, include_inlines, sc_list);
38581ad6265SDimitry Andric }
38681ad6265SDimitry Andric 
38781ad6265SDimitry Andric void SymbolFileOnDemand::FindFunctions(
388bdd1243dSDimitry Andric     const Module::LookupInfo &lookup_info,
389bdd1243dSDimitry Andric     const CompilerDeclContext &parent_decl_ctx, bool include_inlines,
39081ad6265SDimitry Andric     SymbolContextList &sc_list) {
391bdd1243dSDimitry Andric   ConstString name = lookup_info.GetLookupName();
392bdd1243dSDimitry Andric   FunctionNameType name_type_mask = lookup_info.GetNameTypeMask();
39381ad6265SDimitry Andric   if (!m_debug_info_enabled) {
39481ad6265SDimitry Andric     Log *log = GetLog();
39581ad6265SDimitry Andric 
39681ad6265SDimitry Andric     Symtab *symtab = GetSymtab();
39781ad6265SDimitry Andric     if (!symtab) {
39881ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1}({2}) is skipped  - fail to get symtab",
39981ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__, name);
40081ad6265SDimitry Andric       return;
40181ad6265SDimitry Andric     }
40281ad6265SDimitry Andric 
40381ad6265SDimitry Andric     SymbolContextList sc_list_helper;
40481ad6265SDimitry Andric     symtab->FindFunctionSymbols(name, name_type_mask, sc_list_helper);
40581ad6265SDimitry Andric     if (sc_list_helper.GetSize() == 0) {
40681ad6265SDimitry Andric       LLDB_LOG(log, "[{0}] {1}({2}) is skipped - fail to find match in symtab",
40781ad6265SDimitry Andric                GetSymbolFileName(), __FUNCTION__, name);
40881ad6265SDimitry Andric       return;
40981ad6265SDimitry Andric     }
41081ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1}({2}) is NOT skipped - found match in symtab",
41181ad6265SDimitry Andric              GetSymbolFileName(), __FUNCTION__, name);
41281ad6265SDimitry Andric 
41381ad6265SDimitry Andric     // Found match in symbol table hydrate debug info and
41481ad6265SDimitry Andric     // allow the FindFucntions to go through.
41581ad6265SDimitry Andric     SetLoadDebugInfoEnabled();
41681ad6265SDimitry Andric   }
417bdd1243dSDimitry Andric   return m_sym_file_impl->FindFunctions(lookup_info, parent_decl_ctx,
41881ad6265SDimitry Andric                                         include_inlines, sc_list);
41981ad6265SDimitry Andric }
42081ad6265SDimitry Andric 
42181ad6265SDimitry Andric void SymbolFileOnDemand::GetMangledNamesForFunction(
42281ad6265SDimitry Andric     const std::string &scope_qualified_name,
42381ad6265SDimitry Andric     std::vector<ConstString> &mangled_names) {
42481ad6265SDimitry Andric   if (!m_debug_info_enabled) {
42581ad6265SDimitry Andric     Log *log = GetLog();
42681ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
42781ad6265SDimitry Andric              __FUNCTION__, scope_qualified_name);
42881ad6265SDimitry Andric     return;
42981ad6265SDimitry Andric   }
43081ad6265SDimitry Andric   return m_sym_file_impl->GetMangledNamesForFunction(scope_qualified_name,
43181ad6265SDimitry Andric                                                      mangled_names);
43281ad6265SDimitry Andric }
43381ad6265SDimitry Andric 
4345f757f3fSDimitry Andric void SymbolFileOnDemand::FindTypes(const TypeQuery &match,
4355f757f3fSDimitry Andric                                    TypeResults &results) {
43681ad6265SDimitry Andric   if (!m_debug_info_enabled) {
43781ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
43881ad6265SDimitry Andric              __FUNCTION__);
43981ad6265SDimitry Andric     return;
44081ad6265SDimitry Andric   }
4415f757f3fSDimitry Andric   return m_sym_file_impl->FindTypes(match, results);
44281ad6265SDimitry Andric }
44381ad6265SDimitry Andric 
44481ad6265SDimitry Andric void SymbolFileOnDemand::GetTypes(SymbolContextScope *sc_scope,
44581ad6265SDimitry Andric                                   TypeClass type_mask, TypeList &type_list) {
44681ad6265SDimitry Andric   if (!m_debug_info_enabled) {
44781ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
44881ad6265SDimitry Andric              __FUNCTION__);
44981ad6265SDimitry Andric     return;
45081ad6265SDimitry Andric   }
45181ad6265SDimitry Andric   return m_sym_file_impl->GetTypes(sc_scope, type_mask, type_list);
45281ad6265SDimitry Andric }
45381ad6265SDimitry Andric 
454bdd1243dSDimitry Andric llvm::Expected<lldb::TypeSystemSP>
45581ad6265SDimitry Andric SymbolFileOnDemand::GetTypeSystemForLanguage(LanguageType language) {
45681ad6265SDimitry Andric   if (!m_debug_info_enabled) {
45781ad6265SDimitry Andric     Log *log = GetLog();
45881ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped for language type {2}",
45981ad6265SDimitry Andric              GetSymbolFileName(), __FUNCTION__, language);
460*0fca6ea1SDimitry Andric     return llvm::createStringError(
461*0fca6ea1SDimitry Andric         "GetTypeSystemForLanguage is skipped by SymbolFileOnDemand");
46281ad6265SDimitry Andric   }
46381ad6265SDimitry Andric   return m_sym_file_impl->GetTypeSystemForLanguage(language);
46481ad6265SDimitry Andric }
46581ad6265SDimitry Andric 
46681ad6265SDimitry Andric CompilerDeclContext
46781ad6265SDimitry Andric SymbolFileOnDemand::FindNamespace(ConstString name,
46806c3fb27SDimitry Andric                                   const CompilerDeclContext &parent_decl_ctx,
46906c3fb27SDimitry Andric                                   bool only_root_namespaces) {
47081ad6265SDimitry Andric   if (!m_debug_info_enabled) {
47181ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
47281ad6265SDimitry Andric              __FUNCTION__, name);
47306c3fb27SDimitry Andric     return SymbolFile::FindNamespace(name, parent_decl_ctx,
47406c3fb27SDimitry Andric                                      only_root_namespaces);
47581ad6265SDimitry Andric   }
47606c3fb27SDimitry Andric   return m_sym_file_impl->FindNamespace(name, parent_decl_ctx,
47706c3fb27SDimitry Andric                                         only_root_namespaces);
47881ad6265SDimitry Andric }
47981ad6265SDimitry Andric 
48081ad6265SDimitry Andric std::vector<std::unique_ptr<lldb_private::CallEdge>>
48181ad6265SDimitry Andric SymbolFileOnDemand::ParseCallEdgesInFunction(UserID func_id) {
48281ad6265SDimitry Andric   if (!m_debug_info_enabled) {
48381ad6265SDimitry Andric     Log *log = GetLog();
48481ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
48581ad6265SDimitry Andric     if (log) {
48681ad6265SDimitry Andric       std::vector<std::unique_ptr<lldb_private::CallEdge>> call_edges =
48781ad6265SDimitry Andric           m_sym_file_impl->ParseCallEdgesInFunction(func_id);
48881ad6265SDimitry Andric       if (call_edges.size() > 0) {
48981ad6265SDimitry Andric         LLDB_LOG(log, "{0} call edges would be parsed for {1} if hydrated.",
49081ad6265SDimitry Andric                  call_edges.size(), func_id.GetID());
49181ad6265SDimitry Andric       }
49281ad6265SDimitry Andric     }
49381ad6265SDimitry Andric     return {};
49481ad6265SDimitry Andric   }
49581ad6265SDimitry Andric   return m_sym_file_impl->ParseCallEdgesInFunction(func_id);
49681ad6265SDimitry Andric }
49781ad6265SDimitry Andric 
49881ad6265SDimitry Andric lldb::UnwindPlanSP
49981ad6265SDimitry Andric SymbolFileOnDemand::GetUnwindPlan(const Address &address,
50081ad6265SDimitry Andric                                   const RegisterInfoResolver &resolver) {
50181ad6265SDimitry Andric   if (!m_debug_info_enabled) {
50281ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
50381ad6265SDimitry Andric              __FUNCTION__);
50481ad6265SDimitry Andric     return nullptr;
50581ad6265SDimitry Andric   }
50681ad6265SDimitry Andric   return m_sym_file_impl->GetUnwindPlan(address, resolver);
50781ad6265SDimitry Andric }
50881ad6265SDimitry Andric 
50981ad6265SDimitry Andric llvm::Expected<lldb::addr_t>
51081ad6265SDimitry Andric SymbolFileOnDemand::GetParameterStackSize(Symbol &symbol) {
51181ad6265SDimitry Andric   if (!m_debug_info_enabled) {
51281ad6265SDimitry Andric     Log *log = GetLog();
51381ad6265SDimitry Andric     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
51481ad6265SDimitry Andric     if (log) {
51581ad6265SDimitry Andric       llvm::Expected<lldb::addr_t> stack_size =
51681ad6265SDimitry Andric           m_sym_file_impl->GetParameterStackSize(symbol);
51781ad6265SDimitry Andric       if (stack_size) {
51881ad6265SDimitry Andric         LLDB_LOG(log, "{0} stack size would return for symbol {1} if hydrated.",
51981ad6265SDimitry Andric                  *stack_size, symbol.GetName());
52081ad6265SDimitry Andric       }
52181ad6265SDimitry Andric     }
52281ad6265SDimitry Andric     return SymbolFile::GetParameterStackSize(symbol);
52381ad6265SDimitry Andric   }
52481ad6265SDimitry Andric   return m_sym_file_impl->GetParameterStackSize(symbol);
52581ad6265SDimitry Andric }
52681ad6265SDimitry Andric 
52781ad6265SDimitry Andric void SymbolFileOnDemand::PreloadSymbols() {
52881ad6265SDimitry Andric   m_preload_symbols = true;
52981ad6265SDimitry Andric   if (!m_debug_info_enabled) {
53081ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
53181ad6265SDimitry Andric              __FUNCTION__);
53281ad6265SDimitry Andric     return;
53381ad6265SDimitry Andric   }
53481ad6265SDimitry Andric   return m_sym_file_impl->PreloadSymbols();
53581ad6265SDimitry Andric }
53681ad6265SDimitry Andric 
537*0fca6ea1SDimitry Andric uint64_t SymbolFileOnDemand::GetDebugInfoSize(bool load_all_debug_info) {
53881ad6265SDimitry Andric   // Always return the real debug info size.
53981ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
54081ad6265SDimitry Andric            __FUNCTION__);
541*0fca6ea1SDimitry Andric   return m_sym_file_impl->GetDebugInfoSize(load_all_debug_info);
54281ad6265SDimitry Andric }
54381ad6265SDimitry Andric 
54481ad6265SDimitry Andric StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoParseTime() {
54581ad6265SDimitry Andric   // Always return the real parse time.
54681ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
54781ad6265SDimitry Andric            __FUNCTION__);
54881ad6265SDimitry Andric   return m_sym_file_impl->GetDebugInfoParseTime();
54981ad6265SDimitry Andric }
55081ad6265SDimitry Andric 
55181ad6265SDimitry Andric StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoIndexTime() {
55281ad6265SDimitry Andric   // Always return the real index time.
55381ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
55481ad6265SDimitry Andric            __FUNCTION__);
55581ad6265SDimitry Andric   return m_sym_file_impl->GetDebugInfoIndexTime();
55681ad6265SDimitry Andric }
55781ad6265SDimitry Andric 
55881ad6265SDimitry Andric void SymbolFileOnDemand::SetLoadDebugInfoEnabled() {
55981ad6265SDimitry Andric   if (m_debug_info_enabled)
56081ad6265SDimitry Andric     return;
56181ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] Hydrate debug info", GetSymbolFileName());
56281ad6265SDimitry Andric   m_debug_info_enabled = true;
56381ad6265SDimitry Andric   InitializeObject();
56481ad6265SDimitry Andric   if (m_preload_symbols)
56581ad6265SDimitry Andric     PreloadSymbols();
56681ad6265SDimitry Andric }
56781ad6265SDimitry Andric 
56881ad6265SDimitry Andric uint32_t SymbolFileOnDemand::GetNumCompileUnits() {
56981ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
57081ad6265SDimitry Andric            GetSymbolFileName(), __FUNCTION__);
57181ad6265SDimitry Andric   return m_sym_file_impl->GetNumCompileUnits();
57281ad6265SDimitry Andric }
57381ad6265SDimitry Andric 
57481ad6265SDimitry Andric CompUnitSP SymbolFileOnDemand::GetCompileUnitAtIndex(uint32_t idx) {
57581ad6265SDimitry Andric   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
57681ad6265SDimitry Andric            GetSymbolFileName(), __FUNCTION__);
57781ad6265SDimitry Andric   return m_sym_file_impl->GetCompileUnitAtIndex(idx);
57881ad6265SDimitry Andric }
57981ad6265SDimitry Andric 
58081ad6265SDimitry Andric uint32_t SymbolFileOnDemand::GetAbilities() {
58181ad6265SDimitry Andric   if (!m_debug_info_enabled) {
58281ad6265SDimitry Andric     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
58381ad6265SDimitry Andric              __FUNCTION__);
58481ad6265SDimitry Andric     return 0;
58581ad6265SDimitry Andric   }
58681ad6265SDimitry Andric   return m_sym_file_impl->GetAbilities();
58781ad6265SDimitry Andric }
588