aboutsummaryrefslogtreecommitdiffstats
path: root/src/lisp.h
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/lisp.h
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/lisp.h')
-rw-r--r--src/lisp.h58
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
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);