summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-08-31 11:07:52 +0000
committerAlexey Samsonov <samsonov@google.com>2012-08-31 11:07:52 +0000
commit2acf5562bfd787c1667297c593ddfc0e35b91489 (patch)
tree13b9a6469ebcf088e87270e077ae5e978649d5e7
parent678b2fe068a1ef87317ca0199cf24379a0f94e6e (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.cc14
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer_linux.cc13
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;
}