diff options
author | Francis Ricci <francisjricci@gmail.com> | 2017-09-29 15:06:47 +0000 |
---|---|---|
committer | Francis Ricci <francisjricci@gmail.com> | 2017-09-29 15:06:47 +0000 |
commit | d04247a9f29b0db10a29ffbed8189ca388a7b871 (patch) | |
tree | 661a4b7b04dc0524c765567bc3d7e76d2f18c4e2 /lib/sanitizer_common/sanitizer_linux_libcdep.cc | |
parent | 87e43ef9dee0a57f2fef86e90c24c987faaedb53 (diff) |
Refactor android fallback procmaps init. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@314518 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_linux_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_linux_libcdep.cc | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/lib/sanitizer_common/sanitizer_linux_libcdep.cc b/lib/sanitizer_common/sanitizer_linux_libcdep.cc index 11d8b3ac0..da715dc6c 100644 --- a/lib/sanitizer_common/sanitizer_linux_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_linux_libcdep.cc @@ -462,21 +462,30 @@ extern "C" __attribute__((weak)) int dl_iterate_phdr( int (*)(struct dl_phdr_info *, size_t, void *), void *); #endif -void ListOfModules::init() { - clear(); +static bool requiresProcmaps() { #if SANITIZER_ANDROID && __ANDROID_API__ <= 22 - u32 api_level = AndroidGetApiLevel(); // Fall back to /proc/maps if dl_iterate_phdr is unavailable or broken. // The runtime check allows the same library to work with // both K and L (and future) Android releases. - if (api_level <= ANDROID_LOLLIPOP_MR1) { // L or earlier - MemoryMappingLayout memory_mapping(false); - memory_mapping.DumpListOfModules(&modules_); - return; - } + return AndroidGetApiLevel() <= ANDROID_LOLLIPOP_MR1; +#else + return false; #endif - DlIteratePhdrData data = {&modules_, true}; - dl_iterate_phdr(dl_iterate_phdr_cb, &data); +} + +static void procmapsInit(InternalMmapVector<LoadedModule> *modules) { + MemoryMappingLayout memory_mapping(false); + memory_mapping.DumpListOfModules(modules); +} + +void ListOfModules::init() { + clear(); + if (requiresProcmaps()) { + procmapsInit(&modules_); + } else { + DlIteratePhdrData data = {&modules_, true}; + dl_iterate_phdr(dl_iterate_phdr_cb, &data); + } } // getrusage does not give us the current RSS, only the max RSS. |