diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp index ec7e91df2c597..4869cf0fd9c81 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp @@ -210,14 +210,7 @@ DYLDRendezvous::RendezvousAction DYLDRendezvous::GetAction() const { case eAdd: case eDelete: - // Some versions of the android dynamic linker might send two - // notifications with state == eAdd back to back. Ignore them until we - // get an eConsistent notification. - if (!(m_previous.state == eConsistent || - (m_previous.state == eAdd && m_current.state == eDelete))) - return eNoAction; - - return eTakeSnapshot; + return eNoAction; } return eNoAction; @@ -229,9 +222,9 @@ bool DYLDRendezvous::UpdateSOEntriesFromRemote() { if (action == eNoAction) return false; + m_added_soentries.clear(); + m_removed_soentries.clear(); if (action == eTakeSnapshot) { - m_added_soentries.clear(); - m_removed_soentries.clear(); // We already have the loaded list from the previous update so no need to // find all the modules again. if (!m_loaded_modules.m_list.empty()) @@ -260,11 +253,11 @@ bool DYLDRendezvous::UpdateSOEntriesFromRemote() { } bool DYLDRendezvous::UpdateSOEntries() { + m_added_soentries.clear(); + m_removed_soentries.clear(); switch (GetAction()) { case eTakeSnapshot: m_soentries.clear(); - m_added_soentries.clear(); - m_removed_soentries.clear(); return TakeSnapshot(m_soentries); case eAddModules: return AddSOEntries(); diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp index 64bc5323fc4e6..8a708c1f9898e 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -433,27 +433,31 @@ void DynamicLoaderPOSIXDYLD::RefreshModules() { for (; I != E; ++I) { ModuleSP module_sp = LoadModuleAtAddress(I->file_spec, I->link_addr, I->base_addr, true); - if (module_sp.get()) { - if (module_sp->GetObjectFile()->GetBaseAddress().GetLoadAddress( - &m_process->GetTarget()) == m_interpreter_base && - module_sp != m_interpreter_module.lock()) { - if (m_interpreter_module.lock() == nullptr) { - m_interpreter_module = module_sp; - } else { - // If this is a duplicate instance of ld.so, unload it. We may end - // up with it if we load it via a different path than before - // (symlink vs real path). - // TODO: remove this once we either fix library matching or avoid - // loading the interpreter when setting the rendezvous breakpoint. - UnloadSections(module_sp); - loaded_modules.Remove(module_sp); - continue; - } + if (!module_sp.get()) + continue; + + if (module_sp->GetObjectFile()->GetBaseAddress().GetLoadAddress( + &m_process->GetTarget()) == m_interpreter_base) { + ModuleSP interpreter_sp = m_interpreter_module.lock(); + if (m_interpreter_module.lock() == nullptr) { + m_interpreter_module = module_sp; + } else if (module_sp == interpreter_sp) { + // Module already loaded. + continue; + } else { + // If this is a duplicate instance of ld.so, unload it. We may end + // up with it if we load it via a different path than before + // (symlink vs real path). + // TODO: remove this once we either fix library matching or avoid + // loading the interpreter when setting the rendezvous breakpoint. + UnloadSections(module_sp); + loaded_modules.Remove(module_sp); + continue; } - - loaded_modules.AppendIfNeeded(module_sp); - new_modules.Append(module_sp); } + + loaded_modules.AppendIfNeeded(module_sp); + new_modules.Append(module_sp); } m_process->GetTarget().ModulesDidLoad(new_modules); }