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
This commit is contained in:
Adrian Prantl
2022-11-14 16:24:36 -08:00
parent 0fcb26c5b6
commit 6eaedbb52f
83 changed files with 1052 additions and 662 deletions

View File

@@ -1766,7 +1766,7 @@ lldb::SBType SBTarget::FindFirstType(const char *typename_cstr) {
}
}
// Didn't find the type in the symbols; Try the loaded language runtimes
// Didn't find the type in the symbols; Try the loaded language runtimes.
if (auto process_sp = target_sp->GetProcessSP()) {
for (auto *runtime : process_sp->GetLanguageRuntimes()) {
if (auto vendor = runtime->GetDeclVendor()) {
@@ -1777,9 +1777,9 @@ lldb::SBType SBTarget::FindFirstType(const char *typename_cstr) {
}
}
// No matches, search for basic typename matches
for (auto *type_system : target_sp->GetScratchTypeSystems())
if (auto type = type_system->GetBuiltinTypeByName(const_typename))
// No matches, search for basic typename matches.
for (auto type_system_sp : target_sp->GetScratchTypeSystems())
if (auto type = type_system_sp->GetBuiltinTypeByName(const_typename))
return SBType(type);
}
@@ -1791,8 +1791,8 @@ SBType SBTarget::GetBasicType(lldb::BasicType type) {
TargetSP target_sp(GetSP());
if (target_sp) {
for (auto *type_system : target_sp->GetScratchTypeSystems())
if (auto compiler_type = type_system->GetBasicTypeFromAST(type))
for (auto type_system_sp : target_sp->GetScratchTypeSystems())
if (auto compiler_type = type_system_sp->GetBasicTypeFromAST(type))
return SBType(compiler_type);
}
return SBType();
@@ -1832,9 +1832,9 @@ lldb::SBTypeList SBTarget::FindTypes(const char *typename_cstr) {
if (sb_type_list.GetSize() == 0) {
// No matches, search for basic typename matches
for (auto *type_system : target_sp->GetScratchTypeSystems())
for (auto type_system_sp : target_sp->GetScratchTypeSystems())
if (auto compiler_type =
type_system->GetBuiltinTypeByName(const_typename))
type_system_sp->GetBuiltinTypeByName(const_typename))
sb_type_list.Append(SBType(compiler_type));
}
}