From 681e46770a9045f8c9c98ae13d3f6205f2be6c85 Mon Sep 17 00:00:00 2001 From: Philip Pronin Date: Wed, 16 Oct 2013 00:01:53 -0700 Subject: [PATCH] avoid using ifunc + ASan Summary: Code that is using ifunc dies with SIGSEGV on startup when used with ASan. Here is gdb output: {P2882504} Seems like `ifunc` dispatch is happening before ASan is initialized, but ASan instrumentation logic being called from there. Test Plan: built affected unicorn binaries with ASan, ran them, verified there is no more SIGSEGV Reviewed By: meyering@fb.com FB internal diff: D1013420 --- folly/Bits.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/folly/Bits.cpp b/folly/Bits.cpp index 15842b45..76ceb0fa 100644 --- a/folly/Bits.cpp +++ b/folly/Bits.cpp @@ -17,6 +17,7 @@ #include "folly/Bits.h" #include "folly/CpuId.h" +#include "folly/Portability.h" // None of this is necessary if we're compiling for a target that supports // popcnt @@ -32,8 +33,7 @@ int popcountll_builtin(unsigned long long x) { return __builtin_popcountll(x); } - -#if FOLLY_HAVE_IFUNC +#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS) // Strictly speaking, these versions of popcount are usable without ifunc // support. However, we would have to check, via CpuId, if the processor @@ -63,7 +63,7 @@ extern "C" Type_popcountll* folly_popcountll_ifunc() { return folly::CpuId().popcnt() ? popcountll_inst : popcountll_builtin; } -#endif // FOLLY_HAVE_IFUNC +#endif // FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS) } // namespace @@ -73,7 +73,7 @@ namespace detail { // Call folly_popcount_ifunc on startup to resolve to either popcount_inst // or popcount_builtin int popcount(unsigned int x) -#if FOLLY_HAVE_IFUNC +#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS) __attribute__((ifunc("folly_popcount_ifunc"))); #else { return popcount_builtin(x); } @@ -82,7 +82,7 @@ int popcount(unsigned int x) // Call folly_popcount_ifunc on startup to resolve to either popcountll_inst // or popcountll_builtin int popcountll(unsigned long long x) -#if FOLLY_HAVE_IFUNC +#if FOLLY_HAVE_IFUNC && !defined(FOLLY_SANITIZE_ADDRESS) __attribute__((ifunc("folly_popcountll_ifunc"))); #else { return popcountll_builtin(x); } -- 2.34.1