17b81192dSJeffrey Tan //===-- SymbolFileDWARFDebugMap.cpp ---------------------------------------===//
27b81192dSJeffrey Tan //
37b81192dSJeffrey Tan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47b81192dSJeffrey Tan // See https://llvm.org/LICENSE.txt for license information.
57b81192dSJeffrey Tan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67b81192dSJeffrey Tan //
77b81192dSJeffrey Tan //===----------------------------------------------------------------------===//
87b81192dSJeffrey Tan 
97b81192dSJeffrey Tan #include "lldb/Symbol/SymbolFileOnDemand.h"
107b81192dSJeffrey Tan 
117b81192dSJeffrey Tan #include "lldb/Core/Module.h"
127b81192dSJeffrey Tan #include "lldb/Symbol/SymbolFile.h"
137b81192dSJeffrey Tan 
147b81192dSJeffrey Tan #include <memory>
157b81192dSJeffrey Tan 
167b81192dSJeffrey Tan using namespace lldb;
177b81192dSJeffrey Tan using namespace lldb_private;
187b81192dSJeffrey Tan 
197b81192dSJeffrey Tan char SymbolFileOnDemand::ID;
207b81192dSJeffrey Tan 
SymbolFileOnDemand(std::unique_ptr<SymbolFile> && symbol_file)217b81192dSJeffrey Tan SymbolFileOnDemand::SymbolFileOnDemand(
227b81192dSJeffrey Tan     std::unique_ptr<SymbolFile> &&symbol_file)
237b81192dSJeffrey Tan     : m_sym_file_impl(std::move(symbol_file)) {}
247b81192dSJeffrey Tan 
25*91688716SJonas Devlieghere SymbolFileOnDemand::~SymbolFileOnDemand() = default;
267b81192dSJeffrey Tan 
CalculateAbilities()277b81192dSJeffrey Tan uint32_t SymbolFileOnDemand::CalculateAbilities() {
287b81192dSJeffrey Tan   // Explicitly allow ability checking to pass though.
297b81192dSJeffrey Tan   // This should be a cheap operation.
307b81192dSJeffrey Tan   return m_sym_file_impl->CalculateAbilities();
317b81192dSJeffrey Tan }
327b81192dSJeffrey Tan 
GetModuleMutex() const337b81192dSJeffrey Tan std::recursive_mutex &SymbolFileOnDemand::GetModuleMutex() const {
347b81192dSJeffrey Tan   return m_sym_file_impl->GetModuleMutex();
357b81192dSJeffrey Tan }
367b81192dSJeffrey Tan 
InitializeObject()377b81192dSJeffrey Tan void SymbolFileOnDemand::InitializeObject() {
387b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
397b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
407b81192dSJeffrey Tan              __FUNCTION__);
417b81192dSJeffrey Tan     return;
427b81192dSJeffrey Tan   }
437b81192dSJeffrey Tan   return m_sym_file_impl->InitializeObject();
447b81192dSJeffrey Tan }
457b81192dSJeffrey Tan 
ParseLanguage(CompileUnit & comp_unit)467b81192dSJeffrey Tan lldb::LanguageType SymbolFileOnDemand::ParseLanguage(CompileUnit &comp_unit) {
477b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
487b81192dSJeffrey Tan     Log *log = GetLog();
497b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
507b81192dSJeffrey Tan     if (log) {
517b81192dSJeffrey Tan       lldb::LanguageType langType = m_sym_file_impl->ParseLanguage(comp_unit);
527b81192dSJeffrey Tan       if (langType != eLanguageTypeUnknown)
537b81192dSJeffrey Tan         LLDB_LOG(log, "Language {0} would return if hydrated.", langType);
547b81192dSJeffrey Tan     }
557b81192dSJeffrey Tan     return eLanguageTypeUnknown;
567b81192dSJeffrey Tan   }
577b81192dSJeffrey Tan   return m_sym_file_impl->ParseLanguage(comp_unit);
587b81192dSJeffrey Tan }
597b81192dSJeffrey Tan 
ParseXcodeSDK(CompileUnit & comp_unit)607b81192dSJeffrey Tan XcodeSDK SymbolFileOnDemand::ParseXcodeSDK(CompileUnit &comp_unit) {
617b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
627b81192dSJeffrey Tan     Log *log = GetLog();
637b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
647b81192dSJeffrey Tan     XcodeSDK defaultValue{};
657b81192dSJeffrey Tan     if (log) {
667b81192dSJeffrey Tan       XcodeSDK sdk = m_sym_file_impl->ParseXcodeSDK(comp_unit);
677b81192dSJeffrey Tan       if (!(sdk == defaultValue))
687b81192dSJeffrey Tan         LLDB_LOG(log, "SDK {0} would return if hydrated.", sdk.GetString());
697b81192dSJeffrey Tan     }
707b81192dSJeffrey Tan     return defaultValue;
717b81192dSJeffrey Tan   }
727b81192dSJeffrey Tan   return m_sym_file_impl->ParseXcodeSDK(comp_unit);
737b81192dSJeffrey Tan }
747b81192dSJeffrey Tan 
ParseFunctions(CompileUnit & comp_unit)757b81192dSJeffrey Tan size_t SymbolFileOnDemand::ParseFunctions(CompileUnit &comp_unit) {
767b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
777b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
787b81192dSJeffrey Tan              __FUNCTION__);
797b81192dSJeffrey Tan     return 0;
807b81192dSJeffrey Tan   }
817b81192dSJeffrey Tan   return m_sym_file_impl->ParseFunctions(comp_unit);
827b81192dSJeffrey Tan }
837b81192dSJeffrey Tan 
ParseLineTable(CompileUnit & comp_unit)847b81192dSJeffrey Tan bool SymbolFileOnDemand::ParseLineTable(CompileUnit &comp_unit) {
857b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
867b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
877b81192dSJeffrey Tan              __FUNCTION__);
887b81192dSJeffrey Tan     return false;
897b81192dSJeffrey Tan   }
907b81192dSJeffrey Tan   return m_sym_file_impl->ParseLineTable(comp_unit);
917b81192dSJeffrey Tan }
927b81192dSJeffrey Tan 
ParseDebugMacros(CompileUnit & comp_unit)937b81192dSJeffrey Tan bool SymbolFileOnDemand::ParseDebugMacros(CompileUnit &comp_unit) {
947b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
957b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
967b81192dSJeffrey Tan              __FUNCTION__);
977b81192dSJeffrey Tan     return false;
987b81192dSJeffrey Tan   }
997b81192dSJeffrey Tan   return m_sym_file_impl->ParseDebugMacros(comp_unit);
1007b81192dSJeffrey Tan }
1017b81192dSJeffrey Tan 
ForEachExternalModule(CompileUnit & comp_unit,llvm::DenseSet<lldb_private::SymbolFile * > & visited_symbol_files,llvm::function_ref<bool (Module &)> lambda)1027b81192dSJeffrey Tan bool SymbolFileOnDemand::ForEachExternalModule(
1037b81192dSJeffrey Tan     CompileUnit &comp_unit,
1047b81192dSJeffrey Tan     llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
1057b81192dSJeffrey Tan     llvm::function_ref<bool(Module &)> lambda) {
1067b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1077b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
1087b81192dSJeffrey Tan              __FUNCTION__);
1097b81192dSJeffrey Tan     // Return false to not early exit.
1107b81192dSJeffrey Tan     return false;
1117b81192dSJeffrey Tan   }
1127b81192dSJeffrey Tan   return m_sym_file_impl->ForEachExternalModule(comp_unit, visited_symbol_files,
1137b81192dSJeffrey Tan                                                 lambda);
1147b81192dSJeffrey Tan }
1157b81192dSJeffrey Tan 
ParseSupportFiles(CompileUnit & comp_unit,FileSpecList & support_files)1167b81192dSJeffrey Tan bool SymbolFileOnDemand::ParseSupportFiles(CompileUnit &comp_unit,
1177b81192dSJeffrey Tan                                            FileSpecList &support_files) {
1187b81192dSJeffrey Tan   LLDB_LOG(GetLog(),
1197b81192dSJeffrey Tan            "[{0}] {1} is not skipped: explicitly allowed to support breakpoint",
1207b81192dSJeffrey Tan            GetSymbolFileName(), __FUNCTION__);
1217b81192dSJeffrey Tan   // Explicitly allow this API through to support source line breakpoint.
1227b81192dSJeffrey Tan   return m_sym_file_impl->ParseSupportFiles(comp_unit, support_files);
1237b81192dSJeffrey Tan }
1247b81192dSJeffrey Tan 
ParseIsOptimized(CompileUnit & comp_unit)1257b81192dSJeffrey Tan bool SymbolFileOnDemand::ParseIsOptimized(CompileUnit &comp_unit) {
1267b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1277b81192dSJeffrey Tan     Log *log = GetLog();
1287b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
1297b81192dSJeffrey Tan     if (log) {
1307b81192dSJeffrey Tan       bool optimized = m_sym_file_impl->ParseIsOptimized(comp_unit);
1317b81192dSJeffrey Tan       if (optimized) {
1327b81192dSJeffrey Tan         LLDB_LOG(log, "Would return optimized if hydrated.");
1337b81192dSJeffrey Tan       }
1347b81192dSJeffrey Tan     }
1357b81192dSJeffrey Tan     return false;
1367b81192dSJeffrey Tan   }
1377b81192dSJeffrey Tan   return m_sym_file_impl->ParseIsOptimized(comp_unit);
1387b81192dSJeffrey Tan }
1397b81192dSJeffrey Tan 
ParseTypes(CompileUnit & comp_unit)1407b81192dSJeffrey Tan size_t SymbolFileOnDemand::ParseTypes(CompileUnit &comp_unit) {
1417b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1427b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
1437b81192dSJeffrey Tan              __FUNCTION__);
1447b81192dSJeffrey Tan     return 0;
1457b81192dSJeffrey Tan   }
1467b81192dSJeffrey Tan   return m_sym_file_impl->ParseTypes(comp_unit);
1477b81192dSJeffrey Tan }
1487b81192dSJeffrey Tan 
ParseImportedModules(const lldb_private::SymbolContext & sc,std::vector<SourceModule> & imported_modules)1497b81192dSJeffrey Tan bool SymbolFileOnDemand::ParseImportedModules(
1507b81192dSJeffrey Tan     const lldb_private::SymbolContext &sc,
1517b81192dSJeffrey Tan     std::vector<SourceModule> &imported_modules) {
1527b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1537b81192dSJeffrey Tan     Log *log = GetLog();
1547b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
1557b81192dSJeffrey Tan     if (log) {
1567b81192dSJeffrey Tan       std::vector<SourceModule> tmp_imported_modules;
1577b81192dSJeffrey Tan       bool succeed =
1587b81192dSJeffrey Tan           m_sym_file_impl->ParseImportedModules(sc, tmp_imported_modules);
1597b81192dSJeffrey Tan       if (succeed)
1607b81192dSJeffrey Tan         LLDB_LOG(log, "{0} imported modules would be parsed if hydrated.",
1617b81192dSJeffrey Tan                  tmp_imported_modules.size());
1627b81192dSJeffrey Tan     }
1637b81192dSJeffrey Tan     return false;
1647b81192dSJeffrey Tan   }
1657b81192dSJeffrey Tan   return m_sym_file_impl->ParseImportedModules(sc, imported_modules);
1667b81192dSJeffrey Tan }
1677b81192dSJeffrey Tan 
ParseBlocksRecursive(Function & func)1687b81192dSJeffrey Tan size_t SymbolFileOnDemand::ParseBlocksRecursive(Function &func) {
1697b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1707b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
1717b81192dSJeffrey Tan              __FUNCTION__);
1727b81192dSJeffrey Tan     return 0;
1737b81192dSJeffrey Tan   }
1747b81192dSJeffrey Tan   return m_sym_file_impl->ParseBlocksRecursive(func);
1757b81192dSJeffrey Tan }
1767b81192dSJeffrey Tan 
ParseVariablesForContext(const SymbolContext & sc)1777b81192dSJeffrey Tan size_t SymbolFileOnDemand::ParseVariablesForContext(const SymbolContext &sc) {
1787b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1797b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
1807b81192dSJeffrey Tan              __FUNCTION__);
1817b81192dSJeffrey Tan     return 0;
1827b81192dSJeffrey Tan   }
1837b81192dSJeffrey Tan   return m_sym_file_impl->ParseVariablesForContext(sc);
1847b81192dSJeffrey Tan }
1857b81192dSJeffrey Tan 
ResolveTypeUID(lldb::user_id_t type_uid)1867b81192dSJeffrey Tan Type *SymbolFileOnDemand::ResolveTypeUID(lldb::user_id_t type_uid) {
1877b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
1887b81192dSJeffrey Tan     Log *log = GetLog();
1897b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
1907b81192dSJeffrey Tan     if (log) {
1917b81192dSJeffrey Tan       Type *resolved_type = m_sym_file_impl->ResolveTypeUID(type_uid);
1927b81192dSJeffrey Tan       if (resolved_type)
1937b81192dSJeffrey Tan         LLDB_LOG(log, "Type would be parsed for {0} if hydrated.", type_uid);
1947b81192dSJeffrey Tan     }
1957b81192dSJeffrey Tan     return nullptr;
1967b81192dSJeffrey Tan   }
1977b81192dSJeffrey Tan   return m_sym_file_impl->ResolveTypeUID(type_uid);
1987b81192dSJeffrey Tan }
1997b81192dSJeffrey Tan 
2007b81192dSJeffrey Tan llvm::Optional<SymbolFile::ArrayInfo>
GetDynamicArrayInfoForUID(lldb::user_id_t type_uid,const lldb_private::ExecutionContext * exe_ctx)2017b81192dSJeffrey Tan SymbolFileOnDemand::GetDynamicArrayInfoForUID(
2027b81192dSJeffrey Tan     lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx) {
2037b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2047b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2057b81192dSJeffrey Tan              __FUNCTION__);
2067b81192dSJeffrey Tan     return llvm::None;
2077b81192dSJeffrey Tan   }
2087b81192dSJeffrey Tan   return m_sym_file_impl->GetDynamicArrayInfoForUID(type_uid, exe_ctx);
2097b81192dSJeffrey Tan }
2107b81192dSJeffrey Tan 
CompleteType(CompilerType & compiler_type)2117b81192dSJeffrey Tan bool SymbolFileOnDemand::CompleteType(CompilerType &compiler_type) {
2127b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2137b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2147b81192dSJeffrey Tan              __FUNCTION__);
2157b81192dSJeffrey Tan     return false;
2167b81192dSJeffrey Tan   }
2177b81192dSJeffrey Tan   return m_sym_file_impl->CompleteType(compiler_type);
2187b81192dSJeffrey Tan }
2197b81192dSJeffrey Tan 
GetDeclForUID(lldb::user_id_t type_uid)2207b81192dSJeffrey Tan CompilerDecl SymbolFileOnDemand::GetDeclForUID(lldb::user_id_t type_uid) {
2217b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2227b81192dSJeffrey Tan     Log *log = GetLog();
2237b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
2247b81192dSJeffrey Tan     if (log) {
2257b81192dSJeffrey Tan       CompilerDecl parsed_decl = m_sym_file_impl->GetDeclForUID(type_uid);
2267b81192dSJeffrey Tan       if (parsed_decl != CompilerDecl()) {
2277b81192dSJeffrey Tan         LLDB_LOG(log, "CompilerDecl {0} would be parsed for {1} if hydrated.",
2287b81192dSJeffrey Tan                  parsed_decl.GetName(), type_uid);
2297b81192dSJeffrey Tan       }
2307b81192dSJeffrey Tan     }
2317b81192dSJeffrey Tan     return CompilerDecl();
2327b81192dSJeffrey Tan   }
2337b81192dSJeffrey Tan   return m_sym_file_impl->GetDeclForUID(type_uid);
2347b81192dSJeffrey Tan }
2357b81192dSJeffrey Tan 
2367b81192dSJeffrey Tan CompilerDeclContext
GetDeclContextForUID(lldb::user_id_t type_uid)2377b81192dSJeffrey Tan SymbolFileOnDemand::GetDeclContextForUID(lldb::user_id_t type_uid) {
2387b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2397b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2407b81192dSJeffrey Tan              __FUNCTION__);
2417b81192dSJeffrey Tan     return CompilerDeclContext();
2427b81192dSJeffrey Tan   }
2437b81192dSJeffrey Tan   return m_sym_file_impl->GetDeclContextForUID(type_uid);
2447b81192dSJeffrey Tan }
2457b81192dSJeffrey Tan 
2467b81192dSJeffrey Tan CompilerDeclContext
GetDeclContextContainingUID(lldb::user_id_t type_uid)2477b81192dSJeffrey Tan SymbolFileOnDemand::GetDeclContextContainingUID(lldb::user_id_t type_uid) {
2487b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2497b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2507b81192dSJeffrey Tan              __FUNCTION__);
2517b81192dSJeffrey Tan     return CompilerDeclContext();
2527b81192dSJeffrey Tan   }
2537b81192dSJeffrey Tan   return m_sym_file_impl->GetDeclContextContainingUID(type_uid);
2547b81192dSJeffrey Tan }
2557b81192dSJeffrey Tan 
ParseDeclsForContext(CompilerDeclContext decl_ctx)2567b81192dSJeffrey Tan void SymbolFileOnDemand::ParseDeclsForContext(CompilerDeclContext decl_ctx) {
2577b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2587b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2597b81192dSJeffrey Tan              __FUNCTION__);
2607b81192dSJeffrey Tan     return;
2617b81192dSJeffrey Tan   }
2627b81192dSJeffrey Tan   return m_sym_file_impl->ParseDeclsForContext(decl_ctx);
2637b81192dSJeffrey Tan }
2647b81192dSJeffrey Tan 
2657b81192dSJeffrey Tan uint32_t
ResolveSymbolContext(const Address & so_addr,SymbolContextItem resolve_scope,SymbolContext & sc)2667b81192dSJeffrey Tan SymbolFileOnDemand::ResolveSymbolContext(const Address &so_addr,
2677b81192dSJeffrey Tan                                          SymbolContextItem resolve_scope,
2687b81192dSJeffrey Tan                                          SymbolContext &sc) {
2697b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2707b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2717b81192dSJeffrey Tan              __FUNCTION__);
2727b81192dSJeffrey Tan     return 0;
2737b81192dSJeffrey Tan   }
2747b81192dSJeffrey Tan   return m_sym_file_impl->ResolveSymbolContext(so_addr, resolve_scope, sc);
2757b81192dSJeffrey Tan }
2767b81192dSJeffrey Tan 
ResolveSymbolContext(const SourceLocationSpec & src_location_spec,SymbolContextItem resolve_scope,SymbolContextList & sc_list)2777b81192dSJeffrey Tan uint32_t SymbolFileOnDemand::ResolveSymbolContext(
2787b81192dSJeffrey Tan     const SourceLocationSpec &src_location_spec,
2797b81192dSJeffrey Tan     SymbolContextItem resolve_scope, SymbolContextList &sc_list) {
2807b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2817b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2827b81192dSJeffrey Tan              __FUNCTION__);
2837b81192dSJeffrey Tan     return 0;
2847b81192dSJeffrey Tan   }
2857b81192dSJeffrey Tan   return m_sym_file_impl->ResolveSymbolContext(src_location_spec, resolve_scope,
2867b81192dSJeffrey Tan                                                sc_list);
2877b81192dSJeffrey Tan }
2887b81192dSJeffrey Tan 
Dump(lldb_private::Stream & s)2897b81192dSJeffrey Tan void SymbolFileOnDemand::Dump(lldb_private::Stream &s) {
2907b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
2917b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
2927b81192dSJeffrey Tan              __FUNCTION__);
2937b81192dSJeffrey Tan     return;
2947b81192dSJeffrey Tan   }
2957b81192dSJeffrey Tan   return m_sym_file_impl->Dump(s);
2967b81192dSJeffrey Tan }
2977b81192dSJeffrey Tan 
DumpClangAST(lldb_private::Stream & s)2987b81192dSJeffrey Tan void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s) {
2997b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
3007b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
3017b81192dSJeffrey Tan              __FUNCTION__);
3027b81192dSJeffrey Tan     return;
3037b81192dSJeffrey Tan   }
3047b81192dSJeffrey Tan   return m_sym_file_impl->DumpClangAST(s);
3057b81192dSJeffrey Tan }
3067b81192dSJeffrey Tan 
FindGlobalVariables(const RegularExpression & regex,uint32_t max_matches,VariableList & variables)3077b81192dSJeffrey Tan void SymbolFileOnDemand::FindGlobalVariables(const RegularExpression &regex,
3087b81192dSJeffrey Tan                                              uint32_t max_matches,
3097b81192dSJeffrey Tan                                              VariableList &variables) {
3107b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
3117b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
3127b81192dSJeffrey Tan              __FUNCTION__);
3137b81192dSJeffrey Tan     return;
3147b81192dSJeffrey Tan   }
3157b81192dSJeffrey Tan   return m_sym_file_impl->FindGlobalVariables(regex, max_matches, variables);
3167b81192dSJeffrey Tan }
3177b81192dSJeffrey Tan 
FindGlobalVariables(ConstString name,const CompilerDeclContext & parent_decl_ctx,uint32_t max_matches,VariableList & variables)3187b81192dSJeffrey Tan void SymbolFileOnDemand::FindGlobalVariables(
3197b81192dSJeffrey Tan     ConstString name, const CompilerDeclContext &parent_decl_ctx,
3207b81192dSJeffrey Tan     uint32_t max_matches, VariableList &variables) {
3217b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
3227b81192dSJeffrey Tan     Log *log = GetLog();
3237b81192dSJeffrey Tan     Symtab *symtab = GetSymtab();
3247b81192dSJeffrey Tan     if (!symtab) {
3257b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
3267b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__);
3277b81192dSJeffrey Tan       return;
3287b81192dSJeffrey Tan     }
3297b81192dSJeffrey Tan     Symbol *sym = symtab->FindFirstSymbolWithNameAndType(
3307b81192dSJeffrey Tan         name, eSymbolTypeData, Symtab::eDebugAny, Symtab::eVisibilityAny);
3317b81192dSJeffrey Tan     if (!sym) {
3327b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
3337b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__);
3347b81192dSJeffrey Tan       return;
3357b81192dSJeffrey Tan     }
3367b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
3377b81192dSJeffrey Tan              GetSymbolFileName(), __FUNCTION__);
3387b81192dSJeffrey Tan 
3397b81192dSJeffrey Tan     // Found match in symbol table hydrate debug info and
3407b81192dSJeffrey Tan     // allow the FindGlobalVariables to go through.
3417b81192dSJeffrey Tan     SetLoadDebugInfoEnabled();
3427b81192dSJeffrey Tan   }
3437b81192dSJeffrey Tan   return m_sym_file_impl->FindGlobalVariables(name, parent_decl_ctx,
3447b81192dSJeffrey Tan                                               max_matches, variables);
3457b81192dSJeffrey Tan }
3467b81192dSJeffrey Tan 
FindFunctions(const RegularExpression & regex,bool include_inlines,SymbolContextList & sc_list)3477b81192dSJeffrey Tan void SymbolFileOnDemand::FindFunctions(const RegularExpression &regex,
3487b81192dSJeffrey Tan                                        bool include_inlines,
3497b81192dSJeffrey Tan                                        SymbolContextList &sc_list) {
3507b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
3517b81192dSJeffrey Tan     Log *log = GetLog();
3527b81192dSJeffrey Tan     Symtab *symtab = GetSymtab();
3537b81192dSJeffrey Tan     if (!symtab) {
3547b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1} is skipped - fail to get symtab",
3557b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__);
3567b81192dSJeffrey Tan       return;
3577b81192dSJeffrey Tan     }
3587b81192dSJeffrey Tan     std::vector<uint32_t> symbol_indexes;
3597b81192dSJeffrey Tan     symtab->AppendSymbolIndexesMatchingRegExAndType(
3607b81192dSJeffrey Tan         regex, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny,
3617b81192dSJeffrey Tan         symbol_indexes);
3627b81192dSJeffrey Tan     if (symbol_indexes.empty()) {
3637b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1} is skipped - fail to find match in symtab",
3647b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__);
3657b81192dSJeffrey Tan       return;
3667b81192dSJeffrey Tan     }
3677b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is NOT skipped - found match in symtab",
3687b81192dSJeffrey Tan              GetSymbolFileName(), __FUNCTION__);
3697b81192dSJeffrey Tan 
3707b81192dSJeffrey Tan     // Found match in symbol table hydrate debug info and
3717b81192dSJeffrey Tan     // allow the FindFucntions to go through.
3727b81192dSJeffrey Tan     SetLoadDebugInfoEnabled();
3737b81192dSJeffrey Tan   }
3747b81192dSJeffrey Tan   return m_sym_file_impl->FindFunctions(regex, include_inlines, sc_list);
3757b81192dSJeffrey Tan }
3767b81192dSJeffrey Tan 
FindFunctions(ConstString name,const CompilerDeclContext & parent_decl_ctx,FunctionNameType name_type_mask,bool include_inlines,SymbolContextList & sc_list)3777b81192dSJeffrey Tan void SymbolFileOnDemand::FindFunctions(
3787b81192dSJeffrey Tan     ConstString name, const CompilerDeclContext &parent_decl_ctx,
3797b81192dSJeffrey Tan     FunctionNameType name_type_mask, bool include_inlines,
3807b81192dSJeffrey Tan     SymbolContextList &sc_list) {
3817b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
3827b81192dSJeffrey Tan     Log *log = GetLog();
3837b81192dSJeffrey Tan 
3847b81192dSJeffrey Tan     Symtab *symtab = GetSymtab();
3857b81192dSJeffrey Tan     if (!symtab) {
3867b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1}({2}) is skipped  - fail to get symtab",
3877b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__, name);
3887b81192dSJeffrey Tan       return;
3897b81192dSJeffrey Tan     }
3907b81192dSJeffrey Tan 
3917b81192dSJeffrey Tan     SymbolContextList sc_list_helper;
3927b81192dSJeffrey Tan     symtab->FindFunctionSymbols(name, name_type_mask, sc_list_helper);
3937b81192dSJeffrey Tan     if (sc_list_helper.GetSize() == 0) {
3947b81192dSJeffrey Tan       LLDB_LOG(log, "[{0}] {1}({2}) is skipped - fail to find match in symtab",
3957b81192dSJeffrey Tan                GetSymbolFileName(), __FUNCTION__, name);
3967b81192dSJeffrey Tan       return;
3977b81192dSJeffrey Tan     }
3987b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1}({2}) is NOT skipped - found match in symtab",
3997b81192dSJeffrey Tan              GetSymbolFileName(), __FUNCTION__, name);
4007b81192dSJeffrey Tan 
4017b81192dSJeffrey Tan     // Found match in symbol table hydrate debug info and
4027b81192dSJeffrey Tan     // allow the FindFucntions to go through.
4037b81192dSJeffrey Tan     SetLoadDebugInfoEnabled();
4047b81192dSJeffrey Tan   }
4057b81192dSJeffrey Tan   return m_sym_file_impl->FindFunctions(name, parent_decl_ctx, name_type_mask,
4067b81192dSJeffrey Tan                                         include_inlines, sc_list);
4077b81192dSJeffrey Tan }
4087b81192dSJeffrey Tan 
GetMangledNamesForFunction(const std::string & scope_qualified_name,std::vector<ConstString> & mangled_names)4097b81192dSJeffrey Tan void SymbolFileOnDemand::GetMangledNamesForFunction(
4107b81192dSJeffrey Tan     const std::string &scope_qualified_name,
4117b81192dSJeffrey Tan     std::vector<ConstString> &mangled_names) {
4127b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4137b81192dSJeffrey Tan     Log *log = GetLog();
4147b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
4157b81192dSJeffrey Tan              __FUNCTION__, scope_qualified_name);
4167b81192dSJeffrey Tan     return;
4177b81192dSJeffrey Tan   }
4187b81192dSJeffrey Tan   return m_sym_file_impl->GetMangledNamesForFunction(scope_qualified_name,
4197b81192dSJeffrey Tan                                                      mangled_names);
4207b81192dSJeffrey Tan }
4217b81192dSJeffrey Tan 
FindTypes(ConstString name,const CompilerDeclContext & parent_decl_ctx,uint32_t max_matches,llvm::DenseSet<lldb_private::SymbolFile * > & searched_symbol_files,TypeMap & types)4227b81192dSJeffrey Tan void SymbolFileOnDemand::FindTypes(
4237b81192dSJeffrey Tan     ConstString name, const CompilerDeclContext &parent_decl_ctx,
4247b81192dSJeffrey Tan     uint32_t max_matches,
4257b81192dSJeffrey Tan     llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
4267b81192dSJeffrey Tan     TypeMap &types) {
4277b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4287b81192dSJeffrey Tan     Log *log = GetLog();
4297b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
4307b81192dSJeffrey Tan              __FUNCTION__, name);
4317b81192dSJeffrey Tan     return;
4327b81192dSJeffrey Tan   }
4337b81192dSJeffrey Tan   return m_sym_file_impl->FindTypes(name, parent_decl_ctx, max_matches,
4347b81192dSJeffrey Tan                                     searched_symbol_files, types);
4357b81192dSJeffrey Tan }
4367b81192dSJeffrey Tan 
FindTypes(llvm::ArrayRef<CompilerContext> pattern,LanguageSet languages,llvm::DenseSet<SymbolFile * > & searched_symbol_files,TypeMap & types)4377b81192dSJeffrey Tan void SymbolFileOnDemand::FindTypes(
4387b81192dSJeffrey Tan     llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
4397b81192dSJeffrey Tan     llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) {
4407b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4417b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
4427b81192dSJeffrey Tan              __FUNCTION__);
4437b81192dSJeffrey Tan     return;
4447b81192dSJeffrey Tan   }
4457b81192dSJeffrey Tan   return m_sym_file_impl->FindTypes(pattern, languages, searched_symbol_files,
4467b81192dSJeffrey Tan                                     types);
4477b81192dSJeffrey Tan }
4487b81192dSJeffrey Tan 
GetTypes(SymbolContextScope * sc_scope,TypeClass type_mask,TypeList & type_list)4497b81192dSJeffrey Tan void SymbolFileOnDemand::GetTypes(SymbolContextScope *sc_scope,
4507b81192dSJeffrey Tan                                   TypeClass type_mask, TypeList &type_list) {
4517b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4527b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
4537b81192dSJeffrey Tan              __FUNCTION__);
4547b81192dSJeffrey Tan     return;
4557b81192dSJeffrey Tan   }
4567b81192dSJeffrey Tan   return m_sym_file_impl->GetTypes(sc_scope, type_mask, type_list);
4577b81192dSJeffrey Tan }
4587b81192dSJeffrey Tan 
4597b81192dSJeffrey Tan llvm::Expected<TypeSystem &>
GetTypeSystemForLanguage(LanguageType language)4607b81192dSJeffrey Tan SymbolFileOnDemand::GetTypeSystemForLanguage(LanguageType language) {
4617b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4627b81192dSJeffrey Tan     Log *log = GetLog();
4637b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped for language type {2}",
4647b81192dSJeffrey Tan              GetSymbolFileName(), __FUNCTION__, language);
4657b81192dSJeffrey Tan     return llvm::make_error<llvm::StringError>(
4667b81192dSJeffrey Tan         "GetTypeSystemForLanguage is skipped by SymbolFileOnDemand",
4677b81192dSJeffrey Tan         llvm::inconvertibleErrorCode());
4687b81192dSJeffrey Tan   }
4697b81192dSJeffrey Tan   return m_sym_file_impl->GetTypeSystemForLanguage(language);
4707b81192dSJeffrey Tan }
4717b81192dSJeffrey Tan 
4727b81192dSJeffrey Tan CompilerDeclContext
FindNamespace(ConstString name,const CompilerDeclContext & parent_decl_ctx)4737b81192dSJeffrey Tan SymbolFileOnDemand::FindNamespace(ConstString name,
4747b81192dSJeffrey Tan                                   const CompilerDeclContext &parent_decl_ctx) {
4757b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4767b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1}({2}) is skipped", GetSymbolFileName(),
4777b81192dSJeffrey Tan              __FUNCTION__, name);
4787b81192dSJeffrey Tan     return SymbolFile::FindNamespace(name, parent_decl_ctx);
4797b81192dSJeffrey Tan   }
4807b81192dSJeffrey Tan   return m_sym_file_impl->FindNamespace(name, parent_decl_ctx);
4817b81192dSJeffrey Tan }
4827b81192dSJeffrey Tan 
4837b81192dSJeffrey Tan std::vector<std::unique_ptr<lldb_private::CallEdge>>
ParseCallEdgesInFunction(UserID func_id)4847b81192dSJeffrey Tan SymbolFileOnDemand::ParseCallEdgesInFunction(UserID func_id) {
4857b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
4867b81192dSJeffrey Tan     Log *log = GetLog();
4877b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
4887b81192dSJeffrey Tan     if (log) {
4897b81192dSJeffrey Tan       std::vector<std::unique_ptr<lldb_private::CallEdge>> call_edges =
4907b81192dSJeffrey Tan           m_sym_file_impl->ParseCallEdgesInFunction(func_id);
4917b81192dSJeffrey Tan       if (call_edges.size() > 0) {
4927b81192dSJeffrey Tan         LLDB_LOG(log, "{0} call edges would be parsed for {1} if hydrated.",
4937b81192dSJeffrey Tan                  call_edges.size(), func_id.GetID());
4947b81192dSJeffrey Tan       }
4957b81192dSJeffrey Tan     }
4967b81192dSJeffrey Tan     return {};
4977b81192dSJeffrey Tan   }
4987b81192dSJeffrey Tan   return m_sym_file_impl->ParseCallEdgesInFunction(func_id);
4997b81192dSJeffrey Tan }
5007b81192dSJeffrey Tan 
5017b81192dSJeffrey Tan lldb::UnwindPlanSP
GetUnwindPlan(const Address & address,const RegisterInfoResolver & resolver)5027b81192dSJeffrey Tan SymbolFileOnDemand::GetUnwindPlan(const Address &address,
5037b81192dSJeffrey Tan                                   const RegisterInfoResolver &resolver) {
5047b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
5057b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
5067b81192dSJeffrey Tan              __FUNCTION__);
5077b81192dSJeffrey Tan     return nullptr;
5087b81192dSJeffrey Tan   }
5097b81192dSJeffrey Tan   return m_sym_file_impl->GetUnwindPlan(address, resolver);
5107b81192dSJeffrey Tan }
5117b81192dSJeffrey Tan 
5127b81192dSJeffrey Tan llvm::Expected<lldb::addr_t>
GetParameterStackSize(Symbol & symbol)5137b81192dSJeffrey Tan SymbolFileOnDemand::GetParameterStackSize(Symbol &symbol) {
5147b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
5157b81192dSJeffrey Tan     Log *log = GetLog();
5167b81192dSJeffrey Tan     LLDB_LOG(log, "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__);
5177b81192dSJeffrey Tan     if (log) {
5187b81192dSJeffrey Tan       llvm::Expected<lldb::addr_t> stack_size =
5197b81192dSJeffrey Tan           m_sym_file_impl->GetParameterStackSize(symbol);
5207b81192dSJeffrey Tan       if (stack_size) {
5217b81192dSJeffrey Tan         LLDB_LOG(log, "{0} stack size would return for symbol {1} if hydrated.",
5227b81192dSJeffrey Tan                  *stack_size, symbol.GetName());
5237b81192dSJeffrey Tan       }
5247b81192dSJeffrey Tan     }
5257b81192dSJeffrey Tan     return SymbolFile::GetParameterStackSize(symbol);
5267b81192dSJeffrey Tan   }
5277b81192dSJeffrey Tan   return m_sym_file_impl->GetParameterStackSize(symbol);
5287b81192dSJeffrey Tan }
5297b81192dSJeffrey Tan 
PreloadSymbols()5307b81192dSJeffrey Tan void SymbolFileOnDemand::PreloadSymbols() {
5317b81192dSJeffrey Tan   m_preload_symbols = true;
5327b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
5337b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
5347b81192dSJeffrey Tan              __FUNCTION__);
5357b81192dSJeffrey Tan     return;
5367b81192dSJeffrey Tan   }
5377b81192dSJeffrey Tan   return m_sym_file_impl->PreloadSymbols();
5387b81192dSJeffrey Tan }
5397b81192dSJeffrey Tan 
GetDebugInfoSize()5407b81192dSJeffrey Tan uint64_t SymbolFileOnDemand::GetDebugInfoSize() {
5417b81192dSJeffrey Tan   // Always return the real debug info size.
5427b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
5437b81192dSJeffrey Tan            __FUNCTION__);
5447b81192dSJeffrey Tan   return m_sym_file_impl->GetDebugInfoSize();
5457b81192dSJeffrey Tan }
5467b81192dSJeffrey Tan 
GetDebugInfoParseTime()5477b81192dSJeffrey Tan StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoParseTime() {
5487b81192dSJeffrey Tan   // Always return the real parse time.
5497b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
5507b81192dSJeffrey Tan            __FUNCTION__);
5517b81192dSJeffrey Tan   return m_sym_file_impl->GetDebugInfoParseTime();
5527b81192dSJeffrey Tan }
5537b81192dSJeffrey Tan 
GetDebugInfoIndexTime()5547b81192dSJeffrey Tan StatsDuration::Duration SymbolFileOnDemand::GetDebugInfoIndexTime() {
5557b81192dSJeffrey Tan   // Always return the real index time.
5567b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped", GetSymbolFileName(),
5577b81192dSJeffrey Tan            __FUNCTION__);
5587b81192dSJeffrey Tan   return m_sym_file_impl->GetDebugInfoIndexTime();
5597b81192dSJeffrey Tan }
5607b81192dSJeffrey Tan 
SetLoadDebugInfoEnabled()5617b81192dSJeffrey Tan void SymbolFileOnDemand::SetLoadDebugInfoEnabled() {
5627b81192dSJeffrey Tan   if (m_debug_info_enabled)
5637b81192dSJeffrey Tan     return;
5647b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] Hydrate debug info", GetSymbolFileName());
5657b81192dSJeffrey Tan   m_debug_info_enabled = true;
5667b81192dSJeffrey Tan   InitializeObject();
5677b81192dSJeffrey Tan   if (m_preload_symbols)
5687b81192dSJeffrey Tan     PreloadSymbols();
5697b81192dSJeffrey Tan }
5707b81192dSJeffrey Tan 
GetNumCompileUnits()5717b81192dSJeffrey Tan uint32_t SymbolFileOnDemand::GetNumCompileUnits() {
5727b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
5737b81192dSJeffrey Tan            GetSymbolFileName(), __FUNCTION__);
5747b81192dSJeffrey Tan   return m_sym_file_impl->GetNumCompileUnits();
5757b81192dSJeffrey Tan }
5767b81192dSJeffrey Tan 
GetCompileUnitAtIndex(uint32_t idx)5777b81192dSJeffrey Tan CompUnitSP SymbolFileOnDemand::GetCompileUnitAtIndex(uint32_t idx) {
5787b81192dSJeffrey Tan   LLDB_LOG(GetLog(), "[{0}] {1} is not skipped to support breakpoint hydration",
5797b81192dSJeffrey Tan            GetSymbolFileName(), __FUNCTION__);
5807b81192dSJeffrey Tan   return m_sym_file_impl->GetCompileUnitAtIndex(idx);
5817b81192dSJeffrey Tan }
5827b81192dSJeffrey Tan 
GetAbilities()5837b81192dSJeffrey Tan uint32_t SymbolFileOnDemand::GetAbilities() {
5847b81192dSJeffrey Tan   if (!m_debug_info_enabled) {
5857b81192dSJeffrey Tan     LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(),
5867b81192dSJeffrey Tan              __FUNCTION__);
5877b81192dSJeffrey Tan     return 0;
5887b81192dSJeffrey Tan   }
5897b81192dSJeffrey Tan   return m_sym_file_impl->GetAbilities();
5907b81192dSJeffrey Tan }
591