+#define RETHROWF(...) \
+ do { \
+ char *_xbt_ex_internal_msg = __xbt_running_ctx_fetch()->exception.msg; \
+ __xbt_running_ctx_fetch()->exception.msg = bprintf(__VA_ARGS__, \
+ _xbt_ex_internal_msg); \
+ free(_xbt_ex_internal_msg); \
+ RETHROW; \
+ } while (0)
+
+/** @brief Exception destructor */
+XBT_PUBLIC(void) xbt_ex_free(xbt_ex_t e);
+
+/** @brief Shows a backtrace of the current location */
+XBT_PUBLIC(void) xbt_backtrace_display_current(void);
+/** @brief reimplementation of glibc backtrace based directly on gcc library, without implicit malloc */
+XBT_PUBLIC(int)xbt_backtrace_no_malloc(void**bt, int size);
+/** @brief Captures a backtrace for further use */
+XBT_PUBLIC(void) xbt_backtrace_current(xbt_ex_t * e);
+/** @brief Display a previously captured backtrace */
+XBT_PUBLIC(void) xbt_backtrace_display(xbt_ex_t * e);
+
+#ifdef XBT_USE_DEPRECATED
+
+/* Kept for backward compatibility. */
+
+#define THROW0(c, v, m) \
+ do { if (m) THROWF(c, v, m); else THROW(c, v); } while (0)
+#define THROW1(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW2(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW3(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW4(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW5(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW6(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW7(c, v, ...) THROWF(c, v, __VA_ARGS__)
+
+#define RETHROW0(...) RETHROWF(__VA_ARGS__)
+#define RETHROW1(...) RETHROWF(__VA_ARGS__)
+#define RETHROW2(...) RETHROWF(__VA_ARGS__)
+#define RETHROW3(...) RETHROWF(__VA_ARGS__)
+#define RETHROW4(...) RETHROWF(__VA_ARGS__)
+#define RETHROW5(...) RETHROWF(__VA_ARGS__)
+
+#endif
+
+SG_END_DECL()