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

@@ -364,13 +364,13 @@ void Module::SetUUID(const lldb_private::UUID &uuid) {
}
}
llvm::Expected<TypeSystem &>
llvm::Expected<TypeSystemSP>
Module::GetTypeSystemForLanguage(LanguageType language) {
return m_type_system_map.GetTypeSystemForLanguage(language, this, true);
}
void Module::ForEachTypeSystem(
llvm::function_ref<bool(TypeSystem *)> callback) {
llvm::function_ref<bool(lldb::TypeSystemSP)> callback) {
m_type_system_map.ForEach(callback);
}