+// Try to detect and use the C++ itanium ABI for name demangling:
+#ifdef __GXX_ABI_VERSION
+#include <cxxabi.h>
+#endif
+
+#if HAVE_BOOST_STACKTRACE_BACKTRACE
+#define BOOST_STACKTRACE_USE_BACKTRACE
+#include <boost/stacktrace.hpp>
+#elif HAVE_BOOST_STACKTRACE_ADDR2LINE
+#define BOOST_STACKTRACE_USE_ADDR2LINE
+#include <boost/stacktrace.hpp>
+#endif
+
+/** @brief show the backtrace of the current point (lovely while debugging) */
+void xbt_backtrace_display_current()
+{
+ simgrid::xbt::Backtrace().display();
+}
+
+namespace simgrid {
+namespace xbt {
+
+std::unique_ptr<char, std::function<void(char*)>> demangle(const char* name)
+{
+#ifdef __GXX_ABI_VERSION
+ int status;
+ std::unique_ptr<char, std::function<void(char*)>> res(abi::__cxa_demangle(name, nullptr, nullptr, &status),
+ &std::free);
+ if (res != nullptr)
+ return res;
+ // We did not manage to resolve this. Probably because this is not a mangled symbol:
+#endif
+ // Return the symbol:
+ return std::unique_ptr<char, std::function<void(char*)>>(xbt_strdup(name), &xbt_free_f);
+}
+
+class BacktraceImpl {
+ short refcount_ = 1;
+
+public:
+ void ref() { refcount_++; }
+ bool unref()
+ {
+ refcount_--;
+ if (refcount_ == 0) {
+ delete this;
+ return true;
+ } else {
+ return false;
+ }
+ }
+#if HAVE_BOOST_STACKTRACE_BACKTRACE || HAVE_BOOST_STACKTRACE_ADDR2LINE
+ boost::stacktrace::stacktrace st;
+#endif
+};