Mac OS X 10.7 bootstrap is currently broken in libsanitizer since lsan/lsan_common_mac.cc uses VM_MEMORY_OS_ALLOC_ONCE which was only introduced in Mac OS X 10.9. Upstream rejected the trivial patch to make the use conditional since that's likely to be unreliable:
https://reviews.llvm.org/D39888 Given that the macro is used in a file that's compiled even when lsan isn't supported (as on Mac OS X, probably due to lsan's use of the blocks extension that gcc doesn't support), the reasonable solution seems to be to allow predefining CAN_SANITIZE_LEAKS in lsan/lsan_common.h and disable that in the build system so the affected files are effectively empty. When I tried to do this within LLVM's build system, I ran into so many road blocks with building LLVM trunk on Mac OS X 10.7 (and 10.13) with gcc that I gave up. Perhaps the two-line change to lsan/lsan_common.h can still go upstream, otherwise it would have to be gcc-local like similar code for CAN_SANITIZE_UB in ubsan/ubsan_platform.h. The rest of the patch is gcc-private anyway since it only affects the build system. It consists of two parts: * Defining CAN_SANITIZE_LEAKS=0 for affected Mac OS X versions (everything before Darwin 13/Mac OS X 10.9). * This is not enough, however: before Xcode 4.5, the Darwin ld cannot handle undefined weak symbols which are now assumed to be supported on Darwin since the last libsanitizer import from upstream. Fortunately, one can define SANITIZER_SUPPORTS_WEAK_HOOKS=0 to avoid this, which the patch does as well, again by a OS version test since a proper configure test is probably too involved. Tested by rebuilding libsanitizer on x86_64-apple-darwin11.4.2 and running the {asan,tsan,ubsan}.exp tests for both multilibs: testresults are now en par with Darwin 17. I've also bootstrapped the test on x86_64-pc-linux-gnu to check that neither defines above are enabled. Ok for mainline? Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University 2017-11-13 Rainer Orth <r...@cebitec.uni-bielefeld.de> PR sanitizer/82824 * configure.ac (LSAN_COMMON_SUPPORTED): New conditional. Disable before *-*-darwin13*. (WEAK_HOOKS_SUPPORT): New conditional. * configure: Regenerate. * asan/Makefile.am (DEFS) [!LSAN_COMMON_SUPPORTED]: Disable CAN_SANITIZE_LEAKS. (DEFS) [!LSAN_COMMON_SUPPORTED]: Disable SANITIZER_SUPPORTS_WEAK_HOOKS. * asan/Makefile.in: Regenerate. * lsan/Makefile.am (DEFS) [!LSAN_COMMON_SUPPORTED]: Disable CAN_SANITIZE_LEAKS. (DEFS) [!LSAN_COMMON_SUPPORTED]: Disable SANITIZER_SUPPORTS_WEAK_HOOKS. * lsan/Makefile.in: Regenerate. * lsan/lsan_common.h: Allow predefining CAN_SANITIZE_LEAKS. * sanitizer_common/Makefile.am (DEFS) [!LSAN_COMMON_SUPPORTED]: Disable SANITIZER_SUPPORTS_WEAK_HOOKS. * sanitizer_common/Makefile.in: Regenerate.
# HG changeset patch # Parent eaaab03d905888004baa739a681a239d4b4e3d29 Fix Mac OS X 10.7 bootstrap diff --git a/libsanitizer/asan/Makefile.am b/libsanitizer/asan/Makefile.am --- a/libsanitizer/asan/Makefile.am +++ b/libsanitizer/asan/Makefile.am @@ -7,6 +7,12 @@ DEFS = -D_GNU_SOURCE -D_DEBUG -D__STDC_C if USING_MAC_INTERPOSE DEFS += -DMAC_INTERPOSE_FUNCTIONS -DMISSING_BLOCKS_SUPPORT endif +if !LSAN_COMMON_SUPPORTED +DEFS += -DCAN_SANITIZE_LEAKS=0 +endif +if !WEAK_HOOKS_SUPPORT +DEFS += -DSANITIZER_SUPPORTS_WEAK_HOOKS=0 +endif AM_CXXFLAGS = -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long -fPIC -fno-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros -fno-ipa-icf AM_CXXFLAGS += $(LIBSTDCXX_RAW_CXX_CXXFLAGS) AM_CXXFLAGS += -std=gnu++11 diff --git a/libsanitizer/configure.ac b/libsanitizer/configure.ac --- a/libsanitizer/configure.ac +++ b/libsanitizer/configure.ac @@ -140,6 +140,24 @@ case "$host" in esac AM_CONDITIONAL(USING_MAC_INTERPOSE, $MAC_INTERPOSE) +# lsan_common_mac.cc needs VM_MEMORY_OS_ALLOC_ONCE which was only +# introduced in Mac OS X 10.9/Darwin 13. +case "$host" in + *-*-darwin[[1-9]] | *-*-darwin[[1-9]].* | *-*-darwin1[[0-2]]*) + LSAN_COMMON=false ;; + *) LSAN_COMMON=true ;; +esac +AM_CONDITIONAL(LSAN_COMMON_SUPPORTED, $LSAN_COMMON) + +# Before Xcode 4.5, the Darwin linker doesn't properly support undefined +# weak symbols. +case "$host" in + *-*-darwin[[1-9]] | *-*-darwin[[1-9]].* | *-*-darwin1[[0-2]]*) + WEAK_HOOKS=false ;; + *) WEAK_HOOKS=true ;; +esac +AM_CONDITIONAL(WEAK_HOOKS_SUPPORT, $WEAK_HOOKS) + backtrace_supported=yes AC_MSG_CHECKING([for necessary platform features]) diff --git a/libsanitizer/lsan/Makefile.am b/libsanitizer/lsan/Makefile.am --- a/libsanitizer/lsan/Makefile.am +++ b/libsanitizer/lsan/Makefile.am @@ -4,6 +4,12 @@ AM_CPPFLAGS = -I $(top_srcdir)/include - gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER) DEFS = -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +if !LSAN_COMMON_SUPPORTED +DEFS += -DCAN_SANITIZE_LEAKS=0 +endif +if !WEAK_HOOKS_SUPPORT +DEFS += -DSANITIZER_SUPPORTS_WEAK_HOOKS=0 +endif AM_CXXFLAGS = -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long -fPIC -fno-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros AM_CXXFLAGS += $(LIBSTDCXX_RAW_CXX_CXXFLAGS) AM_CXXFLAGS += -std=gnu++11 diff --git a/libsanitizer/lsan/lsan_common.h b/libsanitizer/lsan/lsan_common.h --- a/libsanitizer/lsan/lsan_common.h +++ b/libsanitizer/lsan/lsan_common.h @@ -20,6 +20,7 @@ #include "sanitizer_common/sanitizer_stoptheworld.h" #include "sanitizer_common/sanitizer_symbolizer.h" +#ifndef CAN_SANITIZE_LEAKS // LeakSanitizer relies on some Glibc's internals (e.g. TLS machinery) thus // supported for Linux only. Also, LSan doesn't like 32 bit architectures // because of "small" (4 bytes) pointer size that leads to high false negative @@ -42,6 +43,7 @@ #else #define CAN_SANITIZE_LEAKS 0 #endif +#endif // CAN_SANITIZE_LEAKS namespace __sanitizer { class FlagParser; diff --git a/libsanitizer/sanitizer_common/Makefile.am b/libsanitizer/sanitizer_common/Makefile.am --- a/libsanitizer/sanitizer_common/Makefile.am +++ b/libsanitizer/sanitizer_common/Makefile.am @@ -4,6 +4,9 @@ AM_CPPFLAGS = -I $(top_srcdir)/include - gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER) DEFS = -D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS @RPC_DEFS@ +if !WEAK_HOOKS_SUPPORT +DEFS += -DSANITIZER_SUPPORTS_WEAK_HOOKS=0 +endif AM_CXXFLAGS = -Wall -W -Wno-unused-parameter -Wwrite-strings -pedantic -Wno-long-long -fPIC -fno-builtin -fno-exceptions -fno-rtti -fomit-frame-pointer -funwind-tables -fvisibility=hidden -Wno-variadic-macros AM_CXXFLAGS += $(LIBSTDCXX_RAW_CXX_CXXFLAGS) AM_CXXFLAGS += -std=gnu++11