[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