[compiler-rt] r187372 - Move UnpoisonMappedDSO to sanitizer_common.

Peter Collingbourne peter at pcc.me.uk
Mon Jul 29 12:09:50 PDT 2013


Author: pcc
Date: Mon Jul 29 14:09:49 2013
New Revision: 187372

URL: http://llvm.org/viewvc/llvm-project?rev=187372&view=rev
Log:
Move UnpoisonMappedDSO to sanitizer_common.

This is so DFSan will be able to use it.

Differential Revision: http://llvm-reviews.chandlerc.com/D1206

Modified:
    compiler-rt/trunk/lib/msan/msan.h
    compiler-rt/trunk/lib/msan/msan_interceptors.cc
    compiler-rt/trunk/lib/msan/msan_linux.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h

Modified: compiler-rt/trunk/lib/msan/msan.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan.h?rev=187372&r1=187371&r2=187372&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan.h (original)
+++ compiler-rt/trunk/lib/msan/msan.h Mon Jul 29 14:09:49 2013
@@ -31,8 +31,6 @@
 #define MEM_IS_SHADOW(mem) ((uptr)mem >=         0x200000000000ULL && \
                             (uptr)mem <=         0x400000000000ULL)
 
-struct link_map;  // Opaque type returned by dlopen().
-
 const int kMsanParamTlsSizeInWords = 100;
 const int kMsanRetvalTlsSizeInWords = 100;
 
@@ -76,7 +74,6 @@ void ReportUMR(StackTrace *stack, u32 or
 void ReportExpectedUMRNotFound(StackTrace *stack);
 void ReportAtExitStatistics();
 
-void UnpoisonMappedDSO(struct link_map *map);
 // Unpoison first n function arguments.
 void UnpoisonParam(uptr n);
 

Modified: compiler-rt/trunk/lib/msan/msan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_interceptors.cc?rev=187372&r1=187371&r2=187372&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_interceptors.cc Mon Jul 29 14:09:49 2013
@@ -827,7 +827,7 @@ INTERCEPTOR(void *, dlopen, const char *
   if (!__msan_has_dynamic_component() && map) {
     // If msandr didn't clear the shadow before the initializers ran, we do it
     // ourselves afterwards.
-    UnpoisonMappedDSO(map);
+    ForEachMappedRegion(map, __msan_unpoison);
   }
   return (void *)map;
 }

Modified: compiler-rt/trunk/lib/msan/msan_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/msan/msan_linux.cc?rev=187372&r1=187371&r2=187372&view=diff
==============================================================================
--- compiler-rt/trunk/lib/msan/msan_linux.cc (original)
+++ compiler-rt/trunk/lib/msan/msan_linux.cc Mon Jul 29 14:09:49 2013
@@ -17,7 +17,6 @@
 
 #include "msan.h"
 
-#include <algorithm>
 #include <elf.h>
 #include <link.h>
 #include <stdio.h>
@@ -92,41 +91,6 @@ void InstallAtExitHandler() {
   atexit(MsanAtExit);
 }
 
-void UnpoisonMappedDSO(link_map *map) {
-  typedef ElfW(Phdr) Elf_Phdr;
-  typedef ElfW(Ehdr) Elf_Ehdr;
-  char *base = (char *)map->l_addr;
-  Elf_Ehdr *ehdr = (Elf_Ehdr *)base;
-  char *phdrs = base + ehdr->e_phoff;
-  char *phdrs_end = phdrs + ehdr->e_phnum * ehdr->e_phentsize;
-
-  // Find the segment with the minimum base so we can "relocate" the p_vaddr
-  // fields.  Typically ET_DYN objects (DSOs) have base of zero and ET_EXEC
-  // objects have a non-zero base.
-  uptr preferred_base = ~0ULL;
-  for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
-    Elf_Phdr *phdr = (Elf_Phdr *)iter;
-    if (phdr->p_type == PT_LOAD)
-      preferred_base = std::min(preferred_base, (uptr)phdr->p_vaddr);
-  }
-
-  // Compute the delta from the real base to get a relocation delta.
-  sptr delta = (uptr)base - preferred_base;
-  // Now we can figure out what the loader really mapped.
-  for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
-    Elf_Phdr *phdr = (Elf_Phdr *)iter;
-    if (phdr->p_type == PT_LOAD) {
-      uptr seg_start = phdr->p_vaddr + delta;
-      uptr seg_end = seg_start + phdr->p_memsz;
-      // None of these values are aligned.  We consider the ragged edges of the
-      // load command as defined, since they are mapped from the file.
-      seg_start = RoundDownTo(seg_start, GetPageSizeCached());
-      seg_end = RoundUpTo(seg_end, GetPageSizeCached());
-      __msan_unpoison((void *)seg_start, seg_end - seg_start);
-    }
-  }
-}
-
 }  // namespace __msan
 
 #endif  // __linux__

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc?rev=187372&r1=187371&r2=187372&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.cc Mon Jul 29 14:09:49 2013
@@ -29,6 +29,7 @@
 #include <dlfcn.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <link.h>
 #include <pthread.h>
 #include <sched.h>
 #include <sys/mman.h>
