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:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user