From 6eaedbb52f2a616e644e5acc7279c8b07c4cfe82 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Mon, 14 Nov 2022 16:24:36 -0800 Subject: Make CompilerType safe When a process gets restarted TypeSystem objects associated with it may get deleted, and any CompilerType objects holding on to a reference to that type system are a use-after-free in waiting. Because of the SBAPI, we don't have tight control over where CompilerTypes go and when they are used. This is particularly a problem in the Swift plugin, where the scratch TypeSystem can be restarted while the process is still running. The Swift plugin has a lock to prevent abuse, but where there's a lock there can be bugs. This patch changes CompilerType to store a std::weak_ptr. Most of the std::weak_ptr* uglyness is hidden by introducing a wrapper class CompilerType::WrappedTypeSystem that has a dyn_cast_or_null() method. The only sites that need to know about the weak pointer implementation detail are the ones that deal with creating TypeSystems. rdar://101505232 Differential Revision: https://reviews.llvm.org/D136650 --- lldb/source/Core/Module.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lldb/source/Core/Module.cpp') diff --git a/lldb/source/Core/Module.cpp b/lldb/source/Core/Module.cpp index 20bd02f101fc..b1cc0dd58211 100644 --- a/lldb/source/Core/Module.cpp +++ b/lldb/source/Core/Module.cpp @@ -364,13 +364,13 @@ void Module::SetUUID(const lldb_private::UUID &uuid) { } } -llvm::Expected +llvm::Expected Module::GetTypeSystemForLanguage(LanguageType language) { return m_type_system_map.GetTypeSystemForLanguage(language, this, true); } void Module::ForEachTypeSystem( - llvm::function_ref callback) { + llvm::function_ref callback) { m_type_system_map.ForEach(callback); } -- cgit v1.2.3