[Sanitizer] Remove some calls to libc malloc from symbolizer

llvm-svn: 162987
This commit is contained in:
Alexey Samsonov 2012-08-31 11:07:52 +00:00
parent 6bab9113b0
commit e70ed73d1f
2 changed files with 13 additions and 14 deletions

View File

@ -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.

View File

@ -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;
}