mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-07 15:21:46 +00:00
6d6c55db2c
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.
116 lines
3.4 KiB
C
116 lines
3.4 KiB
C
/* How much read-only Lisp storage a dumped Emacs needs.
|
|
Copyright (C) 1993, 2001-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Emacs.
|
|
|
|
GNU Emacs 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 3 of the License, or (at
|
|
your option) any later version.
|
|
|
|
GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef EMACS_PURESIZE_H
|
|
#define EMACS_PURESIZE_H
|
|
|
|
#include "lisp.h"
|
|
|
|
INLINE_HEADER_BEGIN
|
|
|
|
/* Define PURESIZE, the number of bytes of pure Lisp code to leave space for.
|
|
|
|
At one point, this was defined in config.h, meaning that changing
|
|
PURESIZE would make Make recompile all of Emacs. But only a few
|
|
files actually use PURESIZE, so we split it out to its own .h file.
|
|
|
|
Make sure to include this file after config.h, since that tells us
|
|
whether we are running X windows, which tells us how much pure
|
|
storage to allocate. */
|
|
|
|
/* First define a measure of the amount of data we have. */
|
|
|
|
/* A system configuration file may set this to request a certain extra
|
|
amount of storage. This is a lot more update-robust that defining
|
|
BASE_PURESIZE or even PURESIZE directly. */
|
|
#ifndef SYSTEM_PURESIZE_EXTRA
|
|
#define SYSTEM_PURESIZE_EXTRA 0
|
|
#endif
|
|
|
|
#ifndef SITELOAD_PURESIZE_EXTRA
|
|
#define SITELOAD_PURESIZE_EXTRA 0
|
|
#endif
|
|
|
|
#ifndef BASE_PURESIZE
|
|
#define BASE_PURESIZE (2000000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
|
|
#endif
|
|
|
|
/* Increase BASE_PURESIZE by a ratio depending on the machine's word size. */
|
|
#ifndef PURESIZE_RATIO
|
|
#if EMACS_INT_MAX >> 31 != 0
|
|
#if PTRDIFF_MAX >> 31 != 0
|
|
#define PURESIZE_RATIO 10 / 6 /* Don't surround with `()'. */
|
|
#else
|
|
#define PURESIZE_RATIO 8 / 6 /* Don't surround with `()'. */
|
|
#endif
|
|
#else
|
|
#define PURESIZE_RATIO 1
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef ENABLE_CHECKING
|
|
/* ENABLE_CHECKING somehow increases the purespace used, probably because
|
|
it tends to cause some macro arguments to be evaluated twice. This is
|
|
a bug, but it's difficult to track it down. */
|
|
#define PURESIZE_CHECKING_RATIO 12 / 10 /* Don't surround with `()'. */
|
|
#else
|
|
#define PURESIZE_CHECKING_RATIO 1
|
|
#endif
|
|
|
|
/* This is the actual size in bytes to allocate. */
|
|
#ifndef PURESIZE
|
|
#define PURESIZE (BASE_PURESIZE * PURESIZE_RATIO * PURESIZE_CHECKING_RATIO)
|
|
#endif
|
|
|
|
extern AVOID pure_write_error (Lisp_Object);
|
|
|
|
extern EMACS_INT pure[];
|
|
|
|
/* The puresize_h_* macros are private to this include file. */
|
|
|
|
/* True if PTR is pure. */
|
|
|
|
#define puresize_h_PURE_P(ptr) \
|
|
((uintptr_t) (ptr) - (uintptr_t) pure <= PURESIZE)
|
|
|
|
INLINE bool
|
|
PURE_P (void *ptr)
|
|
{
|
|
return puresize_h_PURE_P (ptr);
|
|
}
|
|
|
|
/* Signal an error if OBJ is pure. PTR is OBJ untagged. */
|
|
|
|
#define puresize_h_CHECK_IMPURE(obj, ptr) \
|
|
(PURE_P (ptr) ? pure_write_error (obj) : (void) 0)
|
|
|
|
INLINE void
|
|
CHECK_IMPURE (Lisp_Object obj, void *ptr)
|
|
{
|
|
puresize_h_CHECK_IMPURE (obj, ptr);
|
|
}
|
|
|
|
#if DEFINE_KEY_OPS_AS_MACROS
|
|
# define PURE_P(ptr) puresize_h_PURE_P (ptr)
|
|
# define CHECK_IMPURE(obj, ptr) puresize_h_CHECK_IMPURE (obj, ptr)
|
|
#endif
|
|
|
|
INLINE_HEADER_END
|
|
|
|
#endif /* EMACS_PURESIZE_H */
|