Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit 4254a55

Browse files
authored
Merge pull request #29 from japaric/rust-llvm-2016-07-18
backport r282152
2 parents a8fc4c1 + bded1a6 commit 4254a55

File tree

2 files changed

+35
-28
lines changed

2 files changed

+35
-28
lines changed

lib/tsan/rtl/tsan_platform.h

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,35 +29,42 @@ namespace __tsan {
2929
#if defined(__x86_64__)
3030
/*
3131
C/C++ on linux/x86_64 and freebsd/x86_64
32-
0000 0000 1000 - 0100 0000 0000: main binary and/or MAP_32BIT mappings
33-
0100 0000 0000 - 0200 0000 0000: -
34-
0200 0000 0000 - 1000 0000 0000: shadow
32+
0000 0000 1000 - 0040 0000 0000: main binary and/or MAP_32BIT mappings (256GB)
33+
0040 0000 0000 - 0100 0000 0000: -
34+
0100 0000 0000 - 1000 0000 0000: shadow
3535
1000 0000 0000 - 3000 0000 0000: -
3636
3000 0000 0000 - 4000 0000 0000: metainfo (memory blocks and sync objects)
37-
4000 0000 0000 - 6000 0000 0000: -
37+
4000 0000 0000 - 5540 0000 0000: -
38+
5540 0000 0000 - 5680 0000 0000: pie binaries without ASLR or on 4.1+ kernels
39+
5680 0000 0000 - 6000 0000 0000: -
3840
6000 0000 0000 - 6200 0000 0000: traces
3941
6200 0000 0000 - 7d00 0000 0000: -
40-
7d00 0000 0000 - 7e00 0000 0000: heap
41-
7e00 0000 0000 - 7e80 0000 0000: -
42-
7e80 0000 0000 - 8000 0000 0000: modules and main thread stack
42+
7c40 0000 0000 - 7d40 0000 0000: heap
43+
7d40 0000 0000 - 7ec0 0000 0000: -
44+
7ec0 0000 0000 - 8000 0000 0000: modules and main thread stack
4345
*/
4446
struct Mapping {
4547
static const uptr kMetaShadowBeg = 0x300000000000ull;
4648
static const uptr kMetaShadowEnd = 0x400000000000ull;
4749
static const uptr kTraceMemBeg = 0x600000000000ull;
4850
static const uptr kTraceMemEnd = 0x620000000000ull;
49-
static const uptr kShadowBeg = 0x020000000000ull;
51+
static const uptr kShadowBeg = 0x010000000000ull;
5052
static const uptr kShadowEnd = 0x100000000000ull;
51-
static const uptr kHeapMemBeg = 0x7d0000000000ull;
52-
static const uptr kHeapMemEnd = 0x7e0000000000ull;
53+
static const uptr kHeapMemBeg = 0x7c4000000000ull;
54+
static const uptr kHeapMemEnd = 0x7d4000000000ull;
5355
static const uptr kLoAppMemBeg = 0x000000001000ull;
54-
static const uptr kLoAppMemEnd = 0x010000000000ull;
55-
static const uptr kHiAppMemBeg = 0x7e8000000000ull;
56+
static const uptr kLoAppMemEnd = 0x004000000000ull;
57+
static const uptr kMidAppMemBeg = 0x554000000000ull;
58+
static const uptr kMidAppMemEnd = 0x568000000000ull;
59+
static const uptr kMidShadowOff = 0x540000000000ull;
60+
static const uptr kHiAppMemBeg = 0x7ec000000000ull;
5661
static const uptr kHiAppMemEnd = 0x800000000000ull;
5762
static const uptr kAppMemMsk = 0x7c0000000000ull;
58-
static const uptr kAppMemXor = 0x020000000000ull;
63+
static const uptr kAppMemXor = 0x028000000000ull;
5964
static const uptr kVdsoBeg = 0xf000000000000000ull;
6065
};
66+
67+
#define TSAN_MID_APP_RANGE 1
6168
#elif defined(__mips64)
6269
/*
6370
C/C++ on linux/mips64
@@ -652,17 +659,23 @@ template<typename Mapping>
652659
uptr ShadowToMemImpl(uptr s) {
653660
DCHECK(IsShadowMem(s));
654661
#ifndef SANITIZER_GO
655-
if (s >= MemToShadow(Mapping::kLoAppMemBeg)
656-
&& s <= MemToShadow(Mapping::kLoAppMemEnd - 1))
657-
return (s / kShadowCnt) ^ Mapping::kAppMemXor;
662+
// The shadow mapping is non-linear and we've lost some bits, so we don't have
663+
// an easy way to restore the original app address. But the mapping is a
664+
// bijection, so we try to restore the address as belonging to low/mid/high
665+
// range consecutively and see if shadow->app->shadow mapping gives us the
666+
// same address.
667+
uptr p = (s / kShadowCnt) ^ Mapping::kAppMemXor;
668+
if (MemToShadow(p) == s &&
669+
p >= Mapping::kLoAppMemBeg && p < Mapping::kLoAppMemEnd)
670+
return p;
658671
# ifdef TSAN_MID_APP_RANGE
659-
if (s >= MemToShadow(Mapping::kMidAppMemBeg)
660-
&& s <= MemToShadow(Mapping::kMidAppMemEnd - 1))
661-
return ((s / kShadowCnt) ^ Mapping::kAppMemXor) + Mapping::kMidShadowOff;
672+
p = ((s / kShadowCnt) ^ Mapping::kAppMemXor) + Mapping::kMidShadowOff;
673+
if (MemToShadow(p) == s &&
674+
p >= Mapping::kMidAppMemBeg && p < Mapping::kMidAppMemEnd)
675+
return p;
662676
# endif
663-
else
664-
return ((s / kShadowCnt) ^ Mapping::kAppMemXor) | Mapping::kAppMemMsk;
665-
#else
677+
return ((s / kShadowCnt) ^ Mapping::kAppMemXor) | Mapping::kAppMemMsk;
678+
#else // #ifndef SANITIZER_GO
666679
# ifndef SANITIZER_WINDOWS
667680
return (s & ~Mapping::kShadowBeg) / kShadowCnt;
668681
# else

test/tsan/pie_test.cc

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
// Check if tsan work with PIE binaries.
22
// RUN: %clang_tsan %s -pie -fpic -o %t && %run %t
33

4-
// Some kernels might map PIE segments outside the current segment
5-
// mapping defined for x86 [1].
6-
// [1] https://git.kernel.org/linus/d1fd836dcf00d2028c700c7e44d2c23404062c90
7-
8-
// UNSUPPORTED: x86
9-
104
int main(void) {
115
return 0;
126
}

0 commit comments

Comments
 (0)