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 ®ex, 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 ®ex, 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