From 56c7e2070808ff450f31033da626aea6747921c1 Mon Sep 17 00:00:00 2001
From: Peter Griess <pgriess@fb.com>
Date: Fri, 20 Dec 2013 11:26:44 -0800
Subject: [PATCH] Detect availability of cplus_demangle_v3_callback()

Summary:
- Add autoconf check for cplus_demangle_v3_callback() in libiberty and
avoid is usage when not available. Clang/libc++ on Mac OS X doesn't
support this.

Test Plan:
- fbconfig -r folly && fbmake runtests
- ./configure && make check on Mac OS X

Reviewed By: tudorb@fb.com

FB internal diff: D1108543
---
 folly/String.cpp          | 8 ++------
 folly/configure.ac        | 6 ++++++
 folly/test/StringTest.cpp | 2 ++
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/folly/String.cpp b/folly/String.cpp
index a90dd225..89373e10 100644
--- a/folly/String.cpp
+++ b/folly/String.cpp
@@ -24,11 +24,8 @@
 #include <iterator>
 #include <glog/logging.h>
 
-#undef FOLLY_DEMANGLE
-
-#if defined(__GNUG__) && __GNUG__ >= 4
+#if FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK
 # include <cxxabi.h>
-# define FOLLY_DEMANGLE 1
 
 // From libiberty
 //
@@ -310,7 +307,7 @@ size_t my_strlcpy(char* dest, const char* src, size_t size) {
 
 }  // namespace
 
-#ifdef FOLLY_DEMANGLE
+#if FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK
 
 fbstring demangle(const char* name) {
   int status;
@@ -376,7 +373,6 @@ size_t demangle(const char* name, char* out, size_t outSize) {
 }
 
 #endif
-#undef FOLLY_DEMANGLE
 
 namespace detail {
 
diff --git a/folly/configure.ac b/folly/configure.ac
index 825668f7..8c7a41e5 100644
--- a/folly/configure.ac
+++ b/folly/configure.ac
@@ -141,6 +141,12 @@ AC_LINK_IFELSE(
     AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
               [Define to 1 if the linker supports weak symbols.])])
 
+AC_SEARCH_LIBS([cplus_demangle_v3_callback], [iberty])
+if test "$ac_cv_search_cplus_demangle_v3_callback" != "no" ; then
+  AC_DEFINE([HAVE_CPLUS_DEMANGLE_V3_CALLBACK], [1],
+            [Define to 1 if we have cplus_demangle_v3_callback.])
+fi
+
 # Check for clock_gettime(2). This is not in an AC_CHECK_FUNCS() because we
 # want to link with librt if necessary.
 AC_SEARCH_LIBS([clock_gettime], [rt],
diff --git a/folly/test/StringTest.cpp b/folly/test/StringTest.cpp
index 54547b5a..92f6ba97 100644
--- a/folly/test/StringTest.cpp
+++ b/folly/test/StringTest.cpp
@@ -463,6 +463,7 @@ struct ThisIsAVeryLongStructureName {
 };
 }  // namespace folly_test
 
+#if FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK
 TEST(System, demangle) {
   char expected[] = "folly_test::ThisIsAVeryLongStructureName";
   EXPECT_STREQ(
@@ -482,6 +483,7 @@ TEST(System, demangle) {
     EXPECT_STREQ("folly_test", buf);
   }
 }
+#endif
 
 namespace {
 
-- 
2.34.1