diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2015-04-06 12:49:30 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2015-04-06 12:49:30 +0000 |
commit | 9860ff2226cd43efa0e8d5c7056e800f7e9a22ea (patch) | |
tree | cd24d68911fb27ad965628884c827f29aa55f4b7 /lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | |
parent | 0bca6b4e196838da6c317a0786b1927d0dcc9296 (diff) |
[ASan] Unify handling of loaded modules between POSIX and Windows
Reviewed at http://reviews.llvm.org/D8805
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@234150 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc | 53 |
1 files changed, 6 insertions, 47 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc b/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc index 189b0abd8..cb2683eac 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cc @@ -352,9 +352,14 @@ class InternalSymbolizer : public SymbolizerTool { class POSIXSymbolizer : public Symbolizer { public: explicit POSIXSymbolizer(IntrusiveList<SymbolizerTool> tools) - : Symbolizer(tools), n_modules_(0), modules_fresh_(false) {} + : Symbolizer(tools) {} private: + uptr PlatformGetListOfModules(LoadedModule *modules, + uptr max_modules) override { + return ::GetListOfModules(modules, max_modules, /* filter */ nullptr); + } + const char *PlatformDemangle(const char *name) override { return DemangleCXXABI(name); } @@ -365,52 +370,6 @@ class POSIXSymbolizer : public Symbolizer { CacheBinaryName(); #endif } - - LoadedModule *FindModuleForAddress(uptr address) { - bool modules_were_reloaded = false; - if (!modules_fresh_) { - for (uptr i = 0; i < n_modules_; i++) - modules_[i].clear(); - n_modules_ = GetListOfModules(modules_, kMaxNumberOfModuleContexts, - /* filter */ 0); - CHECK_GT(n_modules_, 0); - CHECK_LT(n_modules_, kMaxNumberOfModuleContexts); - modules_fresh_ = true; - modules_were_reloaded = true; - } - for (uptr i = 0; i < n_modules_; i++) { - if (modules_[i].containsAddress(address)) { - return &modules_[i]; - } - } - // Reload the modules and look up again, if we haven't tried it yet. - if (!modules_were_reloaded) { - // FIXME: set modules_fresh_ from dlopen()/dlclose() interceptors. - // It's too aggressive to reload the list of modules each time we fail - // to find a module for a given address. - modules_fresh_ = false; - return FindModuleForAddress(address); - } - return 0; - } - - bool PlatformFindModuleNameAndOffsetForAddress(uptr address, - const char **module_name, - uptr *module_offset) override { - LoadedModule *module = FindModuleForAddress(address); - if (module == 0) - return false; - *module_name = module->full_name(); - *module_offset = address - module->base_address(); - return true; - } - - // 16K loaded modules should be enough for everyone. - static const uptr kMaxNumberOfModuleContexts = 1 << 14; - LoadedModule modules_[kMaxNumberOfModuleContexts]; - uptr n_modules_; - // If stale, need to reload the modules before looking up addresses. - bool modules_fresh_; }; static SymbolizerTool *ChooseExternalSymbolizer(LowLevelAllocator *allocator) { |