Index: compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp =================================================================== --- compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp +++ compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp @@ -15,28 +15,29 @@ #if SANITIZER_POSIX -#include "sanitizer_common.h" -#include "sanitizer_flags.h" -#include "sanitizer_platform_limits_netbsd.h" -#include "sanitizer_platform_limits_posix.h" -#include "sanitizer_platform_limits_solaris.h" -#include "sanitizer_posix.h" -#include "sanitizer_procmaps.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if SANITIZER_FREEBSD +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# include "sanitizer_atomic.h" +# include "sanitizer_common.h" +# include "sanitizer_flags.h" +# include "sanitizer_platform_limits_netbsd.h" +# include "sanitizer_platform_limits_posix.h" +# include "sanitizer_platform_limits_solaris.h" +# include "sanitizer_posix.h" +# include "sanitizer_procmaps.h" + +# if SANITIZER_FREEBSD // The MAP_NORESERVE define has been removed in FreeBSD 11.x, and even before // that, it was never implemented. So just define it to zero. #undef MAP_NORESERVE @@ -166,9 +167,13 @@ #if !SANITIZER_GO // TODO(glider): different tools may require different altstack size. static uptr GetAltStackSize() { - // SIGSTKSZ is not enough. - static const uptr kAltStackSize = SIGSTKSZ * 4; - return kAltStackSize; + static atomic_uintptr_t kAltStackSize{0}; + uptr ret = atomic_load(&kAltStackSize, memory_order_relaxed); + if (ret == 0) { + // SIGSTKSZ is not enough. + atomic_store(&kAltStackSize, SIGSTKSZ * 4, memory_order_relaxed); + } + return ret; } void SetAlternateSignalStack() {