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 @@ -36,8 +36,6 @@ namespace lldb_private { -class ClangModulesDeclVendor; - OptionEnumValues GetDynamicValueTypes(); enum InlineStrategy { @@ -1232,8 +1230,6 @@ SourceManager &GetSourceManager(); - ClangModulesDeclVendor *GetClangModulesDeclVendor(); - // Methods. lldb::SearchFilterSP GetSearchFilterForModule(const FileSpec *containingModule); @@ -1313,8 +1309,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.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 @@ -851,8 +851,10 @@ ConstString name) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); - ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor(); + auto *persistent_vars = llvm::cast( + m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + std::shared_ptr modules_decl_vendor = + persistent_vars->GetClangModulesDeclVendor(); if (!modules_decl_vendor) return; @@ -1144,8 +1146,11 @@ // Check the modules only if the debug information didn't have a complete // interface. - if (ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor()) { + auto *persistent_vars = llvm::cast( + m_target->GetPersistentExpressionStateForLanguage( + lldb::eLanguageTypeC)); + if (std::shared_ptr modules_decl_vendor = + persistent_vars->GetClangModulesDeclVendor()) { ConstString interface_name(interface_decl->getNameAsString().c_str()); bool append = false; uint32_t max_matches = 1; @@ -1314,9 +1319,11 @@ // Check the modules only if the debug information didn't have a complete // interface. - ClangModulesDeclVendor *modules_decl_vendor = - m_target->GetClangModulesDeclVendor(); - + auto *persistent_vars = llvm::cast( + m_target->GetPersistentExpressionStateForLanguage( + lldb::eLanguageTypeC)); + std::shared_ptr modules_decl_vendor = + persistent_vars->GetClangModulesDeclVendor(); if (!modules_decl_vendor) break; 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 @@ -1008,7 +1008,10 @@ if (!m_target) return; - auto *modules_decl_vendor = m_target->GetClangModulesDeclVendor(); + auto *persistent_vars = llvm::cast( + m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + std::shared_ptr modules_decl_vendor = + persistent_vars->GetClangModulesDeclVendor(); if (!modules_decl_vendor) return; @@ -1200,8 +1203,10 @@ std::vector decls_from_modules; if (target) { - if (ClangModulesDeclVendor *decl_vendor = - target->GetClangModulesDeclVendor()) { + auto *persistent_vars = llvm::cast( + target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + if (std::shared_ptr decl_vendor = + persistent_vars->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 @@ -615,11 +615,11 @@ m_compiler->createSourceManager(m_compiler->getFileManager()); m_compiler->createPreprocessor(TU_Complete); - 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 @@ -316,9 +316,10 @@ } } - ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor(); auto *persistent_vars = llvm::cast( target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + std::shared_ptr decl_vendor = + persistent_vars->GetClangModulesDeclVendor(); if (decl_vendor && persistent_vars) { const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = persistent_vars->GetHandLoadedClangModules(); 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); ~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,9 @@ ///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) + : lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang), + m_target_sp(target) {} 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 @@ -349,18 +349,18 @@ static void SetupDeclVendor(ExecutionContext &exe_ctx, Target *target, DiagnosticManager &diagnostic_manager) { - ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor(); - if (!decl_vendor) - return; - - if (!target->GetEnableAutoImportClangModules()) - return; - auto *persistent_state = llvm::cast( target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); if (!persistent_state) return; + std::shared_ptr decl_vendor = + persistent_state->GetClangModulesDeclVendor(); + if (!decl_vendor) + return; + if (!target->GetEnableAutoImportClangModules()) + 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 @@ -9456,7 +9456,8 @@ Target &target, llvm::Triple triple) : TypeSystemClang("scratch ASTContext", 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.reset(new ClangASTSource( target.shared_from_this(), m_persistent_variables->GetClangASTImporter())); m_scratch_ast_source_up->InstallASTContext(*this); 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 @@ -77,7 +77,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 @@ -2462,23 +2462,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() { lldb::user_id_t new_uid = ++m_stop_hook_next_id; Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid));