[compiler-rt] r308977 - Add address ranges for individual macho sections on darwin

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 25 10:39:33 PDT 2017


http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/3052

In file included from /tmp/gotsan.bg7OCmXlb4/gotsan.cc:14:
In file included from ../rtl/tsan_rtl.h:29:
In file included from
../../sanitizer_common/sanitizer_allocator.h:23:../../sanitizer_common/sanitizer_procmaps.h:68:28:
error: private field 'data_' is not used
[-Werror,-Wunused-private-field]
  MemoryMappedSegmentData *data_;


On Tue, Jul 25, 2017 at 8:27 AM, Francis Ricci via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: fjricci
> Date: Tue Jul 25 08:27:32 2017
> New Revision: 308977
>
> URL: http://llvm.org/viewvc/llvm-project?rev=308977&view=rev
> Log:
> Add address ranges for individual macho sections on darwin
>
> Summary:
> This is a re-upload of the reverted commit r308644. It has changed quite
> a bit to reflect post-commit comments by kcc, so I'm re-uploading as
> a new review.
>
> Reviewers: kubamracek, alekseyshl, kcc
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D35799
>
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_mac.cc
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> sanitizer_common/sanitizer_procmaps.h?rev=308977&r1=
> 308976&r2=308977&view=diff
> ============================================================
> ==================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps.h Tue Jul
> 25 08:27:32 2017
> @@ -37,9 +37,12 @@ static const uptr kProtectionWrite = 2;
>  static const uptr kProtectionExecute = 4;
>  static const uptr kProtectionShared = 8;
>
> -struct MemoryMappedSegment {
> +struct MemoryMappedSegmentData;
> +
> +class MemoryMappedSegment {
> + public:
>    MemoryMappedSegment(char *buff = nullptr, uptr size = 0)
> -      : filename(buff), filename_size(size) {}
> +      : filename(buff), filename_size(size), data_(nullptr) {}
>    ~MemoryMappedSegment() {}
>
>    bool IsReadable() const { return protection & kProtectionRead; }
> @@ -47,6 +50,8 @@ struct MemoryMappedSegment {
>    bool IsExecutable() const { return protection & kProtectionExecute; }
>    bool IsShared() const { return protection & kProtectionShared; }
>
> +  void AddAddressRanges(LoadedModule *module);
> +
>    uptr start;
>    uptr end;
>    uptr offset;
> @@ -55,6 +60,12 @@ struct MemoryMappedSegment {
>    uptr protection;
>    ModuleArch arch;
>    u8 uuid[kModuleUUIDSize];
> +
> + private:
> +  friend class MemoryMappingLayout;
> +
> +  // This field is assigned and owned by MemoryMappingLayout if needed
> +  MemoryMappedSegmentData *data_;
>  };
>
>  class MemoryMappingLayout {
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_
> procmaps_common.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> sanitizer_common/sanitizer_procmaps_common.cc?rev=308977&
> r1=308976&r2=308977&view=diff
> ============================================================
> ==================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_common.cc
> Tue Jul 25 08:27:32 2017
> @@ -64,6 +64,10 @@ uptr ParseHex(const char **p) {
>    return ParseNumber(p, 16);
>  }
>
> +void MemoryMappedSegment::AddAddressRanges(LoadedModule *module) {
> +  module->addAddressRange(start, end, IsExecutable(), IsWritable());
> +}
> +
>  MemoryMappingLayout::MemoryMappingLayout(bool cache_enabled) {
>    ReadProcMaps(&proc_self_maps_);
>    if (cache_enabled) {
> @@ -139,8 +143,7 @@ void MemoryMappingLayout::DumpListOfModu
>      uptr base_address = (i ? segment.start : 0) - segment.offset;
>      LoadedModule cur_module;
>      cur_module.set(cur_name, base_address);
> -    cur_module.addAddressRange(segment.start, segment.end,
> -                               segment.IsExecutable(),
> segment.IsWritable());
> +    segment.AddAddressRanges(&cur_module);
>      modules->push_back(cur_module);
>    }
>  }
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_mac.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/
> sanitizer_common/sanitizer_procmaps_mac.cc?rev=308977&r1=
> 308976&r2=308977&view=diff
> ============================================================
> ==================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_mac.cc
> (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_procmaps_mac.cc Tue
> Jul 25 08:27:32 2017
> @@ -36,6 +36,48 @@
>
>  namespace __sanitizer {
>
> +// Contains information used to iterate through sections.
> +struct MemoryMappedSegmentData {
> +  uptr nsects;
> +  char *current_load_cmd_addr;
> +  u32 lc_type;
> +  uptr base_virt_addr;
> +  uptr addr_mask;
> +};
> +
> +template <typename Section>
> +static void NextSectionLoad(LoadedModule *module, MemoryMappedSegmentData
> *data,
> +                            bool isWritable) {
> +  const Section *sc = (const Section *)data->current_load_cmd_addr;
> +  data->current_load_cmd_addr += sizeof(Section);
> +
> +  uptr sec_start = (sc->addr & data->addr_mask) + data->base_virt_addr;
> +  uptr sec_end = sec_start + sc->size;
> +  module->addAddressRange(sec_start, sec_end, /*executable=*/false,
> isWritable);
> +}
> +
> +void MemoryMappedSegment::AddAddressRanges(LoadedModule *module) {
> +  // Don't iterate over sections when the caller hasn't set up the
> +  // data pointer, when there are no sections, or when the segment
> +  // is executable. Avoid iterating over executable sections because
> +  // it will confuse libignore, and because the extra granularity
> +  // of information is not needed by any sanitizers.
> +  if (!data_ || !data_->nsects || IsExecutable()) {
> +    module->addAddressRange(start, end, IsExecutable(), IsWritable());
> +    return;
> +  }
> +
> +  do {
> +    if (data_->lc_type == LC_SEGMENT) {
> +      NextSectionLoad<struct section>(module, data_, IsWritable());
> +#ifdef MH_MAGIC_64
> +    } else if (data_->lc_type == LC_SEGMENT_64) {
> +      NextSectionLoad<struct section_64>(module, data_, IsWritable());
> +#endif
> +    }
> +  } while (--data_->nsects);
> +}
> +
>  MemoryMappingLayout::MemoryMappingLayout(bool cache_enabled) {
>    Reset();
>  }
> @@ -144,19 +186,32 @@ bool MemoryMappingLayout::NextSegmentLoa
>    if (((const load_command *)lc)->cmd == kLCSegment) {
>      const SegmentCommand* sc = (const SegmentCommand *)lc;
>
> +    uptr base_virt_addr, addr_mask;
>      if (current_image_ == kDyldImageIdx) {
> +      base_virt_addr = (uptr)get_dyld_hdr();
>        // vmaddr is masked with 0xfffff because on macOS versions < 10.12,
>        // it contains an absolute address rather than an offset for dyld.
>        // To make matters even more complicated, this absolute address
>        // isn't actually the absolute segment address, but the offset
> portion
>        // of the address is accurate when combined with the dyld base
> address,
>        // and the mask will give just this offset.
> -      segment->start = (sc->vmaddr & 0xfffff) + (uptr)get_dyld_hdr();
> -      segment->end = (sc->vmaddr & 0xfffff) + sc->vmsize +
> (uptr)get_dyld_hdr();
> +      addr_mask = 0xfffff;
>      } else {
> -      const sptr dlloff = _dyld_get_image_vmaddr_slide(current_image_);
> -      segment->start = sc->vmaddr + dlloff;
> -      segment->end = sc->vmaddr + sc->vmsize + dlloff;
> +      base_virt_addr = (uptr)_dyld_get_image_vmaddr_
> slide(current_image_);
> +      addr_mask = ~0;
> +    }
> +    segment->start = (sc->vmaddr & addr_mask) + base_virt_addr;
> +    segment->end = segment->start + sc->vmsize;
> +
> +    // Most callers don't need section information, so only fill this
> struct
> +    // when required.
> +    if (segment->data_) {
> +      segment->data_->nsects = sc->nsects;
> +      segment->data_->current_load_cmd_addr =
> +          (char *)lc + sizeof(SegmentCommand);
> +      segment->data_->lc_type = kLCSegment;
> +      segment->data_->base_virt_addr = base_virt_addr;
> +      segment->data_->addr_mask = addr_mask;
>      }
>
>      // Return the initial protection.
> @@ -292,7 +347,9 @@ void MemoryMappingLayout::DumpListOfModu
>    Reset();
>    InternalScopedString module_name(kMaxPathLength);
>    MemoryMappedSegment segment(module_name.data(), kMaxPathLength);
> -  for (uptr i = 0; Next(&segment); i++) {
> +  MemoryMappedSegmentData data;
> +  segment.data_ = &data;
> +  while (Next(&segment)) {
>      if (segment.filename[0] == '\0') continue;
>      LoadedModule *cur_module = nullptr;
>      if (!modules->empty() &&
> @@ -304,8 +361,7 @@ void MemoryMappingLayout::DumpListOfModu
>        cur_module->set(segment.filename, segment.start, segment.arch,
>                        segment.uuid, current_instrumented_);
>      }
> -    cur_module->addAddressRange(segment.start, segment.end,
> -                                segment.IsExecutable(),
> segment.IsWritable());
> +    segment.AddAddressRanges(cur_module);
>    }
>  }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170725/f2800364/attachment.html>


More information about the llvm-commits mailing list