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