普通文本  |  63行  |  1.94 KB

//===-- sanitizer_symbolizer_mac.cc ---------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is shared between AddressSanitizer and ThreadSanitizer
// run-time libraries.
// Mac-specific implementation of symbolizer parts.
//===----------------------------------------------------------------------===//

#include "sanitizer_platform.h"
#if SANITIZER_MAC
#include "sanitizer_common.h"
#include "sanitizer_internal_defs.h"
#include "sanitizer_placement_new.h"
#include "sanitizer_procmaps.h"
#include "sanitizer_symbolizer.h"

namespace __sanitizer {

uptr GetListOfModules(LoadedModule *modules, uptr max_modules,
                      string_predicate_t filter) {
  MemoryMappingLayout memory_mapping(false);
  memory_mapping.Reset();
  uptr cur_beg, cur_end, cur_offset;
  InternalScopedBuffer<char> module_name(kMaxPathLength);
  uptr n_modules = 0;
  for (uptr i = 0;
       n_modules < max_modules &&
           memory_mapping.Next(&cur_beg, &cur_end, &cur_offset,
                               module_name.data(), module_name.size(), 0);
       i++) {
    const char *cur_name = module_name.data();
    if (cur_name[0] == '\0')
      continue;
    if (filter && !filter(cur_name))
      continue;
    LoadedModule *cur_module = 0;
    if (n_modules > 0 &&
        0 == internal_strcmp(cur_name, modules[n_modules - 1].full_name())) {
      cur_module = &modules[n_modules - 1];
    } else {
      void *mem = &modules[n_modules];
      cur_module = new(mem) LoadedModule(cur_name, cur_beg);
      n_modules++;
    }
    cur_module->addAddressRange(cur_beg, cur_end);
  }
  return n_modules;
}

void SymbolizerPrepareForSandboxing() {
  // Do nothing on Mac.
}

}  // namespace __sanitizer

#endif  // SANITIZER_MAC