@@ -638,6 +639,42 @@ bool LibraryNameIs(const char *full_name
   return (name[base_name_length] == '-' || name[base_name_length] == '.');
 }
 
+// Call cb for each region mapped by map.
+void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)) {
+  typedef ElfW(Phdr) Elf_Phdr;
+  typedef ElfW(Ehdr) Elf_Ehdr;
+  char *base = (char *)map->l_addr;
+  Elf_Ehdr *ehdr = (Elf_Ehdr *)base;
+  char *phdrs = base + ehdr->e_phoff;
+  char *phdrs_end = phdrs + ehdr->e_phnum * ehdr->e_phentsize;
+
+  // Find the segment with the minimum base so we can "relocate" the p_vaddr
+  // fields.  Typically ET_DYN objects (DSOs) have base of zero and ET_EXEC
+  // objects have a non-zero base.
+  uptr preferred_base = ~0ULL;
+  for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
+    Elf_Phdr *phdr = (Elf_Phdr *)iter;
+    if (phdr->p_type == PT_LOAD && preferred_base > (uptr)phdr->p_vaddr)
+      preferred_base = (uptr)phdr->p_vaddr;
+  }
+
+  // Compute the delta from the real base to get a relocation delta.
+  sptr delta = (uptr)base - preferred_base;
+  // Now we can figure out what the loader really mapped.
+  for (char *iter = phdrs; iter != phdrs_end; iter += ehdr->e_phentsize) {
+    Elf_Phdr *phdr = (Elf_Phdr *)iter;
+    if (phdr->p_type == PT_LOAD) {
+      uptr seg_start = phdr->p_vaddr + delta;
+      uptr seg_end = seg_start + phdr->p_memsz;
+      // None of these values are aligned.  We consider the ragged edges of the
+      // load command as defined, since they are mapped from the file.
+      seg_start = RoundDownTo(seg_start, GetPageSizeCached());
+      seg_end = RoundUpTo(seg_end, GetPageSizeCached());
+      cb((void *)seg_start, seg_end - seg_start);
+    }
+  }
+}
+
 }  // namespace __sanitizer
 
 #endif  // SANITIZER_LINUX

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=187372&r1=187371&r2=187372&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Mon Jul 29 14:09:49 2013
@@ -16,6 +16,7 @@
 #include "sanitizer_common.h"
 #include "sanitizer_internal_defs.h"
 
+struct link_map;  // Opaque type returned by dlopen().
 struct sigaltstack;
 
 namespace __sanitizer {
@@ -65,6 +66,9 @@ bool LibraryNameIs(const char *full_name
 // Read the name of the current binary from /proc/self/exe.
 uptr ReadBinaryName(/*out*/char *buf, uptr buf_len);
 
+// Call cb for each region mapped by map.
+void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr));
+
 }  // namespace __sanitizer
 
 #endif  // SANITIZER_LINUX_H





More information about the llvm-commits mailing list