Remove recursion from FindModuleForAddress. NFC.

llvm-svn: 314520
This commit is contained in:
Francis Ricci 2017-09-29 15:14:31 +00:00
parent 2dd5fa4dc7
commit c48e9487a5
1 changed files with 24 additions and 11 deletions

View File

@ -163,29 +163,42 @@ bool Symbolizer::FindModuleNameAndOffsetForAddress(uptr address,
return true;
}
void Symbolizer::RefreshModules() {
modules_.init();
RAW_CHECK(modules_.size() > 0);
modules_fresh_ = true;
}
static const LoadedModule *SearchForModule(const ListOfModules &modules,
uptr address) {
for (uptr i = 0; i < modules.size(); i++) {
if (modules[i].containsAddress(address)) {
return &modules[i];
}
}
return nullptr;
}
const LoadedModule *Symbolizer::FindModuleForAddress(uptr address) {
bool modules_were_reloaded = false;
if (!modules_fresh_) {
modules_.init();
RAW_CHECK(modules_.size() > 0);
modules_fresh_ = true;
RefreshModules();
modules_were_reloaded = true;
}
for (uptr i = 0; i < modules_.size(); i++) {
if (modules_[i].containsAddress(address)) {
return &modules_[i];
}
}
const LoadedModule *module = SearchForModule(modules_, address);
if (module) return module;
// dlopen/dlclose interceptors invalidate the module list, but when
// interception is disabled, we need to retry if the lookup fails in
// case the module list changed.
#if !SANITIZER_INTERCEPT_DLOPEN_DLCLOSE
if (!modules_were_reloaded) {
modules_fresh_ = false;
return FindModuleForAddress(address);
RefreshModules();
module = SearchForModule(modules_, address);
if (module) return module;
}
#endif
return 0;
return module;
}
// For now we assume the following protocol: