mailing list of musl libc
 help / color / mirror / code / Atom feed
* [PATCH] Add _Noreturn specifier to functions specified as such by ISO C11
@ 2012-09-05 11:53 philomath
  2012-09-05 14:18 ` Rich Felker
  2012-09-05 18:02 ` philomath
  0 siblings, 2 replies; 7+ messages in thread
From: philomath @ 2012-09-05 11:53 UTC (permalink / raw)
  To: musl

Since the _Noreturn identifier is not in the user's namespace, we can use it
directly.  in case it's not a keyword (i.e. pre-C11), it is defined as
__attribute__((__noreturn__)) on GCC (where it is implemented since version
2.95), and empty elsewhere.

There are some more interfaces and functions that could make use of this
specifier, here are only those specified in the C11 standard.

---
 include/setjmp.h      | 10 ++++--
 include/stdlib.h      | 15 ++++++---
 src/exit/_Exit.c      | 10 +++++-
 src/exit/abort.c      | 10 +++++-
 src/exit/exit.c       | 10 +++++-
 src/exit/quick_exit.c | 10 +++++-
 6 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/include/setjmp.h b/include/setjmp.h
index 7dc7276..6db4786 100644
--- a/include/setjmp.h
+++ b/include/setjmp.h
@@ -27,9 +27,15 @@ int _setjmp (jmp_buf);
 void _longjmp (jmp_buf, int);
 #endif
 
-
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
 int setjmp (jmp_buf);
-void longjmp (jmp_buf, int);
+_Noreturn void longjmp (jmp_buf, int);
 
 #define setjmp setjmp
 #define longjmp longjmp
diff --git a/include/stdlib.h b/include/stdlib.h
index 1749cb3..5e28cd2 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -40,12 +40,19 @@ void *realloc (void *, size_t);
 void free (void *);
 void *aligned_alloc(size_t alignment, size_t size);
 
-void abort (void);
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+_Noreturn void abort (void);
 int atexit (void (*) (void));
-void exit (int);
-void _Exit (int);
+_Noreturn void exit (int);
+_Noreturn void _Exit (int);
 int at_quick_exit (void (*) (void));
-void quick_exit (int);
+_Noreturn void quick_exit (int);
 
 char *getenv (const char *);
 
diff --git a/src/exit/_Exit.c b/src/exit/_Exit.c
index 6ceb143..ea85e4a 100644
--- a/src/exit/_Exit.c
+++ b/src/exit/_Exit.c
@@ -1,7 +1,15 @@
 #include <stdlib.h>
 #include "syscall.h"
 
-void _Exit(int ec)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void _Exit(int ec)
 {
 	__syscall(SYS_exit_group, ec);
 	__syscall(SYS_exit, ec);
diff --git a/src/exit/abort.c b/src/exit/abort.c
index c5b9e52..a3fa436 100644
--- a/src/exit/abort.c
+++ b/src/exit/abort.c
@@ -2,7 +2,15 @@
 #include <signal.h>
 #include "syscall.h"
 
-void abort(void)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void abort(void)
 {
 	raise(SIGABRT);
 	raise(SIGKILL);
diff --git a/src/exit/exit.c b/src/exit/exit.c
index e4aeaf1..0a1c9aa 100644
--- a/src/exit/exit.c
+++ b/src/exit/exit.c
@@ -14,7 +14,15 @@ weak_alias(dummy, __funcs_on_exit);
 weak_alias(dummy, __flush_on_exit);
 weak_alias(dummy, __seek_on_exit);
 
-void exit(int code)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void exit(int code)
 {
 	static int lock;
 
diff --git a/src/exit/quick_exit.c b/src/exit/quick_exit.c
index 18d5288..936cd7f 100644
--- a/src/exit/quick_exit.c
+++ b/src/exit/quick_exit.c
@@ -3,10 +3,18 @@
 #include "atomic.h"
 #include "libc.h"
 
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
 static void dummy() { }
 weak_alias(dummy, __funcs_on_quick_exit);
 
-void quick_exit(int code)
+_Noreturn void quick_exit(int code)
 {
 	static int lock;
 	while (a_swap(&lock, 1)) __syscall(SYS_pause);
-- 
1.7.12


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-09-07  1:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-05 11:53 [PATCH] Add _Noreturn specifier to functions specified as such by ISO C11 philomath
2012-09-05 14:18 ` Rich Felker
2012-09-05 18:02 ` philomath
2012-09-06  3:12   ` Rich Felker
2012-09-06 14:02     ` philomath
2012-09-06 16:19       ` Rich Felker
2012-09-07  1:34       ` Anthony J. Bentley

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).