mirror of
https://github.com/intel/llvm.git
synced 2026-01-15 04:17:17 +08:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user