[llvm-commits] [compiler-rt] r169474 - in /compiler-rt/trunk/lib/sanitizer_common: sanitizer_common.cc sanitizer_common.h tests/sanitizer_common_test.cc

Matt Beaumont-Gay matthewbg at google.com
Wed Dec 5 23:24:53 PST 2012


On Wed, Dec 5, 2012 at 10:10 PM, Kostya Serebryany <kcc at google.com> wrote:
> Author: kcc
> Date: Thu Dec  6 00:10:31 2012
> New Revision: 169474
>
> URL: http://llvm.org/viewvc/llvm-project?rev=169474&view=rev
> Log:
> [tsan] add MmapAlignedOrDie
>
> Modified:
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>     compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=169474&r1=169473&r2=169474&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Thu Dec  6 00:10:31 2012
> @@ -155,6 +155,27 @@
>    }
>  }
>
> +// We want to map a chunk of address space aligned to 'alignment'.
> +// We do it by maping a bit more and then unmaping redundant pieces.
> +// We probably can do it with fewer syscalls in some OS-dependent way.
> +void *MmapAlignedOrDie(uptr size, uptr alignment, const char *mem_type) {
> +  uptr PageSize = GetPageSizeCached();

PageSize is unused.

> +  CHECK(IsPowerOfTwo(size));
> +  CHECK(IsPowerOfTwo(alignment));
> +  uptr map_size = size + alignment;
> +  uptr map_res = (uptr)MmapOrDie(map_size, mem_type);
> +  uptr map_end = map_res + map_size;
> +  uptr res = map_res;
> +  if (res & (alignment - 1))  // Not aligned.
> +    res = (map_res + alignment) & ~ (alignment - 1);
> +  uptr end = res + size;
> +  if (res != map_res)
> +    UnmapOrDie((void*)map_res, res - map_res);
> +  if (end != map_end)
> +    UnmapOrDie((void*)end, map_end - end);
> +  return (void*)res;
> +}
> +
>  }  // namespace __sanitizer
>
>  using namespace __sanitizer;  // NOLINT
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=169474&r1=169473&r2=169474&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Thu Dec  6 00:10:31 2012
> @@ -45,6 +45,8 @@
>  void UnmapOrDie(void *addr, uptr size);
>  void *MmapFixedNoReserve(uptr fixed_addr, uptr size);
>  void *Mprotect(uptr fixed_addr, uptr size);
> +// Map aligned chunk of address space; size and alignment are powers of two.
> +void *MmapAlignedOrDie(uptr size, uptr alignment, const char *mem_type);
>  // Used to check if we can map shadow memory to a fixed location.
>  bool MemoryRangeIsAvailable(uptr range_start, uptr range_end);
>
>
> Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc?rev=169474&r1=169473&r2=169474&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc (original)
> +++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc Thu Dec  6 00:10:31 2012
> @@ -63,4 +63,19 @@
>    EXPECT_TRUE(IsSorted(array, 2));
>  }
>
> +TEST(SanitizerCommon, MmapAlignedOrDie) {
> +  uptr PageSize = GetPageSizeCached();
> +  for (uptr size = 1; size <= 32; size *= 2) {
> +    for (uptr alignment = 1; alignment <= 32; alignment *= 2) {
> +      for (int iter = 0; iter < 100; iter++) {
> +        uptr res = (uptr)MmapAlignedOrDie(
> +            size * PageSize, alignment * PageSize, "MmapAlignedOrDieTest");
> +        EXPECT_EQ(0U, res % (alignment * PageSize));
> +        memset((void*)res, 1, size * PageSize);
> +        UnmapOrDie((void*)res, size * PageSize);
> +      }
> +    }
> +  }
> +}
> +
>  }  // namespace sanitizer
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list