diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-08-31 11:07:52 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-08-31 11:07:52 +0000 |
commit | 2acf5562bfd787c1667297c593ddfc0e35b91489 (patch) | |
tree | 13b9a6469ebcf088e87270e077ae5e978649d5e7 | |
parent | 678b2fe068a1ef87317ca0199cf24379a0f94e6e (diff) |
[Sanitizer] Remove some calls to libc malloc from symbolizer
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@162987 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer.cc | 14 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_linux.cc | 13 |
2 files changed, 13 insertions, 14 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer.cc b/lib/sanitizer_common/sanitizer_symbolizer.cc index 7c0b9816f..ad6eaa64b 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer.cc @@ -182,6 +182,8 @@ class ExternalSymbolizer { uptr times_restarted_; }; +static LowLevelAllocator symbolizer_allocator; // Linker initialized. + class Symbolizer { public: uptr SymbolizeCode(uptr addr, AddressInfo *frames, uptr max_frames) { @@ -206,7 +208,6 @@ class Symbolizer { if (!external_symbolizer_->Restart()) { ReportExternalSymbolizerError( "WARNING: Failed to use and restart external symbolizer!\n"); - InternalFree(external_symbolizer_); external_symbolizer_ = 0; break; } @@ -220,7 +221,7 @@ class Symbolizer { int input_fd, output_fd; if (!StartSymbolizerSubprocess(path_to_symbolizer, &input_fd, &output_fd)) return false; - void *mem = InternalAlloc(sizeof(ExternalSymbolizer)); + void *mem = symbolizer_allocator.Allocate(sizeof(ExternalSymbolizer)); external_symbolizer_ = new(mem) ExternalSymbolizer(path_to_symbolizer, input_fd, output_fd); return true; @@ -229,8 +230,8 @@ class Symbolizer { private: LoadedModule *FindModuleForAddress(uptr address) { if (modules_ == 0) { - modules_ = (LoadedModule*)InternalAlloc( - kMaxNumberOfModuleContexts * sizeof(LoadedModule)); + modules_ = (LoadedModule*)(symbolizer_allocator.Allocate( + kMaxNumberOfModuleContexts * sizeof(LoadedModule))); CHECK(modules_); n_modules_ = GetListOfModules(modules_, kMaxNumberOfModuleContexts); CHECK_GT(n_modules_, 0); @@ -254,11 +255,10 @@ class Symbolizer { } static const uptr kMaxNumberOfModuleContexts = 4096; - // Array of module descriptions is leaked. - LoadedModule *modules_; + LoadedModule *modules_; // Array of module descriptions is leaked. uptr n_modules_; - ExternalSymbolizer *external_symbolizer_; + ExternalSymbolizer *external_symbolizer_; // Leaked. }; static Symbolizer symbolizer; // Linker initialized. diff --git a/lib/sanitizer_common/sanitizer_symbolizer_linux.cc b/lib/sanitizer_common/sanitizer_symbolizer_linux.cc index 6a76647b0..61c772488 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_linux.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_linux.cc @@ -121,19 +121,19 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) { DlIteratePhdrData *data = (DlIteratePhdrData*)arg; if (data->current_n == data->max_n) return 0; - char *module_name = 0; + InternalScopedBuffer<char> module_name(kMaxPathLength); + module_name[0] = '\0'; if (data->current_n == 0) { // First module is the binary itself. - module_name = (char*)InternalAlloc(kMaxPathLength); uptr module_name_len = readlink("/proc/self/exe", - module_name, kMaxPathLength); + module_name, module_name.size()); CHECK_NE(module_name_len, (uptr)-1); - CHECK_LT(module_name_len, kMaxPathLength); + CHECK_LT(module_name_len, module_name.size()); module_name[module_name_len] = '\0'; } else if (info->dlpi_name) { - module_name = internal_strdup(info->dlpi_name); + internal_strncpy(module_name, info->dlpi_name, module_name.size()); } - if (module_name == 0 || module_name[0] == '\0') + if (module_name[0] == '\0') return 0; void *mem = &data->modules[data->current_n]; LoadedModule *cur_module = new(mem) LoadedModule(module_name, @@ -147,7 +147,6 @@ static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) { cur_module->addAddressRange(cur_beg, cur_end); } } - InternalFree(module_name); return 0; } |