aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2019-04-18 00:30:24 -0700
committerPaul Eggert2019-04-18 00:35:18 -0700
commit6d6c55db2cdfb6b354873f17285a3f602e011817 (patch)
treefc9647797be220e613962260700c05e5f37100c1 /src
parentdded2c4cf30fbdb5e90c44bc76a26970d00e0f22 (diff)
downloademacs-6d6c55db2cdfb6b354873f17285a3f602e011817.tar.gz
emacs-6d6c55db2cdfb6b354873f17285a3f602e011817.zip
Mark _Noreturn error functions as cold
On my platform this made ‘make compile-always’ 1.3% faster. Suggested by Alex Gramiak in: https://lists.gnu.org/r/emacs-devel/2019-04/msg00684.html * configure.ac (nw): Don’t use -Wsuggest-attribute=cold. * lib-src/make-docfile.c (write_globals): Mark noreturn functions as cold. * src/callproc.c (exec_failed): * src/data.c (wrong_length_argument, wrong_type_argument): * src/emacs-module.c (module_abort): * src/emacs.c (terminate_due_to_signal): * src/eval.c (unwind_to_catch): * src/image.c (my_png_error, my_error_exit): * src/json.c (json_out_of_memory, json_parse_error): * src/keyboard.c (quit_throw_to_read_char, user_error): * src/lisp.h (die, wrong_type_argument, wrong_choice) (args_out_of_range, args_out_of_range_3, circular_list) (buffer_overflow, memory_full, buffer_memory_full) (string_overflow, xsignal, xsignal0, xsignal1, xsignal2) (xsignal3, signal_error, overflow_error, error, verror) (nsberror, report_file_errno, report_file_error) (report_file_notify_error, terminate_due_to_signal) (emacs_abort, fatal): * src/lread.c (load_error_old_style_backquotes) (end_of_file_error, invalid_syntax): * src/pdumper.c (error_unsupported_dump_object): * src/puresize.h (pure_write_error): * src/search.c (matcher_overflow): * src/sound.c (sound_perror, alsa_sound_perror): * src/sysdep.c (handle_arith_signal): * src/systime.h (time_overflow): * src/term.c (maybe_fatal, vfatal): * src/textprop.c (text_read_only): * src/timefns.c (invalid_time_zone_specification) (time_error, invalid_hz): * src/xterm.c (x_connection_closed): Use AVOID instead of _Noreturn void, so that it’s marked cold. * src/conf_post.h (__has_attribute_cold) [!__has_attribute]: New macro. (ATTRIBUTE_COLD): New macro. * src/frame.h (WINDOW_SYSTEM_RETURN): Add ATTRIBUTE_COLD. * src/lisp.h (AVOID): New macro. * src/xterm.c: Omit unnecessary static decls, so that we needn’t worry about which functions should be marked cold. (x_io_error_quitter): Mark as cold.
Diffstat (limited to 'src')
-rw-r--r--src/callproc.c2
-rw-r--r--src/conf_post.h7
-rw-r--r--src/data.c4
-rw-r--r--src/emacs-module.c6
-rw-r--r--src/emacs.c2
-rw-r--r--src/eval.c2
-rw-r--r--src/frame.h2
-rw-r--r--src/image.c4
-rw-r--r--src/json.c4
-rw-r--r--src/keyboard.c6
-rw-r--r--src/lisp.h58
-rw-r--r--src/lread.c6
-rw-r--r--src/pdumper.c3
-rw-r--r--src/puresize.h2
-rw-r--r--src/search.c2
-rw-r--r--src/sound.c4
-rw-r--r--src/sysdep.c2
-rw-r--r--src/systime.h2
-rw-r--r--src/term.c7
-rw-r--r--src/textprop.c2
-rw-r--r--src/timefns.c6
-rw-r--r--src/xterm.c35
22 files changed, 70 insertions, 98 deletions
diff --git a/src/callproc.c b/src/callproc.c
index 2cdf84d9a80..98c67312b49 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1135,7 +1135,7 @@ add_env (char **env, char **new_env, char *string)
1135 mess up the allocator's data structures in the parent. 1135 mess up the allocator's data structures in the parent.
1136 Report the error and exit the child. */ 1136 Report the error and exit the child. */
1137 1137
1138static _Noreturn void 1138static AVOID
1139exec_failed (char const *name, int err) 1139exec_failed (char const *name, int err)
1140{ 1140{
1141 /* Avoid deadlock if the child's perror writes to a full pipe; the 1141 /* Avoid deadlock if the child's perror writes to a full pipe; the
diff --git a/src/conf_post.h b/src/conf_post.h
index f8254cfa9df..6ea2c7b664b 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -73,6 +73,7 @@ typedef bool bool_bf;
73# define __has_attribute(a) __has_attribute_##a 73# define __has_attribute(a) __has_attribute_##a
74# define __has_attribute_alloc_size GNUC_PREREQ (4, 3, 0) 74# define __has_attribute_alloc_size GNUC_PREREQ (4, 3, 0)
75# define __has_attribute_cleanup GNUC_PREREQ (3, 4, 0) 75# define __has_attribute_cleanup GNUC_PREREQ (3, 4, 0)
76# define __has_attribute_cold GNUC_PREREQ (4, 3, 0)
76# define __has_attribute_externally_visible GNUC_PREREQ (4, 1, 0) 77# define __has_attribute_externally_visible GNUC_PREREQ (4, 1, 0)
77# define __has_attribute_no_address_safety_analysis false 78# define __has_attribute_no_address_safety_analysis false
78# define __has_attribute_no_sanitize_address GNUC_PREREQ (4, 8, 0) 79# define __has_attribute_no_sanitize_address GNUC_PREREQ (4, 8, 0)
@@ -223,6 +224,12 @@ extern void _DebPrint (const char *fmt, ...);
223extern char *emacs_getenv_TZ (void); 224extern char *emacs_getenv_TZ (void);
224extern int emacs_setenv_TZ (char const *); 225extern int emacs_setenv_TZ (char const *);
225 226
227#if __has_attribute (cold)
228# define ATTRIBUTE_COLD __attribute__ ((cold))
229#else
230# define ATTRIBUTE_COLD
231#endif
232
226#if __GNUC__ >= 3 /* On GCC 3.0 we might get a warning. */ 233#if __GNUC__ >= 3 /* On GCC 3.0 we might get a warning. */
227#define NO_INLINE __attribute__((noinline)) 234#define NO_INLINE __attribute__((noinline))
228#else 235#else
diff --git a/src/data.c b/src/data.c
index 11cd598ed85..1b2431011e9 100644
--- a/src/data.c
+++ b/src/data.c
@@ -130,7 +130,7 @@ set_blv_valcell (struct Lisp_Buffer_Local_Value *blv, Lisp_Object val)
130 blv->valcell = val; 130 blv->valcell = val;
131} 131}
132 132
133static _Noreturn void 133static AVOID
134wrong_length_argument (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3) 134wrong_length_argument (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3)
135{ 135{
136 Lisp_Object size1 = make_fixnum (bool_vector_size (a1)); 136 Lisp_Object size1 = make_fixnum (bool_vector_size (a1));
@@ -142,7 +142,7 @@ wrong_length_argument (Lisp_Object a1, Lisp_Object a2, Lisp_Object a3)
142 make_fixnum (bool_vector_size (a3))); 142 make_fixnum (bool_vector_size (a3)));
143} 143}
144 144
145_Noreturn void 145AVOID
146wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value) 146wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value)
147{ 147{
148 /* If VALUE is not even a valid Lisp object, we'd want to abort here 148 /* If VALUE is not even a valid Lisp object, we'd want to abort here
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 47ca3368c0f..09a768e18ed 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -147,8 +147,7 @@ static enum emacs_funcall_exit module_non_local_exit_check (emacs_env *);
147static void module_assert_thread (void); 147static void module_assert_thread (void);
148static void module_assert_runtime (struct emacs_runtime *); 148static void module_assert_runtime (struct emacs_runtime *);
149static void module_assert_env (emacs_env *); 149static void module_assert_env (emacs_env *);
150static _Noreturn void module_abort (const char *format, ...) 150static AVOID module_abort (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
151 ATTRIBUTE_FORMAT_PRINTF(1, 2);
152static emacs_env *initialize_environment (emacs_env *, 151static emacs_env *initialize_environment (emacs_env *,
153 struct emacs_env_private *); 152 struct emacs_env_private *);
154static void finalize_environment (emacs_env *); 153static void finalize_environment (emacs_env *);
@@ -1163,8 +1162,7 @@ init_module_assertions (bool enable)
1163 initialize_storage (&global_storage); 1162 initialize_storage (&global_storage);
1164} 1163}
1165 1164
1166static _Noreturn void 1165static AVOID ATTRIBUTE_FORMAT_PRINTF (1, 2)
1167ATTRIBUTE_FORMAT_PRINTF(1, 2)
1168module_abort (const char *format, ...) 1166module_abort (const char *format, ...)
1169{ 1167{
1170 fputs ("Emacs module assertion: ", stderr); 1168 fputs ("Emacs module assertion: ", stderr);
diff --git a/src/emacs.c b/src/emacs.c
index 6ed4b0ed87a..5eba88c74ff 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -370,7 +370,7 @@ using_utf8 (void)
370 370
371/* Report a fatal error due to signal SIG, output a backtrace of at 371/* Report a fatal error due to signal SIG, output a backtrace of at
372 most BACKTRACE_LIMIT lines, and exit. */ 372 most BACKTRACE_LIMIT lines, and exit. */
373_Noreturn void 373AVOID
374terminate_due_to_signal (int sig, int backtrace_limit) 374terminate_due_to_signal (int sig, int backtrace_limit)
375{ 375{
376 signal (sig, SIG_DFL); 376 signal (sig, SIG_DFL);
diff --git a/src/eval.c b/src/eval.c
index fa7b2d06031..c2e996a9474 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1133,7 +1133,7 @@ internal_catch (Lisp_Object tag,
1133 1133
1134 This is used for correct unwinding in Fthrow and Fsignal. */ 1134 This is used for correct unwinding in Fthrow and Fsignal. */
1135 1135
1136static _Noreturn void 1136static AVOID
1137unwind_to_catch (struct handler *catch, Lisp_Object value) 1137unwind_to_catch (struct handler *catch, Lisp_Object value)
1138{ 1138{
1139 bool last_time; 1139 bool last_time;
diff --git a/src/frame.h b/src/frame.h
index ec8f61465f2..e2e8eaab9bb 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1262,7 +1262,7 @@ extern int frame_default_tool_bar_height;
1262#ifdef HAVE_WINDOW_SYSTEM 1262#ifdef HAVE_WINDOW_SYSTEM
1263# define WINDOW_SYSTEM_RETURN 1263# define WINDOW_SYSTEM_RETURN
1264#else 1264#else
1265# define WINDOW_SYSTEM_RETURN _Noreturn 1265# define WINDOW_SYSTEM_RETURN _Noreturn ATTRIBUTE_COLD
1266#endif 1266#endif
1267 1267
1268extern WINDOW_SYSTEM_RETURN struct frame * 1268extern WINDOW_SYSTEM_RETURN struct frame *
diff --git a/src/image.c b/src/image.c
index c1a23edefce..8e3a9a4930a 100644
--- a/src/image.c
+++ b/src/image.c
@@ -6079,7 +6079,7 @@ init_png_functions (void)
6079/* Error and warning handlers installed when the PNG library 6079/* Error and warning handlers installed when the PNG library
6080 is initialized. */ 6080 is initialized. */
6081 6081
6082static _Noreturn void 6082static AVOID
6083my_png_error (png_struct *png_ptr, const char *msg) 6083my_png_error (png_struct *png_ptr, const char *msg)
6084{ 6084{
6085 eassert (png_ptr != NULL); 6085 eassert (png_ptr != NULL);
@@ -6718,7 +6718,7 @@ struct my_jpeg_error_mgr
6718}; 6718};
6719 6719
6720 6720
6721static _Noreturn void 6721static AVOID
6722my_error_exit (j_common_ptr cinfo) 6722my_error_exit (j_common_ptr cinfo)
6723{ 6723{
6724 struct my_jpeg_error_mgr *mgr = (struct my_jpeg_error_mgr *) cinfo->err; 6724 struct my_jpeg_error_mgr *mgr = (struct my_jpeg_error_mgr *) cinfo->err;
diff --git a/src/json.c b/src/json.c
index 74e0534065f..5917212899e 100644
--- a/src/json.c
+++ b/src/json.c
@@ -255,7 +255,7 @@ json_encode (Lisp_Object string)
255 return code_convert_string (string, Qutf_8_unix, Qt, true, true, true); 255 return code_convert_string (string, Qutf_8_unix, Qt, true, true, true);
256} 256}
257 257
258static _Noreturn void 258static AVOID
259json_out_of_memory (void) 259json_out_of_memory (void)
260{ 260{
261 xsignal0 (Qjson_out_of_memory); 261 xsignal0 (Qjson_out_of_memory);
@@ -263,7 +263,7 @@ json_out_of_memory (void)
263 263
264/* Signal a Lisp error corresponding to the JSON ERROR. */ 264/* Signal a Lisp error corresponding to the JSON ERROR. */
265 265
266static _Noreturn void 266static AVOID
267json_parse_error (const json_error_t *error) 267json_parse_error (const json_error_t *error)
268{ 268{
269 Lisp_Object symbol; 269 Lisp_Object symbol;
diff --git a/src/keyboard.c b/src/keyboard.c
index 8fb6db987b5..dff8f6b2fc9 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -364,7 +364,7 @@ static void restore_getcjmp (void *);
364static Lisp_Object apply_modifiers (int, Lisp_Object); 364static Lisp_Object apply_modifiers (int, Lisp_Object);
365static void restore_kboard_configuration (int); 365static void restore_kboard_configuration (int);
366static void handle_interrupt (bool); 366static void handle_interrupt (bool);
367static _Noreturn void quit_throw_to_read_char (bool); 367static AVOID quit_throw_to_read_char (bool);
368static void timer_start_idle (void); 368static void timer_start_idle (void);
369static void timer_stop_idle (void); 369static void timer_stop_idle (void);
370static void timer_resume_idle (void); 370static void timer_resume_idle (void);
@@ -1131,13 +1131,12 @@ This also exits all active minibuffers. */
1131 Fthrow (Qtop_level, Qnil); 1131 Fthrow (Qtop_level, Qnil);
1132} 1132}
1133 1133
1134static _Noreturn void 1134static AVOID
1135user_error (const char *msg) 1135user_error (const char *msg)
1136{ 1136{
1137 xsignal1 (Quser_error, build_string (msg)); 1137 xsignal1 (Quser_error, build_string (msg));
1138} 1138}
1139 1139
1140/* _Noreturn will be added to prototype by make-docfile. */
1141DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "", 1140DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
1142 doc: /* Exit from the innermost recursive edit or minibuffer. */ 1141 doc: /* Exit from the innermost recursive edit or minibuffer. */
1143 attributes: noreturn) 1142 attributes: noreturn)
@@ -1149,7 +1148,6 @@ DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0,
1149 user_error ("No recursive edit is in progress"); 1148 user_error ("No recursive edit is in progress");
1150} 1149}
1151 1150
1152/* _Noreturn will be added to prototype by make-docfile. */
1153DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "", 1151DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
1154 doc: /* Abort the command that requested this recursive edit or minibuffer input. */ 1152 doc: /* Abort the command that requested this recursive edit or minibuffer input. */
1155 attributes: noreturn) 1153 attributes: noreturn)
diff --git a/src/lisp.h b/src/lisp.h
index 2915944ffec..25d0a3d6ac1 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -166,6 +166,9 @@ typedef EMACS_UINT uprintmax_t;
166# define pD "t" 166# define pD "t"
167#endif 167#endif
168 168
169/* Convenience macro for rarely-used functions that do not return. */
170#define AVOID _Noreturn ATTRIBUTE_COLD void
171
169/* Extra internal type checking? */ 172/* Extra internal type checking? */
170 173
171/* Define Emacs versions of <assert.h>'s 'assert (COND)' and <verify.h>'s 174/* Define Emacs versions of <assert.h>'s 'assert (COND)' and <verify.h>'s
@@ -196,7 +199,7 @@ typedef EMACS_UINT uprintmax_t;
196# define eassume(cond) assume (cond) 199# define eassume(cond) assume (cond)
197#else /* ENABLE_CHECKING */ 200#else /* ENABLE_CHECKING */
198 201
199extern _Noreturn void die (const char *, const char *, int); 202extern AVOID die (const char *, const char *, int);
200 203
201extern bool suppress_checking EXTERNALLY_VISIBLE; 204extern bool suppress_checking EXTERNALLY_VISIBLE;
202 205
@@ -621,7 +624,7 @@ extern Lisp_Object char_table_ref (Lisp_Object, int);
621extern void char_table_set (Lisp_Object, int, Lisp_Object); 624extern void char_table_set (Lisp_Object, int, Lisp_Object);
622 625
623/* Defined in data.c. */ 626/* Defined in data.c. */
624extern _Noreturn void wrong_type_argument (Lisp_Object, Lisp_Object); 627extern AVOID wrong_type_argument (Lisp_Object, Lisp_Object);
625 628
626 629
627/* Defined in emacs.c. */ 630/* Defined in emacs.c. */
@@ -3528,7 +3531,7 @@ modiff_to_integer (modiff_count a)
3528} 3531}
3529 3532
3530/* Defined in data.c. */ 3533/* Defined in data.c. */
3531extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object); 3534extern AVOID wrong_choice (Lisp_Object, Lisp_Object);
3532extern void notify_variable_watchers (Lisp_Object, Lisp_Object, 3535extern void notify_variable_watchers (Lisp_Object, Lisp_Object,
3533 Lisp_Object, Lisp_Object); 3536 Lisp_Object, Lisp_Object);
3534extern Lisp_Object indirect_function (Lisp_Object); 3537extern Lisp_Object indirect_function (Lisp_Object);
@@ -3555,10 +3558,9 @@ extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
3555extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t); 3558extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
3556 3559
3557extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *); 3560extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
3558extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object); 3561extern AVOID args_out_of_range (Lisp_Object, Lisp_Object);
3559extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object, 3562extern AVOID args_out_of_range_3 (Lisp_Object, Lisp_Object, Lisp_Object);
3560 Lisp_Object); 3563extern AVOID circular_list (Lisp_Object);
3561extern _Noreturn void circular_list (Lisp_Object);
3562extern Lisp_Object do_symval_forwarding (lispfwd); 3564extern Lisp_Object do_symval_forwarding (lispfwd);
3563enum Set_Internal_Bind { 3565enum Set_Internal_Bind {
3564 SET_INTERNAL_SET, 3566 SET_INTERNAL_SET,
@@ -3666,7 +3668,7 @@ extern void syms_of_json (void);
3666 3668
3667/* Defined in insdel.c. */ 3669/* Defined in insdel.c. */
3668extern void move_gap_both (ptrdiff_t, ptrdiff_t); 3670extern void move_gap_both (ptrdiff_t, ptrdiff_t);
3669extern _Noreturn void buffer_overflow (void); 3671extern AVOID buffer_overflow (void);
3670extern void make_gap (ptrdiff_t); 3672extern void make_gap (ptrdiff_t);
3671extern void make_gap_1 (struct buffer *, ptrdiff_t); 3673extern void make_gap_1 (struct buffer *, ptrdiff_t);
3672extern ptrdiff_t copy_text (const unsigned char *, unsigned char *, 3674extern ptrdiff_t copy_text (const unsigned char *, unsigned char *,
@@ -3766,8 +3768,8 @@ extern void *my_heap_start (void);
3766extern void check_pure_size (void); 3768extern void check_pure_size (void);
3767extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT); 3769extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
3768extern void malloc_warning (const char *); 3770extern void malloc_warning (const char *);
3769extern _Noreturn void memory_full (size_t); 3771extern AVOID memory_full (size_t);
3770extern _Noreturn void buffer_memory_full (ptrdiff_t); 3772extern AVOID buffer_memory_full (ptrdiff_t);
3771extern bool survives_gc_p (Lisp_Object); 3773extern bool survives_gc_p (Lisp_Object);
3772extern void mark_object (Lisp_Object); 3774extern void mark_object (Lisp_Object);
3773#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC 3775#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
@@ -3848,7 +3850,7 @@ list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h)
3848 3850
3849extern Lisp_Object make_uninit_bool_vector (EMACS_INT); 3851extern Lisp_Object make_uninit_bool_vector (EMACS_INT);
3850extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object); 3852extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object);
3851extern _Noreturn void string_overflow (void); 3853extern AVOID string_overflow (void);
3852extern Lisp_Object make_string (const char *, ptrdiff_t); 3854extern Lisp_Object make_string (const char *, ptrdiff_t);
3853extern Lisp_Object make_formatted_string (char *, const char *, ...) 3855extern Lisp_Object make_formatted_string (char *, const char *, ...)
3854 ATTRIBUTE_FORMAT_PRINTF (2, 3); 3856 ATTRIBUTE_FORMAT_PRINTF (2, 3);
@@ -4095,18 +4097,17 @@ extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
4095 Lisp_Object (*funcall) 4097 Lisp_Object (*funcall)
4096 (ptrdiff_t nargs, Lisp_Object *args)); 4098 (ptrdiff_t nargs, Lisp_Object *args));
4097extern Lisp_Object quit (void); 4099extern Lisp_Object quit (void);
4098INLINE _Noreturn void 4100INLINE AVOID
4099xsignal (Lisp_Object error_symbol, Lisp_Object data) 4101xsignal (Lisp_Object error_symbol, Lisp_Object data)
4100{ 4102{
4101 Fsignal (error_symbol, data); 4103 Fsignal (error_symbol, data);
4102} 4104}
4103extern _Noreturn void xsignal0 (Lisp_Object); 4105extern AVOID xsignal0 (Lisp_Object);
4104extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object); 4106extern AVOID xsignal1 (Lisp_Object, Lisp_Object);
4105extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object); 4107extern AVOID xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object);
4106extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object, 4108extern AVOID xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
4107 Lisp_Object); 4109extern AVOID signal_error (const char *, Lisp_Object);
4108extern _Noreturn void signal_error (const char *, Lisp_Object); 4110extern AVOID overflow_error (void);
4109extern _Noreturn void overflow_error (void);
4110extern bool FUNCTIONP (Lisp_Object); 4111extern bool FUNCTIONP (Lisp_Object);
4111extern Lisp_Object funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *arg_vector); 4112extern Lisp_Object funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *arg_vector);
4112extern Lisp_Object eval_sub (Lisp_Object form); 4113extern Lisp_Object eval_sub (Lisp_Object form);
@@ -4145,8 +4146,8 @@ extern void set_unwind_protect_ptr (ptrdiff_t, void (*) (void *), void *);
4145extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object); 4146extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object);
4146extern void rebind_for_thread_switch (void); 4147extern void rebind_for_thread_switch (void);
4147extern void unbind_for_thread_switch (struct thread_state *); 4148extern void unbind_for_thread_switch (struct thread_state *);
4148extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2); 4149extern AVOID error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
4149extern _Noreturn void verror (const char *, va_list) 4150extern AVOID verror (const char *, va_list)
4150 ATTRIBUTE_FORMAT_PRINTF (1, 0); 4151 ATTRIBUTE_FORMAT_PRINTF (1, 0);
4151extern Lisp_Object vformat_string (const char *, va_list) 4152extern Lisp_Object vformat_string (const char *, va_list)
4152 ATTRIBUTE_FORMAT_PRINTF (1, 0); 4153 ATTRIBUTE_FORMAT_PRINTF (1, 0);
@@ -4243,7 +4244,7 @@ extern void syms_of_editfns (void);
4243/* Defined in buffer.c. */ 4244/* Defined in buffer.c. */
4244extern bool mouse_face_overlay_overlaps (Lisp_Object); 4245extern bool mouse_face_overlay_overlaps (Lisp_Object);
4245extern Lisp_Object disable_line_numbers_overlay_at_eob (void); 4246extern Lisp_Object disable_line_numbers_overlay_at_eob (void);
4246extern _Noreturn void nsberror (Lisp_Object); 4247extern AVOID nsberror (Lisp_Object);
4247extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t); 4248extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t);
4248extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t); 4249extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t);
4249extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t); 4250extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t);
@@ -4286,9 +4287,9 @@ extern void close_file_unwind (int);
4286extern void fclose_unwind (void *); 4287extern void fclose_unwind (void *);
4287extern void restore_point_unwind (Lisp_Object); 4288extern void restore_point_unwind (Lisp_Object);
4288extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int); 4289extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int);
4289extern _Noreturn void report_file_errno (const char *, Lisp_Object, int); 4290extern AVOID report_file_errno (const char *, Lisp_Object, int);
4290extern _Noreturn void report_file_error (const char *, Lisp_Object); 4291extern AVOID report_file_error (const char *, Lisp_Object);
4291extern _Noreturn void report_file_notify_error (const char *, Lisp_Object); 4292extern AVOID report_file_notify_error (const char *, Lisp_Object);
4292extern bool internal_delete_file (Lisp_Object); 4293extern bool internal_delete_file (Lisp_Object);
4293extern Lisp_Object emacs_readlinkat (int, const char *); 4294extern Lisp_Object emacs_readlinkat (int, const char *);
4294extern bool file_directory_p (Lisp_Object); 4295extern bool file_directory_p (Lisp_Object);
@@ -4409,7 +4410,7 @@ extern bool display_arg;
4409#endif 4410#endif
4410extern Lisp_Object decode_env_path (const char *, const char *, bool); 4411extern Lisp_Object decode_env_path (const char *, const char *, bool);
4411extern Lisp_Object empty_unibyte_string, empty_multibyte_string; 4412extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
4412extern _Noreturn void terminate_due_to_signal (int, int); 4413extern AVOID terminate_due_to_signal (int, int);
4413#ifdef WINDOWSNT 4414#ifdef WINDOWSNT
4414extern Lisp_Object Vlibrary_cache; 4415extern Lisp_Object Vlibrary_cache;
4415#endif 4416#endif
@@ -4574,7 +4575,7 @@ extern EMACS_INT get_random (void);
4574extern void seed_random (void *, ptrdiff_t); 4575extern void seed_random (void *, ptrdiff_t);
4575extern void init_random (void); 4576extern void init_random (void);
4576extern void emacs_backtrace (int); 4577extern void emacs_backtrace (int);
4577extern _Noreturn void emacs_abort (void) NO_INLINE; 4578extern AVOID emacs_abort (void) NO_INLINE;
4578extern int emacs_open (const char *, int, int); 4579extern int emacs_open (const char *, int, int);
4579extern int emacs_pipe (int[2]); 4580extern int emacs_pipe (int[2]);
4580extern int emacs_close (int); 4581extern int emacs_close (int);
@@ -4615,8 +4616,7 @@ extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
4615/* Defined in term.c. */ 4616/* Defined in term.c. */
4616extern int *char_ins_del_vector; 4617extern int *char_ins_del_vector;
4617extern void syms_of_term (void); 4618extern void syms_of_term (void);
4618extern _Noreturn void fatal (const char *msgid, ...) 4619extern AVOID fatal (const char *msgid, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
4619 ATTRIBUTE_FORMAT_PRINTF (1, 2);
4620 4620
4621/* Defined in terminal.c. */ 4621/* Defined in terminal.c. */
4622extern void syms_of_terminal (void); 4622extern void syms_of_terminal (void);
diff --git a/src/lread.c b/src/lread.c
index 5f33fcd6957..8cb4b63cc3a 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -1019,7 +1019,7 @@ load_error_handler (Lisp_Object data)
1019 return Qnil; 1019 return Qnil;
1020} 1020}
1021 1021
1022static _Noreturn void 1022static AVOID
1023load_error_old_style_backquotes (void) 1023load_error_old_style_backquotes (void)
1024{ 1024{
1025 if (NILP (Vload_file_name)) 1025 if (NILP (Vload_file_name))
@@ -1874,7 +1874,7 @@ readevalloop_1 (int old)
1874/* Signal an `end-of-file' error, if possible with file name 1874/* Signal an `end-of-file' error, if possible with file name
1875 information. */ 1875 information. */
1876 1876
1877static _Noreturn void 1877static AVOID
1878end_of_file_error (void) 1878end_of_file_error (void)
1879{ 1879{
1880 if (STRINGP (Vload_file_name)) 1880 if (STRINGP (Vload_file_name))
@@ -2297,7 +2297,7 @@ read_internal_start (Lisp_Object stream, Lisp_Object start, Lisp_Object end)
2297/* Signal Qinvalid_read_syntax error. 2297/* Signal Qinvalid_read_syntax error.
2298 S is error string of length N (if > 0) */ 2298 S is error string of length N (if > 0) */
2299 2299
2300static _Noreturn void 2300static AVOID
2301invalid_syntax (const char *s) 2301invalid_syntax (const char *s)
2302{ 2302{
2303 xsignal1 (Qinvalid_read_syntax, build_string (s)); 2303 xsignal1 (Qinvalid_read_syntax, build_string (s));
diff --git a/src/pdumper.c b/src/pdumper.c
index 600c5b3ca3d..2cc9af7f56c 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -680,8 +680,7 @@ static void dump_remember_cold_op (struct dump_context *ctx,
680 enum cold_op op, 680 enum cold_op op,
681 Lisp_Object arg); 681 Lisp_Object arg);
682 682
683_Noreturn 683static AVOID
684static void
685error_unsupported_dump_object (struct dump_context *ctx, 684error_unsupported_dump_object (struct dump_context *ctx,
686 Lisp_Object object, 685 Lisp_Object object,
687 const char *msg) 686 const char *msg)
diff --git a/src/puresize.h b/src/puresize.h
index f120a4b3307..f5fad8b42b6 100644
--- a/src/puresize.h
+++ b/src/puresize.h
@@ -77,7 +77,7 @@ INLINE_HEADER_BEGIN
77#define PURESIZE (BASE_PURESIZE * PURESIZE_RATIO * PURESIZE_CHECKING_RATIO) 77#define PURESIZE (BASE_PURESIZE * PURESIZE_RATIO * PURESIZE_CHECKING_RATIO)
78#endif 78#endif
79 79
80extern _Noreturn void pure_write_error (Lisp_Object); 80extern AVOID pure_write_error (Lisp_Object);
81 81
82extern EMACS_INT pure[]; 82extern EMACS_INT pure[];
83 83
diff --git a/src/search.c b/src/search.c
index a450e920b03..7a6e680685a 100644
--- a/src/search.c
+++ b/src/search.c
@@ -73,7 +73,7 @@ static EMACS_INT search_buffer (Lisp_Object, ptrdiff_t, ptrdiff_t,
73 73
74Lisp_Object re_match_object; 74Lisp_Object re_match_object;
75 75
76static _Noreturn void 76static AVOID
77matcher_overflow (void) 77matcher_overflow (void)
78{ 78{
79 error ("Stack overflow in regexp matcher"); 79 error ("Stack overflow in regexp matcher");
diff --git a/src/sound.c b/src/sound.c
index 2b8715010e7..4ba826e82c4 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -297,7 +297,7 @@ static int do_play_sound (const char *, unsigned long);
297#ifndef WINDOWSNT 297#ifndef WINDOWSNT
298/* Like perror, but signals an error. */ 298/* Like perror, but signals an error. */
299 299
300static _Noreturn void 300static AVOID
301sound_perror (const char *msg) 301sound_perror (const char *msg)
302{ 302{
303 int saved_errno = errno; 303 int saved_errno = errno;
@@ -874,7 +874,7 @@ vox_write (struct sound_device *sd, const char *buffer, ptrdiff_t nbytes)
874#define DEFAULT_ALSA_SOUND_DEVICE "default" 874#define DEFAULT_ALSA_SOUND_DEVICE "default"
875#endif 875#endif
876 876
877static _Noreturn void 877static AVOID
878alsa_sound_perror (const char *msg, int err) 878alsa_sound_perror (const char *msg, int err)
879{ 879{
880 error ("%s: %s", msg, snd_strerror (err)); 880 error ("%s: %s", msg, snd_strerror (err));
diff --git a/src/sysdep.c b/src/sysdep.c
index 57ea8220cac..bc88e70dcb4 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1805,7 +1805,7 @@ deliver_fatal_thread_signal (int sig)
1805 deliver_thread_signal (sig, handle_fatal_signal); 1805 deliver_thread_signal (sig, handle_fatal_signal);
1806} 1806}
1807 1807
1808static _Noreturn void 1808static AVOID
1809handle_arith_signal (int sig) 1809handle_arith_signal (int sig)
1810{ 1810{
1811 pthread_sigmask (SIG_SETMASK, &empty_mask, 0); 1811 pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
diff --git a/src/systime.h b/src/systime.h
index 9080cd2bba1..89af0c5e3df 100644
--- a/src/systime.h
+++ b/src/systime.h
@@ -92,7 +92,7 @@ extern Lisp_Object make_lisp_time (struct timespec);
92extern bool list4_to_timespec (Lisp_Object, Lisp_Object, Lisp_Object, 92extern bool list4_to_timespec (Lisp_Object, Lisp_Object, Lisp_Object,
93 Lisp_Object, struct timespec *); 93 Lisp_Object, struct timespec *);
94extern struct timespec lisp_time_argument (Lisp_Object); 94extern struct timespec lisp_time_argument (Lisp_Object);
95extern _Noreturn void time_overflow (void); 95extern AVOID time_overflow (void);
96extern void init_timefns (void); 96extern void init_timefns (void);
97extern void syms_of_timefns (void); 97extern void syms_of_timefns (void);
98 98
diff --git a/src/term.c b/src/term.c
index a492276c888..2de0a0e6649 100644
--- a/src/term.c
+++ b/src/term.c
@@ -73,11 +73,10 @@ static void clear_tty_hooks (struct terminal *terminal);
73static void set_tty_hooks (struct terminal *terminal); 73static void set_tty_hooks (struct terminal *terminal);
74static void dissociate_if_controlling_tty (int fd); 74static void dissociate_if_controlling_tty (int fd);
75static void delete_tty (struct terminal *); 75static void delete_tty (struct terminal *);
76static _Noreturn void maybe_fatal (bool, struct terminal *, 76static AVOID maybe_fatal (bool, struct terminal *, const char *, const char *,
77 const char *, const char *, ...) 77 ...)
78 ATTRIBUTE_FORMAT_PRINTF (3, 5) ATTRIBUTE_FORMAT_PRINTF (4, 5); 78 ATTRIBUTE_FORMAT_PRINTF (3, 5) ATTRIBUTE_FORMAT_PRINTF (4, 5);
79static _Noreturn void vfatal (const char *str, va_list ap) 79static AVOID vfatal (const char *, va_list) ATTRIBUTE_FORMAT_PRINTF (1, 0);
80 ATTRIBUTE_FORMAT_PRINTF (1, 0);
81 80
82 81
83#define OUTPUT(tty, a) \ 82#define OUTPUT(tty, a) \
diff --git a/src/textprop.c b/src/textprop.c
index bb063d3eaaa..ae42c44185f 100644
--- a/src/textprop.c
+++ b/src/textprop.c
@@ -65,7 +65,7 @@ static Lisp_Object interval_insert_in_front_hooks;
65/* Signal a `text-read-only' error. This function makes it easier 65/* Signal a `text-read-only' error. This function makes it easier
66 to capture that error in GDB by putting a breakpoint on it. */ 66 to capture that error in GDB by putting a breakpoint on it. */
67 67
68static _Noreturn void 68static AVOID
69text_read_only (Lisp_Object propval) 69text_read_only (Lisp_Object propval)
70{ 70{
71 if (STRINGP (propval)) 71 if (STRINGP (propval))
diff --git a/src/timefns.c b/src/timefns.c
index 514fa24f8b9..cb953d1b4ce 100644
--- a/src/timefns.c
+++ b/src/timefns.c
@@ -172,7 +172,7 @@ emacs_localtime_rz (timezone_t tz, time_t const *t, struct tm *tm)
172 return tm; 172 return tm;
173} 173}
174 174
175static _Noreturn void 175static AVOID
176invalid_time_zone_specification (Lisp_Object zone) 176invalid_time_zone_specification (Lisp_Object zone)
177{ 177{
178 xsignal2 (Qerror, build_string ("Invalid time zone specification"), zone); 178 xsignal2 (Qerror, build_string ("Invalid time zone specification"), zone);
@@ -337,7 +337,7 @@ time_overflow (void)
337 error ("Specified time is not representable"); 337 error ("Specified time is not representable");
338} 338}
339 339
340static _Noreturn void 340static AVOID
341time_error (int err) 341time_error (int err)
342{ 342{
343 switch (err) 343 switch (err)
@@ -348,7 +348,7 @@ time_error (int err)
348 } 348 }
349} 349}
350 350
351static _Noreturn void 351static AVOID
352invalid_hz (Lisp_Object hz) 352invalid_hz (Lisp_Object hz)
353{ 353{
354 xsignal2 (Qerror, build_string ("Invalid time frequency"), hz); 354 xsignal2 (Qerror, build_string ("Invalid time frequency"), hz);
diff --git a/src/xterm.c b/src/xterm.c
index 0facb524549..0b83263a0e6 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1505,37 +1505,8 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring
1505 Glyph display 1505 Glyph display
1506 ***********************************************************************/ 1506 ***********************************************************************/
1507 1507
1508
1509
1510static void x_set_glyph_string_clipping (struct glyph_string *);
1511static void x_set_glyph_string_gc (struct glyph_string *);
1512static void x_draw_glyph_string_foreground (struct glyph_string *);
1513static void x_draw_composite_glyph_string_foreground (struct glyph_string *);
1514static void x_draw_glyph_string_box (struct glyph_string *);
1515static void x_draw_glyph_string (struct glyph_string *);
1516static _Noreturn void x_delete_glyphs (struct frame *, int);
1517static void x_compute_glyph_string_overhangs (struct glyph_string *);
1518static void x_set_cursor_gc (struct glyph_string *);
1519static void x_set_mode_line_face_gc (struct glyph_string *);
1520static void x_set_mouse_face_gc (struct glyph_string *);
1521static bool x_alloc_lighter_color (struct frame *, Display *, Colormap, 1508static bool x_alloc_lighter_color (struct frame *, Display *, Colormap,
1522 unsigned long *, double, int); 1509 unsigned long *, double, int);
1523static void x_setup_relief_color (struct frame *, struct relief *,
1524 double, int, unsigned long);
1525static void x_setup_relief_colors (struct glyph_string *);
1526static void x_draw_image_glyph_string (struct glyph_string *);
1527static void x_draw_image_relief (struct glyph_string *);
1528static void x_draw_image_foreground (struct glyph_string *);
1529#ifndef USE_CAIRO
1530static void x_draw_image_foreground_1 (struct glyph_string *, Pixmap);
1531#endif
1532static void x_clear_glyph_string_rect (struct glyph_string *, int,
1533 int, int, int);
1534static void x_draw_relief_rect (struct frame *, int, int, int, int,
1535 int, bool, bool, bool, bool, bool,
1536 XRectangle *);
1537static void x_draw_box_rect (struct glyph_string *, int, int, int, int,
1538 int, bool, bool, XRectangle *);
1539static void x_scroll_bar_clear (struct frame *); 1510static void x_scroll_bar_clear (struct frame *);
1540 1511
1541#ifdef GLYPH_DEBUG 1512#ifdef GLYPH_DEBUG
@@ -3975,7 +3946,7 @@ x_shift_glyphs_for_insert (struct frame *f, int x, int y, int width, int height,
3975 for X frames. */ 3946 for X frames. */
3976 3947
3977static void 3948static void
3978x_delete_glyphs (struct frame *f, register int n) 3949x_delete_glyphs (struct frame *f, int n)
3979{ 3950{
3980 emacs_abort (); 3951 emacs_abort ();
3981} 3952}
@@ -9842,7 +9813,7 @@ static char *error_msg;
9842/* Handle the loss of connection to display DPY. ERROR_MESSAGE is 9813/* Handle the loss of connection to display DPY. ERROR_MESSAGE is
9843 the text of an error message that lead to the connection loss. */ 9814 the text of an error message that lead to the connection loss. */
9844 9815
9845static _Noreturn void 9816static AVOID
9846x_connection_closed (Display *dpy, const char *error_message, bool ioerror) 9817x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
9847{ 9818{
9848 struct x_display_info *dpyinfo = x_display_info_for_display (dpy); 9819 struct x_display_info *dpyinfo = x_display_info_for_display (dpy);
@@ -10005,7 +9976,7 @@ x_error_quitter (Display *display, XErrorEvent *event)
10005 It kills all frames on the display that we lost touch with. 9976 It kills all frames on the display that we lost touch with.
10006 If that was the only one, it prints an error message and kills Emacs. */ 9977 If that was the only one, it prints an error message and kills Emacs. */
10007 9978
10008static _Noreturn int 9979static _Noreturn ATTRIBUTE_COLD int
10009x_io_error_quitter (Display *display) 9980x_io_error_quitter (Display *display)
10010{ 9981{
10011 char buf[256]; 9982 char buf[256];