jankratochvil created this revision.
jankratochvil added reviewers: aadsm, labath, xiaobai, clayborg.
jankratochvil added a project: LLDB.
Herald added a subscriber: abidh.
jankratochvil marked an inline comment as done.
jankratochvil added inline comments.
jankratochvil retitled this revision from "Unify+fix remote XML libraries
handling with legacy one" to "Unify+fix remote XML libraries handling with the
legacy one".
================
Comment at: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp:185
- // If we can't get the SO info from the remote, return failure.
- if (fromRemote && m_process->LoadModules(module_list) == 0)
+ if (m_current.map_addr == 0)
return false;
----------------
This change is not really required but I do not see why the `map_addr` check
should differ when the remote XML protocol is in use.
D62503 <https://reviews.llvm.org/D62503> broke Fedora 30 x86_64
<https://reviews.llvm.org/D62503#1549874>. That is because it fixed failing
`ReadMemory` there and thus enabling to really use the XML libraries protocol
which broke LLDB because then `DynamicLoaderPOSIXDYLD::RendezvousBreakpointHit`
happens only once and any further library updates are ignored.
So D62503 <https://reviews.llvm.org/D62503> should be reapplied after this fix
as it is safe then.
In this patch I do not understand why there should be any special add/remove
handling in `ProcessGDBRemote::LoadModules`, it is just a new retrieved list of
libraries and loading their modules is handled by later code the same way as it
always worked with legacy memory reading from the list at `_r_debug`.
There are some more opportunities how to unify the XML protocol vs. legacy
libraries handling but I wanted to first fix this pending regression.
Repository:
rLLDB LLDB
https://reviews.llvm.org/D63868
Files:
lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -4853,77 +4853,7 @@
if (GetLoadedModuleList(module_list).Fail())
return 0;
- // get a list of all the modules
- ModuleList new_modules;
-
- for (LoadedModuleInfoList::LoadedModuleInfo &modInfo : module_list.m_list) {
- std::string mod_name;
- lldb::addr_t mod_base;
- lldb::addr_t link_map;
- bool mod_base_is_offset;
-
- bool valid = true;
- valid &= modInfo.get_name(mod_name);
- valid &= modInfo.get_base(mod_base);
- valid &= modInfo.get_base_is_offset(mod_base_is_offset);
- if (!valid)
- continue;
-
- if (!modInfo.get_link_map(link_map))
- link_map = LLDB_INVALID_ADDRESS;
-
- FileSpec file(mod_name);
- FileSystem::Instance().Resolve(file);
- lldb::ModuleSP module_sp =
- LoadModuleAtAddress(file, link_map, mod_base, mod_base_is_offset);
-
- if (module_sp.get())
- new_modules.Append(module_sp);
- }
-
- if (new_modules.GetSize() > 0) {
- ModuleList removed_modules;
- Target &target = GetTarget();
- ModuleList &loaded_modules = m_process->GetTarget().GetImages();
-
- for (size_t i = 0; i < loaded_modules.GetSize(); ++i) {
- const lldb::ModuleSP loaded_module = loaded_modules.GetModuleAtIndex(i);
-
- bool found = false;
- for (size_t j = 0; j < new_modules.GetSize(); ++j) {
- if (new_modules.GetModuleAtIndex(j).get() == loaded_module.get())
- found = true;
- }
-
- // The main executable will never be included in libraries-svr4, don't
- // remove it
- if (!found &&
- loaded_module.get() != target.GetExecutableModulePointer()) {
- removed_modules.Append(loaded_module);
- }
- }
-
- loaded_modules.Remove(removed_modules);
- m_process->GetTarget().ModulesDidUnload(removed_modules, false);
-
- new_modules.ForEach([&target](const lldb::ModuleSP module_sp) -> bool {
- lldb_private::ObjectFile *obj = module_sp->GetObjectFile();
- if (!obj)
- return true;
-
- if (obj->GetType() != ObjectFile::Type::eTypeExecutable)
- return true;
-
- lldb::ModuleSP module_copy_sp = module_sp;
- target.SetExecutableModule(module_copy_sp, eLoadDependentsNo);
- return false;
- });
-
- loaded_modules.AppendIfNeeded(new_modules);
- m_process->GetTarget().ModulesDidLoad(new_modules);
- }
-
- return new_modules.GetSize();
+ return module_list.m_list.size();
}
size_t ProcessGDBRemote::LoadModules() {
Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
===================================================================
--- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
+++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
@@ -182,11 +182,11 @@
SOEntry entry;
LoadedModuleInfoList module_list;
- // If we can't get the SO info from the remote, return failure.
- if (fromRemote && m_process->LoadModules(module_list) == 0)
+ if (m_current.map_addr == 0)
return false;
- if (!fromRemote && m_current.map_addr == 0)
+ // If we can't get the SO info from the remote, return failure.
+ if (fromRemote && m_process->LoadModules(module_list) == 0)
return false;
// When the previous and current states are consistent this is the first time
@@ -207,12 +207,10 @@
return false;
m_soentries.clear();
- if (fromRemote)
- return SaveSOEntriesFromRemote(module_list);
-
m_added_soentries.clear();
m_removed_soentries.clear();
- return TakeSnapshot(m_soentries);
+ return fromRemote ? SaveSOEntriesFromRemote(module_list)
+ : TakeSnapshot(m_soentries);
}
assert(m_current.state == eConsistent);
@@ -288,8 +286,10 @@
return false;
// Only add shared libraries and not the executable.
- if (!SOEntryIsMainExecutable(entry))
+ if (!SOEntryIsMainExecutable(entry)) {
m_soentries.push_back(entry);
+ m_added_soentries.push_back(entry);
+ }
}
m_loaded_modules = module_list;
@@ -321,6 +321,7 @@
return false;
m_soentries.erase(pos);
+ m_removed_soentries.push_back(entry);
}
}
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits