diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -37,8 +37,6 @@ namespace lldb_private { -class ClangModulesDeclVendor; - OptionEnumValues GetDynamicValueTypes(); enum InlineStrategy { @@ -1336,8 +1334,6 @@ SourceManager &GetSourceManager(); - ClangModulesDeclVendor *GetClangModulesDeclVendor(); - // Methods. lldb::SearchFilterSP GetSearchFilterForModule(const FileSpec *containingModule); @@ -1421,8 +1417,6 @@ typedef std::map REPLMap; REPLMap m_repl_map; - std::unique_ptr m_clang_modules_decl_vendor_up; - lldb::SourceManagerUP m_source_manager_up; typedef std::map StopHookCollection; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h @@ -314,6 +314,8 @@ /// The imported type. CompilerType GuardedCopyType(const CompilerType &src_type); + std::shared_ptr GetClangModulesDeclVendor(); + public: /// Returns true if a name should be ignored by name lookup. /// diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp @@ -850,8 +850,8 @@ ConstString name) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); - ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor(); + std::shared_ptr modules_decl_vendor = + GetClangModulesDeclVendor(); if (!modules_decl_vendor) return; @@ -1143,8 +1143,8 @@ // Check the modules only if the debug information didn't have a complete // interface. - if (ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor()) { + if (std::shared_ptr modules_decl_vendor = + GetClangModulesDeclVendor()) { ConstString interface_name(interface_decl->getNameAsString().c_str()); bool append = false; uint32_t max_matches = 1; @@ -1313,8 +1313,8 @@ // Check the modules only if the debug information didn't have a complete // interface. - ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor(); + std::shared_ptr modules_decl_vendor = + GetClangModulesDeclVendor(); if (!modules_decl_vendor) break; @@ -1750,3 +1750,10 @@ return m_clang_ast_context->GetType(copied_qual_type); } + +std::shared_ptr +ClangASTSource::GetClangModulesDeclVendor() { + auto persistent_vars = llvm::cast( + m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + return persistent_vars->GetClangModulesDeclVendor(); +} diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -1021,7 +1021,8 @@ if (!m_target) return; - auto *modules_decl_vendor = m_target->GetClangModulesDeclVendor(); + std::shared_ptr modules_decl_vendor = + GetClangModulesDeclVendor(); if (!modules_decl_vendor) return; @@ -1213,8 +1214,8 @@ std::vector decls_from_modules; if (target) { - if (ClangModulesDeclVendor *decl_vendor = - target->GetClangModulesDeclVendor()) { + if (std::shared_ptr decl_vendor = + GetClangModulesDeclVendor()) { decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules); } } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -687,11 +687,11 @@ break; } - if (ClangModulesDeclVendor *decl_vendor = - target_sp->GetClangModulesDeclVendor()) { - if (auto *clang_persistent_vars = llvm::cast( - target_sp->GetPersistentExpressionStateForLanguage( - lldb::eLanguageTypeC))) { + if (auto *clang_persistent_vars = llvm::cast( + target_sp->GetPersistentExpressionStateForLanguage( + lldb::eLanguageTypeC))) { + if (std::shared_ptr decl_vendor = + clang_persistent_vars->GetClangModulesDeclVendor()) { std::unique_ptr pp_callbacks( new LLDBPreprocessorCallbacks(*decl_vendor, *clang_persistent_vars, m_compiler->getSourceManager())); diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -318,10 +318,11 @@ } } - ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor(); auto *persistent_vars = llvm::cast( target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); - if (decl_vendor && persistent_vars) { + std::shared_ptr decl_vendor = + persistent_vars->GetClangModulesDeclVendor(); + if (decl_vendor) { const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = persistent_vars->GetHandLoadedClangModules(); ClangModulesDeclVendor::ModuleVector modules_for_macros; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h @@ -19,6 +19,8 @@ namespace lldb_private { class ClangASTImporter; +class ClangModulesDeclVendor; +class Target; class TypeSystemClang; /// \class ClangPersistentVariables ClangPersistentVariables.h @@ -30,7 +32,7 @@ /// 0-based counter for naming result variables. class ClangPersistentVariables : public PersistentExpressionState { public: - ClangPersistentVariables(); + ClangPersistentVariables(std::shared_ptr target_sp); ~ClangPersistentVariables() override = default; @@ -40,6 +42,7 @@ } std::shared_ptr GetClangASTImporter(); + std::shared_ptr GetClangModulesDeclVendor(); lldb::ExpressionVariableSP CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp) override; @@ -106,6 +109,8 @@ ///these are the highest- ///< priority source for macros. std::shared_ptr m_ast_importer_sp; + std::shared_ptr m_modules_decl_vendor_sp; + std::shared_ptr m_target_sp; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp @@ -8,6 +8,7 @@ #include "ClangPersistentVariables.h" #include "ClangASTImporter.h" +#include "ClangModulesDeclVendor.h" #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" #include "lldb/Core/Value.h" @@ -23,8 +24,10 @@ using namespace lldb; using namespace lldb_private; -ClangPersistentVariables::ClangPersistentVariables() - : lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang) {} +ClangPersistentVariables::ClangPersistentVariables( + std::shared_ptr target_sp) + : lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang), + m_target_sp(target_sp) {} ExpressionVariableSP ClangPersistentVariables::CreatePersistentVariable( const lldb::ValueObjectSP &valobj_sp) { @@ -109,6 +112,15 @@ return m_ast_importer_sp; } +std::shared_ptr +ClangPersistentVariables::GetClangModulesDeclVendor() { + if (!m_modules_decl_vendor_sp) { + m_modules_decl_vendor_sp.reset( + ClangModulesDeclVendor::Create(*m_target_sp.get())); + } + return m_modules_decl_vendor_sp; +} + ConstString ClangPersistentVariables::GetNextPersistentVariableName(bool is_error) { llvm::SmallString<64> name; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp @@ -352,10 +352,6 @@ static void SetupDeclVendor(ExecutionContext &exe_ctx, Target *target, DiagnosticManager &diagnostic_manager) { - ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor(); - if (!decl_vendor) - return; - if (!target->GetEnableAutoImportClangModules()) return; @@ -364,6 +360,11 @@ if (!persistent_state) return; + std::shared_ptr decl_vendor = + persistent_state->GetClangModulesDeclVendor(); + if (!decl_vendor) + return; + StackFrame *frame = exe_ctx.GetFramePtr(); if (!frame) return; diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -990,8 +990,11 @@ bool result = false; if (auto *target = exe_scope->CalculateTarget().get()) { - if (auto *clang_modules_decl_vendor = - target->GetClangModulesDeclVendor()) { + auto *persistent_vars = llvm::cast( + target->GetPersistentExpressionStateForLanguage( + lldb::eLanguageTypeC)); + if (std::shared_ptr clang_modules_decl_vendor = + persistent_vars->GetClangModulesDeclVendor()) { ConstString key_cs(key); auto types = clang_modules_decl_vendor->FindTypes( key_cs, /*max_matches*/ UINT32_MAX); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -9653,7 +9653,8 @@ llvm::Triple triple) : TypeSystemClang("scratch ASTContext", triple), m_triple(triple), m_target_wp(target.shared_from_this()), - m_persistent_variables(new ClangPersistentVariables) { + m_persistent_variables( + new ClangPersistentVariables(target.shared_from_this())) { m_scratch_ast_source_up = CreateASTSource(); m_scratch_ast_source_up->InstallASTContext(*this); llvm::IntrusiveRefCntPtr proxy_ast_source( diff --git a/lldb/source/Target/CMakeLists.txt b/lldb/source/Target/CMakeLists.txt --- a/lldb/source/Target/CMakeLists.txt +++ b/lldb/source/Target/CMakeLists.txt @@ -81,7 +81,6 @@ lldbInterpreter lldbSymbol lldbUtility - lldbPluginExpressionParserClang lldbPluginProcessUtility LINK_COMPONENTS diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2546,23 +2546,6 @@ return *m_source_manager_up; } -ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() { - static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended - // we can make it - // per-target - - { - std::lock_guard guard(s_clang_modules_decl_vendor_mutex); - - if (!m_clang_modules_decl_vendor_up) { - m_clang_modules_decl_vendor_up.reset( - ClangModulesDeclVendor::Create(*this)); - } - } - - return m_clang_modules_decl_vendor_up.get(); -} - Target::StopHookSP Target::CreateStopHook(StopHook::StopHookKind kind) { lldb::user_id_t new_uid = ++m_stop_hook_next_id; Target::StopHookSP stop_hook_sp;