[Lldb-commits] [lldb] 4c0b0de - [lldb] Move ClangModulesDeclVendor ownership to ClangPersistentVariables from Target
Alex Langford via lldb-commits
lldb-commits at lists.llvm.org
Mon May 24 13:48:17 PDT 2021
Author: Alex Langford
Date: 2021-05-24T13:13:12-07:00
New Revision: 4c0b0de904a5622c33e3ed97e86c6792fbc13feb
URL: https://github.com/llvm/llvm-project/commit/4c0b0de904a5622c33e3ed97e86c6792fbc13feb
DIFF: https://github.com/llvm/llvm-project/commit/4c0b0de904a5622c33e3ed97e86c6792fbc13feb.diff
LOG: [lldb] Move ClangModulesDeclVendor ownership to ClangPersistentVariables from Target
More decoupling of plugins and non-plugins. Target doesn't need to
manage ClangModulesDeclVendor and ClangPersistentVariables is always available
in situations where you need ClangModulesDeclVendor.
Differential Revision: https://reviews.llvm.org/D102811
Added:
Modified:
lldb/include/lldb/Target/Target.h
lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp
lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h
lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
lldb/source/Target/CMakeLists.txt
lldb/source/Target/Target.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index 219213312f64..2d67977dd6a0 100644
--- 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 @@ class Target : public std::enable_shared_from_this<Target>,
SourceManager &GetSourceManager();
- ClangModulesDeclVendor *GetClangModulesDeclVendor();
-
// Methods.
lldb::SearchFilterSP
GetSearchFilterForModule(const FileSpec *containingModule);
@@ -1421,8 +1417,6 @@ class Target : public std::enable_shared_from_this<Target>,
typedef std::map<lldb::LanguageType, lldb::REPLSP> REPLMap;
REPLMap m_repl_map;
- std::unique_ptr<ClangModulesDeclVendor> m_clang_modules_decl_vendor_up;
-
lldb::SourceManagerUP m_source_manager_up;
typedef std::map<lldb::user_id_t, StopHookSP> StopHookCollection;
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
index 19031af400ea..49a34898f866 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
@@ -850,8 +850,8 @@ void ClangASTSource::FindDeclInModules(NameSearchContext &context,
ConstString name) {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
- ClangModulesDeclVendor *modules_decl_vendor =
- m_target->GetClangModulesDeclVendor();
+ std::shared_ptr<ClangModulesDeclVendor> modules_decl_vendor =
+ GetClangModulesDeclVendor();
if (!modules_decl_vendor)
return;
@@ -1143,8 +1143,8 @@ void ClangASTSource::FindObjCMethodDecls(NameSearchContext &context) {
// 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<ClangModulesDeclVendor> modules_decl_vendor =
+ GetClangModulesDeclVendor()) {
ConstString interface_name(interface_decl->getNameAsString().c_str());
bool append = false;
uint32_t max_matches = 1;
@@ -1313,8 +1313,8 @@ void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext &context) {
// Check the modules only if the debug information didn't have a complete
// interface.
- ClangModulesDeclVendor *modules_decl_vendor =
- m_target->GetClangModulesDeclVendor();
+ std::shared_ptr<ClangModulesDeclVendor> modules_decl_vendor =
+ GetClangModulesDeclVendor();
if (!modules_decl_vendor)
break;
@@ -1750,3 +1750,10 @@ CompilerType ClangASTSource::GuardedCopyType(const CompilerType &src_type) {
return m_clang_ast_context->GetType(copied_qual_type);
}
+
+std::shared_ptr<ClangModulesDeclVendor>
+ClangASTSource::GetClangModulesDeclVendor() {
+ auto persistent_vars = llvm::cast<ClangPersistentVariables>(
+ m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC));
+ return persistent_vars->GetClangModulesDeclVendor();
+}
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
index 14761fbeb26b..3afd1fd5f2d1 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTSource.h
@@ -314,6 +314,8 @@ class ClangASTSource : public clang::ExternalASTSource,
/// The imported type.
CompilerType GuardedCopyType(const CompilerType &src_type);
+ std::shared_ptr<ClangModulesDeclVendor> GetClangModulesDeclVendor();
+
public:
/// Returns true if a name should be ignored by name lookup.
///
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
index bfcfa0b90b15..761e6aa273f7 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
@@ -1021,7 +1021,8 @@ void ClangExpressionDeclMap::LookupInModulesDeclVendor(
if (!m_target)
return;
- auto *modules_decl_vendor = m_target->GetClangModulesDeclVendor();
+ std::shared_ptr<ClangModulesDeclVendor> modules_decl_vendor =
+ GetClangModulesDeclVendor();
if (!modules_decl_vendor)
return;
@@ -1213,8 +1214,8 @@ void ClangExpressionDeclMap::LookupFunction(
std::vector<clang::NamedDecl *> decls_from_modules;
if (target) {
- if (ClangModulesDeclVendor *decl_vendor =
- target->GetClangModulesDeclVendor()) {
+ if (std::shared_ptr<ClangModulesDeclVendor> 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
index cf807a94d8fa..d38e64f9c554 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp
@@ -687,11 +687,11 @@ ClangExpressionParser::ClangExpressionParser(
break;
}
- if (ClangModulesDeclVendor *decl_vendor =
- target_sp->GetClangModulesDeclVendor()) {
- if (auto *clang_persistent_vars = llvm::cast<ClangPersistentVariables>(
- target_sp->GetPersistentExpressionStateForLanguage(
- lldb::eLanguageTypeC))) {
+ if (auto *clang_persistent_vars = llvm::cast<ClangPersistentVariables>(
+ target_sp->GetPersistentExpressionStateForLanguage(
+ lldb::eLanguageTypeC))) {
+ if (std::shared_ptr<ClangModulesDeclVendor> decl_vendor =
+ clang_persistent_vars->GetClangModulesDeclVendor()) {
std::unique_ptr<PPCallbacks> 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
index 837e212b4984..1a050fc5ffb4 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp
@@ -318,10 +318,11 @@ bool ClangExpressionSourceCode::GetText(
}
}
- ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor();
auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC));
- if (decl_vendor && persistent_vars) {
+ std::shared_ptr<ClangModulesDeclVendor> 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.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.cpp
index 42afac9edb0d..13d6a37113b8 100644
--- 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> target_sp)
+ : lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang),
+ m_target_sp(target_sp) {}
ExpressionVariableSP ClangPersistentVariables::CreatePersistentVariable(
const lldb::ValueObjectSP &valobj_sp) {
@@ -109,6 +112,15 @@ ClangPersistentVariables::GetClangASTImporter() {
return m_ast_importer_sp;
}
+std::shared_ptr<ClangModulesDeclVendor>
+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/ClangPersistentVariables.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h
index f888b2d56e68..b8a359d05f75 100644
--- 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 @@ class TypeSystemClang;
/// 0-based counter for naming result variables.
class ClangPersistentVariables : public PersistentExpressionState {
public:
- ClangPersistentVariables();
+ ClangPersistentVariables(std::shared_ptr<Target> target_sp);
~ClangPersistentVariables() override = default;
@@ -40,6 +42,7 @@ class ClangPersistentVariables : public PersistentExpressionState {
}
std::shared_ptr<ClangASTImporter> GetClangASTImporter();
+ std::shared_ptr<ClangModulesDeclVendor> GetClangModulesDeclVendor();
lldb::ExpressionVariableSP
CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp) override;
@@ -106,6 +109,8 @@ class ClangPersistentVariables : public PersistentExpressionState {
///these are the highest-
///< priority source for macros.
std::shared_ptr<ClangASTImporter> m_ast_importer_sp;
+ std::shared_ptr<ClangModulesDeclVendor> m_modules_decl_vendor_sp;
+ std::shared_ptr<Target> m_target_sp;
};
} // namespace lldb_private
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
index 9c01d2c5edc7..d18b2396375b 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp
@@ -352,10 +352,6 @@ bool ClangUserExpression::SetupPersistentState(DiagnosticManager &diagnostic_man
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 @@ static void SetupDeclVendor(ExecutionContext &exe_ctx, Target *target,
if (!persistent_state)
return;
+ std::shared_ptr<ClangModulesDeclVendor> 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
index 29391daaab93..345789ba92a6 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -990,8 +990,11 @@ std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() {
bool result = false;
if (auto *target = exe_scope->CalculateTarget().get()) {
- if (auto *clang_modules_decl_vendor =
- target->GetClangModulesDeclVendor()) {
+ auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
+ target->GetPersistentExpressionStateForLanguage(
+ lldb::eLanguageTypeC));
+ if (std::shared_ptr<ClangModulesDeclVendor> 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
index 51e53f0bab56..6f13325824ea 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -9653,7 +9653,8 @@ ScratchTypeSystemClang::ScratchTypeSystemClang(Target &target,
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<clang::ExternalASTSource> proxy_ast_source(
diff --git a/lldb/source/Target/CMakeLists.txt b/lldb/source/Target/CMakeLists.txt
index ef92d26ef465..a94d32a46352 100644
--- a/lldb/source/Target/CMakeLists.txt
+++ b/lldb/source/Target/CMakeLists.txt
@@ -81,7 +81,6 @@ add_lldb_library(lldbTarget
lldbInterpreter
lldbSymbol
lldbUtility
- lldbPluginExpressionParserClang
lldbPluginProcessUtility
LINK_COMPONENTS
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index d879c0f6221d..8ebc3ae3098c 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -2546,23 +2546,6 @@ SourceManager &Target::GetSourceManager() {
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<std::mutex> 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;
More information about the lldb-commits
mailing list