From 62bd3f2351a7665e681f00ad6dd92b08b8c68b72 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Fri, 20 Jun 2014 15:50:53 +0200
Subject: libshouldbeinlibc: add assert(3) variant that prints backtraces

* libshouldbeinlibc/Makefile: Add new files
* libshouldbeinlibc/assert-backtrace.{c,h}: New files.
---
 libshouldbeinlibc/assert-backtrace.h | 60 ++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 libshouldbeinlibc/assert-backtrace.h

(limited to 'libshouldbeinlibc/assert-backtrace.h')

diff --git a/libshouldbeinlibc/assert-backtrace.h b/libshouldbeinlibc/assert-backtrace.h
new file mode 100644
index 00000000..c54b8106
--- /dev/null
+++ b/libshouldbeinlibc/assert-backtrace.h
@@ -0,0 +1,60 @@
+/* Augment failing assertions with backtraces.
+
+   Copyright (C) 1994-2015 Free Software Foundation, Inc.
+
+   This file is part of the GNU Hurd.
+
+   The GNU Hurd is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   The GNU Hurd is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with the GNU Hurd.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef __ASSERT_BACKTRACE__
+#define __ASSERT_BACKTRACE__
+
+#ifdef NDEBUG
+
+#define assert_backtrace(expr)		((void) 0)
+#define assert_backtrace_perror(errnum)	((void) 0)
+
+#else /* NDEBUG */
+
+/* This prints an "Assertion failed" message, prints a stack trace,
+   and aborts.	*/
+void __assert_fail_backtrace (const char *assertion,
+			      const char *file,
+			      unsigned int line,
+			      const char *function)
+  __attribute__ ((noreturn, unused));
+
+/* Likewise, but prints the error text for ERRNUM.  */
+void __assert_perror_fail_backtrace (int errnum,
+				     const char *file,
+				     unsigned int line,
+				     const char *function)
+  __attribute__ ((noreturn, unused));
+
+#define assert_backtrace(expr)						\
+  ((expr)								\
+   ? (void) 0								\
+   : __assert_fail_backtrace (__STRING(expr),				\
+			      __FILE__, __LINE__,			\
+			      __PRETTY_FUNCTION__))
+
+#define assert_perror_backtrace(expr)					\
+  ((expr == 0)								\
+   ? (void) 0								\
+   : __assert_perror_fail_backtrace (expr,				\
+				     __FILE__, __LINE__,		\
+				     __PRETTY_FUNCTION__))
+
+#endif /* NDEBUG */
+#endif /* __ASSERT_BACKTRACE__ */
-- 
cgit v1.2.3