summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc')
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc38
1 files changed, 30 insertions, 8 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
index 9d96690bfda..c44e3b3cfaf 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_mac.cc
@@ -14,21 +14,43 @@
#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 {
-bool StartSymbolizerSubprocess(const char *path_to_symbolizer,
- int *input_fd, int *output_fd) {
- UNIMPLEMENTED();
-}
-
uptr GetListOfModules(LoadedModule *modules, uptr max_modules,
string_predicate_t filter) {
- // FIXME: Actually implement this on Mac. Just using MemoryMappingLayout
- // may be enough for this on Mac.
- return 0;
+ 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() {
OpenPOWER on IntegriCloud