aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2022-11-14 16:24:36 -0800
committerAdrian Prantl <aprantl@apple.com>2022-11-16 15:51:26 -0800
commit6eaedbb52f2a616e644e5acc7279c8b07c4cfe82 (patch)
tree4fe3af14033dc99c540bbeec32c4d1f9a3f3e120 /lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
parent0fcb26c5b6487bf9b31670122f8c931ac020bb34 (diff)
downloadllvm-6eaedbb52f2a616e644e5acc7279c8b07c4cfe82.zip
llvm-6eaedbb52f2a616e644e5acc7279c8b07c4cfe82.tar.gz
llvm-6eaedbb52f2a616e644e5acc7279c8b07c4cfe82.tar.bz2
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<TypeSystem>. Most of the std::weak_ptr<TypeSystem>* 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
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp')
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp5
1 files changed, 2 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
index 04033df..bf6c65c 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp
@@ -249,7 +249,7 @@ bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetDataType() {
static ConstString g_tree_("__tree_");
static ConstString g_pair3("__pair3_");
- if (m_element_type.GetOpaqueQualType() && m_element_type.GetTypeSystem())
+ if (m_element_type.IsValid())
return true;
m_element_type.Clear();
ValueObjectSP deref;
@@ -295,8 +295,7 @@ void lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset(
UINT32_MAX) {
m_skip_size = bit_offset / 8u;
} else {
- TypeSystemClang *ast_ctx =
- llvm::dyn_cast_or_null<TypeSystemClang>(node_type.GetTypeSystem());
+ auto ast_ctx = node_type.GetTypeSystem().dyn_cast_or_null<TypeSystemClang>();
if (!ast_ctx)
return;
CompilerType tree_node_type = ast_ctx->CreateStructForIdentifier(