diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2012-12-21 10:45:01 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2012-12-21 10:45:01 +0000 |
commit | 1859251df8e2cf11dba881b88165250958078654 (patch) | |
tree | 415193505a738ecfad3db7e718a0d4411700366f | |
parent | ab7654e894f46112abaca50cb5e6855b0955928d (diff) | |
download | bcm5719-llvm-1859251df8e2cf11dba881b88165250958078654.tar.gz bcm5719-llvm-1859251df8e2cf11dba881b88165250958078654.zip |
tsan: disable checks for limited address space and unlimited stack for Go
llvm-svn: 170876
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc index 523f97c1703..7e5023c29da 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cc @@ -212,29 +212,34 @@ const char *InitializePlatform() { // Disable core dumps, dumping of 16TB usually takes a bit long. setlim(RLIMIT_CORE, 0); } - bool reexec = false; - // TSan doesn't play well with unlimited stack size (as stack - // overlaps with shadow memory). If we detect unlimited stack size, - // we re-exec the program with limited stack size as a best effort. - if (getlim(RLIMIT_STACK) == (rlim_t)-1) { - const uptr kMaxStackSize = 32 * 1024 * 1024; - Report("WARNING: Program is run with unlimited stack size, which " - "wouldn't work with ThreadSanitizer.\n"); - Report("Re-execing with stack size limited to %zd bytes.\n", kMaxStackSize); - SetStackSizeLimitInBytes(kMaxStackSize); - reexec = true; - } - if (getlim(RLIMIT_AS) != (rlim_t)-1) { - Report("WARNING: Program is run with limited virtual address space, which " - "wouldn't work with ThreadSanitizer.\n"); - Report("Re-execing with unlimited virtual address space.\n"); - setlim(RLIMIT_AS, -1); - reexec = true; - } + // Go maps shadow memory lazily and works fine with limited address space. + // Unlimited stack is not a problem as well, because the executable + // is not compiled with -pie. + if (kCppMode) { + bool reexec = false; + // TSan doesn't play well with unlimited stack size (as stack + // overlaps with shadow memory). If we detect unlimited stack size, + // we re-exec the program with limited stack size as a best effort. + if (getlim(RLIMIT_STACK) == (rlim_t)-1) { + const uptr kMaxStackSize = 32 * 1024 * 1024; + Report("WARNING: Program is run with unlimited stack size, which " + "wouldn't work with ThreadSanitizer.\n"); + Report("Re-execing with stack size limited to %zd bytes.\n", kMaxStackSize); + SetStackSizeLimitInBytes(kMaxStackSize); + reexec = true; + } - if (reexec) - ReExec(); + if (getlim(RLIMIT_AS) != (rlim_t)-1) { + Report("WARNING: Program is run with limited virtual address space, which " + "wouldn't work with ThreadSanitizer.\n"); + Report("Re-execing with unlimited virtual address space.\n"); + setlim(RLIMIT_AS, -1); + reexec = true; + } + if (reexec) + ReExec(); + } #ifndef TSAN_GO CheckPIE(); |