summaryrefslogtreecommitdiff
path: root/m4/ax_cxx_gcc_abi_demangle.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/ax_cxx_gcc_abi_demangle.m4')
-rw-r--r--m4/ax_cxx_gcc_abi_demangle.m454
1 files changed, 54 insertions, 0 deletions
diff --git a/m4/ax_cxx_gcc_abi_demangle.m4 b/m4/ax_cxx_gcc_abi_demangle.m4
new file mode 100644
index 0000000..bc71cee
--- /dev/null
+++ b/m4/ax_cxx_gcc_abi_demangle.m4
@@ -0,0 +1,54 @@
+# ===========================================================================
+# http://autoconf-archive.cryp.to/ax_cxx_gcc_abi_demangle.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_GCC_ABI_DEMANGLE
+#
+# DESCRIPTION
+#
+# If the compiler supports GCC C++ ABI name demangling (has header
+# cxxabi.h and abi::__cxa_demangle() function), define
+# HAVE_GCC_ABI_DEMANGLE
+#
+# Adapted from AC_CXX_RTTI by Luc Maisonobe
+#
+# LICENSE
+#
+# Copyright (c) 2008 Neil Ferguson <nferguso@eso.org>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved.
+
+AC_DEFUN([AX_CXX_GCC_ABI_DEMANGLE],
+[AC_CACHE_CHECK(whether the compiler supports GCC C++ ABI name demangling,
+ac_cv_cxx_gcc_abi_demangle,
+[AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([#include <typeinfo>
+#include <cxxabi.h>
+#include <string>
+
+template<typename TYPE>
+class A {};
+],[A<int> instance;
+int status = 0;
+char* c_name = 0;
+
+c_name = abi::__cxa_demangle(typeid(instance).name(), 0, 0, &status);
+
+std::string name(c_name);
+free(c_name);
+
+return name == "A<int>";
+],
+ ac_cv_cxx_gcc_abi_demangle=yes, ac_cv_cxx_gcc_abi_demangle=no)
+ AC_LANG_RESTORE
+])
+if test "$ac_cv_cxx_gcc_abi_demangle" = yes; then
+ AC_DEFINE(HAVE_GCC_ABI_DEMANGLE,1,
+ [define if the compiler supports GCC C++ ABI name demangling])
+fi
+])