<div dir="ltr"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/3052">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/3052</a><br><div><br></div><div><pre style="font-family:"Courier New",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium"><span class="gmail-stdout">In file included from /tmp/gotsan.bg7OCmXlb4/gotsan.cc:14:
In file included from ../rtl/tsan_rtl.h:29:
In file included fr</span><span class="gmail-stdout">om ../../sanitizer_common/sanitizer_allocator.h:23:
</span><span class="gmail-stdout">../../sanitizer_common/sanitizer_procmaps.h:68:28: error: private field 'data_' is not used [-Werror,-Wunused-private-field]
  MemoryMappedSegmentData *data_;</span></pre></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 25, 2017 at 8:27 AM, Francis Ricci via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fjricci<br>
Date: Tue Jul 25 08:27:32 2017<br>
New Revision: 308977<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=308977&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=308977&view=rev</a><br>
Log:<br>
Add address ranges for individual macho sections on darwin<br>
<br>
Summary:<br>
This is a re-upload of the reverted commit r308644. It has changed quite<br>
a bit to reflect post-commit comments by kcc, so I'm re-uploading as<br>
a new review.<br>
<br>
Reviewers: kubamracek, alekseyshl, kcc<br>
<br>
Subscribers: llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D35799" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D35799</a><br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps.h<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_common.cc<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_mac.cc<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h?rev=308977&r1=308976&r2=308977&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps.h?rev=308977&r1=<wbr>308976&r2=308977&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps.h (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps.h Tue Jul 25 08:27:32 2017<br>
@@ -37,9 +37,12 @@ static const uptr kProtectionWrite = 2;<br>
 static const uptr kProtectionExecute = 4;<br>
 static const uptr kProtectionShared = 8;<br>
