diff options
| author | Paul Eggert | 2019-04-18 00:30:24 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-04-18 00:35:18 -0700 |
| commit | 6d6c55db2cdfb6b354873f17285a3f602e011817 (patch) | |
| tree | fc9647797be220e613962260700c05e5f37100c1 /src/lisp.h | |
| parent | dded2c4cf30fbdb5e90c44bc76a26970d00e0f22 (diff) | |
| download | emacs-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/lisp.h')
| -rw-r--r-- | src/lisp.h | 58 |
1 files changed, 29 insertions, 29 deletions
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 | ||
| 199 | extern _Noreturn void die (const char *, const char *, int); | 202 | extern AVOID die (const char *, const char *, int); |
| 200 | 203 | ||
| 201 | extern bool suppress_checking EXTERNALLY_VISIBLE; | 204 | extern bool suppress_checking EXTERNALLY_VISIBLE; |
| 202 | 205 | ||
| @@ -621,7 +624,7 @@ extern Lisp_Object char_table_ref (Lisp_Object, int); | |||
| 621 | extern void char_table_set (Lisp_Object, int, Lisp_Object); | 624 | extern void char_table_set (Lisp_Object, int, Lisp_Object); |
| 622 | 625 | ||
| 623 | /* Defined in data.c. */ | 626 | /* Defined in data.c. */ |
| 624 | extern _Noreturn void wrong_type_argument (Lisp_Object, Lisp_Object); | 627 | extern 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. */ |
| 3531 | extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object); | 3534 | extern AVOID wrong_choice (Lisp_Object, Lisp_Object); |
| 3532 | extern void notify_variable_watchers (Lisp_Object, Lisp_Object, | 3535 | extern void notify_variable_watchers (Lisp_Object, Lisp_Object, |
| 3533 | Lisp_Object, Lisp_Object); | 3536 | Lisp_Object, Lisp_Object); |
| 3534 | extern Lisp_Object indirect_function (Lisp_Object); | 3537 | extern Lisp_Object indirect_function (Lisp_Object); |
| @@ -3555,10 +3558,9 @@ extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t); | |||
| 3555 | extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t); | 3558 | extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t); |
| 3556 | 3559 | ||
| 3557 | extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *); | 3560 | extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *); |
| 3558 | extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object); | 3561 | extern AVOID args_out_of_range (Lisp_Object, Lisp_Object); |
| 3559 | extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object, | 3562 | extern AVOID args_out_of_range_3 (Lisp_Object, Lisp_Object, Lisp_Object); |
| 3560 | Lisp_Object); | 3563 | extern AVOID circular_list (Lisp_Object); |
| 3561 | extern _Noreturn void circular_list (Lisp_Object); | ||
| 3562 | extern Lisp_Object do_symval_forwarding (lispfwd); | 3564 | extern Lisp_Object do_symval_forwarding (lispfwd); |
| 3563 | enum Set_Internal_Bind { | 3565 | enum 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. */ |
| 3668 | extern void move_gap_both (ptrdiff_t, ptrdiff_t); | 3670 | extern void move_gap_both (ptrdiff_t, ptrdiff_t); |
| 3669 | extern _Noreturn void buffer_overflow (void); | 3671 | extern AVOID buffer_overflow (void); |
| 3670 | extern void make_gap (ptrdiff_t); | 3672 | extern void make_gap (ptrdiff_t); |
| 3671 | extern void make_gap_1 (struct buffer *, ptrdiff_t); | 3673 | extern void make_gap_1 (struct buffer *, ptrdiff_t); |
| 3672 | extern ptrdiff_t copy_text (const unsigned char *, unsigned char *, | 3674 | extern ptrdiff_t copy_text (const unsigned char *, unsigned char *, |
| @@ -3766,8 +3768,8 @@ extern void *my_heap_start (void); | |||
| 3766 | extern void check_pure_size (void); | 3768 | extern void check_pure_size (void); |
| 3767 | extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT); | 3769 | extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT); |
| 3768 | extern void malloc_warning (const char *); | 3770 | extern void malloc_warning (const char *); |
| 3769 | extern _Noreturn void memory_full (size_t); | 3771 | extern AVOID memory_full (size_t); |
| 3770 | extern _Noreturn void buffer_memory_full (ptrdiff_t); | 3772 | extern AVOID buffer_memory_full (ptrdiff_t); |
| 3771 | extern bool survives_gc_p (Lisp_Object); | 3773 | extern bool survives_gc_p (Lisp_Object); |
| 3772 | extern void mark_object (Lisp_Object); | 3774 | extern 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 | ||
| 3849 | extern Lisp_Object make_uninit_bool_vector (EMACS_INT); | 3851 | extern Lisp_Object make_uninit_bool_vector (EMACS_INT); |
| 3850 | extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object); | 3852 | extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object); |
| 3851 | extern _Noreturn void string_overflow (void); | 3853 | extern AVOID string_overflow (void); |
| 3852 | extern Lisp_Object make_string (const char *, ptrdiff_t); | 3854 | extern Lisp_Object make_string (const char *, ptrdiff_t); |
| 3853 | extern Lisp_Object make_formatted_string (char *, const char *, ...) | 3855 | extern 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)); |
| 4097 | extern Lisp_Object quit (void); | 4099 | extern Lisp_Object quit (void); |
| 4098 | INLINE _Noreturn void | 4100 | INLINE AVOID |
| 4099 | xsignal (Lisp_Object error_symbol, Lisp_Object data) | 4101 | xsignal (Lisp_Object error_symbol, Lisp_Object data) |
| 4100 | { | 4102 | { |
| 4101 | Fsignal (error_symbol, data); | 4103 | Fsignal (error_symbol, data); |
| 4102 | } | 4104 | } |
| 4103 | extern _Noreturn void xsignal0 (Lisp_Object); | 4105 | extern AVOID xsignal0 (Lisp_Object); |
| 4104 | extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object); | 4106 | extern AVOID xsignal1 (Lisp_Object, Lisp_Object); |
| 4105 | extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object); | 4107 | extern AVOID xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object); |
| 4106 | extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object, | 4108 | extern AVOID xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object); |
| 4107 | Lisp_Object); | 4109 | extern AVOID signal_error (const char *, Lisp_Object); |
| 4108 | extern _Noreturn void signal_error (const char *, Lisp_Object); | 4110 | extern AVOID overflow_error (void); |
| 4109 | extern _Noreturn void overflow_error (void); | ||
| 4110 | extern bool FUNCTIONP (Lisp_Object); | 4111 | extern bool FUNCTIONP (Lisp_Object); |
| 4111 | extern Lisp_Object funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *arg_vector); | 4112 | extern Lisp_Object funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *arg_vector); |
| 4112 | extern Lisp_Object eval_sub (Lisp_Object form); | 4113 | extern Lisp_Object eval_sub (Lisp_Object form); |
| @@ -4145,8 +4146,8 @@ extern void set_unwind_protect_ptr (ptrdiff_t, void (*) (void *), void *); | |||
| 4145 | extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object); | 4146 | extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object); |
| 4146 | extern void rebind_for_thread_switch (void); | 4147 | extern void rebind_for_thread_switch (void); |
| 4147 | extern void unbind_for_thread_switch (struct thread_state *); | 4148 | extern void unbind_for_thread_switch (struct thread_state *); |
| 4148 | extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2); | 4149 | extern AVOID error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2); |
| 4149 | extern _Noreturn void verror (const char *, va_list) | 4150 | extern AVOID verror (const char *, va_list) |
| 4150 | ATTRIBUTE_FORMAT_PRINTF (1, 0); | 4151 | ATTRIBUTE_FORMAT_PRINTF (1, 0); |
| 4151 | extern Lisp_Object vformat_string (const char *, va_list) | 4152 | extern 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. */ |
| 4244 | extern bool mouse_face_overlay_overlaps (Lisp_Object); | 4245 | extern bool mouse_face_overlay_overlaps (Lisp_Object); |
| 4245 | extern Lisp_Object disable_line_numbers_overlay_at_eob (void); | 4246 | extern Lisp_Object disable_line_numbers_overlay_at_eob (void); |
| 4246 | extern _Noreturn void nsberror (Lisp_Object); | 4247 | extern AVOID nsberror (Lisp_Object); |
| 4247 | extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t); | 4248 | extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t); |
| 4248 | extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t); | 4249 | extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t); |
| 4249 | extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t); | 4250 | extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t); |
| @@ -4286,9 +4287,9 @@ extern void close_file_unwind (int); | |||
| 4286 | extern void fclose_unwind (void *); | 4287 | extern void fclose_unwind (void *); |
| 4287 | extern void restore_point_unwind (Lisp_Object); | 4288 | extern void restore_point_unwind (Lisp_Object); |
| 4288 | extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int); | 4289 | extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int); |
| 4289 | extern _Noreturn void report_file_errno (const char *, Lisp_Object, int); | 4290 | extern AVOID report_file_errno (const char *, Lisp_Object, int); |
| 4290 | extern _Noreturn void report_file_error (const char *, Lisp_Object); | 4291 | extern AVOID report_file_error (const char *, Lisp_Object); |
| 4291 | extern _Noreturn void report_file_notify_error (const char *, Lisp_Object); | 4292 | extern AVOID report_file_notify_error (const char *, Lisp_Object); |
| 4292 | extern bool internal_delete_file (Lisp_Object); | 4293 | extern bool internal_delete_file (Lisp_Object); |
| 4293 | extern Lisp_Object emacs_readlinkat (int, const char *); | 4294 | extern Lisp_Object emacs_readlinkat (int, const char *); |
| 4294 | extern bool file_directory_p (Lisp_Object); | 4295 | extern bool file_directory_p (Lisp_Object); |
| @@ -4409,7 +4410,7 @@ extern bool display_arg; | |||
| 4409 | #endif | 4410 | #endif |
| 4410 | extern Lisp_Object decode_env_path (const char *, const char *, bool); | 4411 | extern Lisp_Object decode_env_path (const char *, const char *, bool); |
| 4411 | extern Lisp_Object empty_unibyte_string, empty_multibyte_string; | 4412 | extern Lisp_Object empty_unibyte_string, empty_multibyte_string; |
| 4412 | extern _Noreturn void terminate_due_to_signal (int, int); | 4413 | extern AVOID terminate_due_to_signal (int, int); |
| 4413 | #ifdef WINDOWSNT | 4414 | #ifdef WINDOWSNT |
| 4414 | extern Lisp_Object Vlibrary_cache; | 4415 | extern Lisp_Object Vlibrary_cache; |
| 4415 | #endif | 4416 | #endif |
| @@ -4574,7 +4575,7 @@ extern EMACS_INT get_random (void); | |||
| 4574 | extern void seed_random (void *, ptrdiff_t); | 4575 | extern void seed_random (void *, ptrdiff_t); |
| 4575 | extern void init_random (void); | 4576 | extern void init_random (void); |
| 4576 | extern void emacs_backtrace (int); | 4577 | extern void emacs_backtrace (int); |
| 4577 | extern _Noreturn void emacs_abort (void) NO_INLINE; | 4578 | extern AVOID emacs_abort (void) NO_INLINE; |
| 4578 | extern int emacs_open (const char *, int, int); | 4579 | extern int emacs_open (const char *, int, int); |
| 4579 | extern int emacs_pipe (int[2]); | 4580 | extern int emacs_pipe (int[2]); |
| 4580 | extern int emacs_close (int); | 4581 | extern 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. */ |
| 4616 | extern int *char_ins_del_vector; | 4617 | extern int *char_ins_del_vector; |
| 4617 | extern void syms_of_term (void); | 4618 | extern void syms_of_term (void); |
| 4618 | extern _Noreturn void fatal (const char *msgid, ...) | 4619 | extern 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. */ |
| 4622 | extern void syms_of_terminal (void); | 4622 | extern void syms_of_terminal (void); |