<br>
-struct MemoryMappedSegment {<br>
+struct MemoryMappedSegmentData;<br>
+<br>
+class MemoryMappedSegment {<br>
+ public:<br>
   MemoryMappedSegment(char *buff = nullptr, uptr size = 0)<br>
-      : filename(buff), filename_size(size) {}<br>
+      : filename(buff), filename_size(size), data_(nullptr) {}<br>
   ~MemoryMappedSegment() {}<br>
<br>
   bool IsReadable() const { return protection & kProtectionRead; }<br>
@@ -47,6 +50,8 @@ struct MemoryMappedSegment {<br>
   bool IsExecutable() const { return protection & kProtectionExecute; }<br>
   bool IsShared() const { return protection & kProtectionShared; }<br>
<br>
+  void AddAddressRanges(LoadedModule *module);<br>
+<br>
   uptr start;<br>
   uptr end;<br>
   uptr offset;<br>
@@ -55,6 +60,12 @@ struct MemoryMappedSegment {<br>
   uptr protection;<br>
   ModuleArch arch;<br>
   u8 uuid[kModuleUUIDSize];<br>
+<br>
+ private:<br>
+  friend class MemoryMappingLayout;<br>
+<br>
+  // This field is assigned and owned by MemoryMappingLayout if needed<br>
+  MemoryMappedSegmentData *data_;<br>
 };<br>
<br>
 class MemoryMappingLayout {<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_common.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc?rev=308977&r1=308976&r2=308977&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_common.cc?rev=308977&<wbr>r1=308976&r2=308977&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_common.cc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_common.cc Tue Jul 25 08:27:32 2017<br>
@@ -64,6 +64,10 @@ uptr ParseHex(const char **p) {<br>
   return ParseNumber(p, 16);<br>
 }<br>
<br>
+void MemoryMappedSegment::<wbr>AddAddressRanges(LoadedModule *module) {<br>
+  module->addAddressRange(start, end, IsExecutable(), IsWritable());<br>
+}<br>
+<br>
 MemoryMappingLayout::<wbr>MemoryMappingLayout(bool cache_enabled) {<br>
   ReadProcMaps(&proc_self_maps_)<wbr>;<br>
   if (cache_enabled) {<br>
@@ -139,8 +143,7 @@ void MemoryMappingLayout::<wbr>DumpListOfModu<br>
     uptr base_address = (i ? segment.start : 0) - segment.offset;<br>
     LoadedModule cur_module;<br>
     cur_module.set(cur_name, base_address);<br>
-    cur_module.addAddressRange(<wbr>segment.start, segment.end,<br>
-                               segment.IsExecutable(), segment.IsWritable());<br>
+    segment.AddAddressRanges(&cur_<wbr>module);<br>
     modules->push_back(cur_module)<wbr>;<br>
   }<br>
 }<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_mac.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_mac.cc?rev=308977&r1=308976&r2=308977&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_mac.cc?rev=308977&r1=<wbr>308976&r2=308977&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_mac.cc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>procmaps_mac.cc Tue Jul 25 08:27:32 2017<br>
@@ -36,6 +36,48 @@<br>
<br>
 namespace __sanitizer {<br>
<br>
+// Contains information used to iterate through sections.<br>
+struct MemoryMappedSegmentData {<br>
+  uptr nsects;<br>
+  char *current_load_cmd_addr;<br>
+  u32 lc_type;<br>
+  uptr base_virt_addr;<br>
+  uptr addr_mask;<br>
+};<br>
+<br>
+template <typename Section><br>
+static void NextSectionLoad(LoadedModule *module, MemoryMappedSegmentData *data,<br>
+                            bool isWritable) {<br>
+  const Section *sc = (const Section *)data->current_load_cmd_addr;<br>
+  data->current_load_cmd_addr += sizeof(Section);<br>
+<br>
+  uptr sec_start = (sc->addr & data->addr_mask) + data->base_virt_addr;<br>
+  uptr sec_end = sec_start + sc->size;<br>
+  module->addAddressRange(sec_<wbr>start, sec_end, /*executable=*/false, isWritable);<br>
+}<br>
+<br>
+void MemoryMappedSegment::<wbr>AddAddressRanges(LoadedModule *module) {<br>
+  // Don't iterate over sections when the caller hasn't set up the<br>
+  // data pointer, when there are no sections, or when the segment<br>
+  // is executable. Avoid iterating over executable sections because<br>
+  // it will confuse libignore, and because the extra granularity<br>
+  // of information is not needed by any sanitizers.<br>
+  if (!data_ || !data_->nsects || IsExecutable()) {<br>
+    module->addAddressRange(start, end, IsExecutable(), IsWritable());<br>
+    return;<br>
+  }<br>
+<br>
+  do {<br>
+    if (data_->lc_type == LC_SEGMENT) {<br>
+      NextSectionLoad<struct section>(module, data_, IsWritable());<br>
+#ifdef MH_MAGIC_64<br>
+    } else if (data_->lc_type == LC_SEGMENT_64) {<br>
+      NextSectionLoad<struct section_64>(module, data_, IsWritable());<br>
+#endif<br>
+    }<br>
+  } while (--data_->nsects);<br>
+}<br>
+<br>
 MemoryMappingLayout::<wbr>MemoryMappingLayout(bool cache_enabled) {<br>
   Reset();<br>
 }<br>
@@ -144,19 +186,32 @@ bool MemoryMappingLayout::<wbr>NextSegmentLoa<br>
   if (((const load_command *)lc)->cmd == kLCSegment) {<br>
     const SegmentCommand* sc = (const SegmentCommand *)lc;<br>
<br>
+    uptr base_virt_addr, addr_mask;<br>
     if (current_image_ == kDyldImageIdx) {<br>
+      base_virt_addr = (uptr)get_dyld_hdr();<br>
       // vmaddr is masked with 0xfffff because on macOS versions < 10.12,<br>
       // it contains an absolute address rather than an offset for dyld.<br>
       // To make matters even more complicated, this absolute address<br>
       // isn't actually the absolute segment address, but the offset portion<br>
       // of the address is accurate when combined with the dyld base address,<br>
       // and the mask will give just this offset.<br>
-      segment->start = (sc->vmaddr & 0xfffff) + (uptr)get_dyld_hdr();<br>
-      segment->end = (sc->vmaddr & 0xfffff) + sc->vmsize + (uptr)get_dyld_hdr();<br>
+      addr_mask = 0xfffff;<br>
     } else {<br>
-      const sptr dlloff = _dyld_get_image_vmaddr_slide(<wbr>current_image_);<br>
-      segment->start = sc->vmaddr + dlloff;<br>
-      segment->end = sc->vmaddr + sc->vmsize + dlloff;<br>
+      base_virt_addr = (uptr)_dyld_get_image_vmaddr_<wbr>slide(current_image_);<br>
+      addr_mask = ~0;<br>
+    }<br>
+    segment->start = (sc->vmaddr & addr_mask) + base_virt_addr;<br>
+    segment->end = segment->start + sc->vmsize;<br>
+<br>
+    // Most callers don't need section information, so only fill this struct<br>
+    // when required.<br>
+    if (segment->data_) {<br>
+      segment->data_->nsects = sc->nsects;<br>
+      segment->data_->current_load_<wbr>cmd_addr =<br>
+          (char *)lc + sizeof(SegmentCommand);<br>
+      segment->data_->lc_type = kLCSegment;<br>
+      segment->data_->base_virt_addr = base_virt_addr;<br>
+      segment->data_->addr_mask = addr_mask;<br>
     }<br>
<br>
     // Return the initial protection.<br>
@@ -292,7 +347,9 @@ void MemoryMappingLayout::<wbr>DumpListOfModu<br>
   Reset();<br>
   InternalScopedString module_name(kMaxPathLength);<br>
   MemoryMappedSegment segment(module_name.data(), kMaxPathLength);<br>
-  for (uptr i = 0; Next(&segment); i++) {<br>
+  MemoryMappedSegmentData data;<br>
+  segment.data_ = &data;<br>
+  while (Next(&segment)) {<br>
     if (segment.filename[0] == '\0') continue;<br>
     LoadedModule *cur_module = nullptr;<br>
     if (!modules->empty() &&<br>
@@ -304,8 +361,7 @@ void MemoryMappingLayout::<wbr>DumpListOfModu<br>
       cur_module->set(segment.<wbr>filename, segment.start, segment.arch,<br>
                       segment.uuid, current_instrumented_);<br>
     }<br>
-    cur_module->addAddressRange(<wbr>segment.start, segment.end,<br>
-                                segment.IsExecutable(), segment.IsWritable());<br>
+    segment.AddAddressRanges(cur_<wbr>module);<br>
   }<br>
 }<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>