mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-02 02:10:46 -08:00
* src/composite.c (autocmp_chars): * src/conf_post.h (DebPrint) [HAVE_NTGUI && !DebPrint && !EMACSDEBUG]: Use simpler ((void) 0) for no-op expression returning void. * src/dispextern.h [HAVE_WINDOW_SYSTEM]: Include fontset.h, for face_for_char. (FACE_SUITABLE_FOR_ASCII_CHAR_P, FACE_FOR_CHAR): Now inline functions instead of macros. This avoids the need for all those casts to void. (FACE_SUITABLE_FOR_ASCII_CHAR_P): Omit 2nd (unused) arg. All uses changed. * src/frame.c (Ficonify_frame, Fset_frame_position): * src/xdisp.c (Fmove_point_visually, show_mouse_face): * src/xdisp.c (note_mode_line_or_margin_highlight) (note_mouse_highlight): Assume HAVE_WINDOW_SYSTEM for simplicity, since the code should now work either way without generating warnings. * src/frame.c (display_available) [HAVE_WINDOW_SYSTEM]: New function. (window_system_available) [HAVE_WINDOW_SYSTEM]: Move to frame.h. (decode_window_system_frame): Use check_window_system instead of rolling the code ourself. Return needed only if HAVE_WINDOW_SYSTEM. (decode_window_system_frame, check_window_system): Merge the HAVE_WINDOW_SYSTEM and !HAVE_WINDOW_SYSTEM versions into one. * src/frame.c (Ficonify_frame, Fset_frame_position): * src/xdisp.c (show_mouse_face, define_frame_cursor1) (note_mouse_highlight): Narrow the scope of the HAVE_WINDOW_SYSTEM #ifdef; this is a better way to pacify GCC. * src/xdisp.c (x_set_left_fringe, x_set_right_fringe) (x_set_right_divider_width, x_set_bottom_divider_width): * src/xfns.c (x_set_internal_border_width): Don’t use what are now function calls as lvalues. * src/frame.h (WINDOW_SYSTEM_RETURN): New macro. (decode_window_system_frame, check_window_system): Use it, to avoid the need for duplicate declarations. (window_system_available): Now an inline function. (display_available): New decl. (frame_dimension): New inline function. (FRAME_FRINGE_COLS, FRAME_LEFT_FRINGE_WIDTH) (FRAME_RIGHT_FRINGE_WIDTH, FRAME_TOTAL_FRINGE_WIDTH) (FRAME_INTERNAL_BORDER_WIDTH, FRAME_RIGHT_DIVIDER_WIDTH) (FRAME_BOTTOM_DIVIDER_WIDTH): Use it, to avoid the need for duplicate definitions. Now inline functions instead of macros. * src/gnutls.c (gnutls_log_function2i): Remove. * src/gnutls.h (GNUTLS_LOG2i): Use ‘message’ directly. This avoids complaints about gnutls_log_function2i being defined and not used on older platforms that do not need to call GNUTLS_LOG2i. * src/image.c (DefaultDepthOfScreen) [0]: Remove unused macro. * src/lisp.h (AUTO_STRING_WITH_LEN): Revert change from ‘type id = expr’ to ‘type id; id = expr’, as this would suppress valid jump-misses-init diagnostics. Let’s find a better way to address the problem. * src/vm-limit.c (__MALLOC_HOOK_VOLATILE): Define only if needed. * src/xdisp.c (handle_single_display_spec): Simplify fringe_bitmap computation. (define_frame_cursor1): Do nothing unless in a window system. All callers changed and simplified. * src/xfaces.c (realize_default_face): Use a simpler way to pacify GCC when a return value is not used on some platforms.
387 lines
12 KiB
C
387 lines
12 KiB
C
/* conf_post.h --- configure.ac includes this via AH_BOTTOM
|
|
|
|
Copyright (C) 1988, 1993-1994, 1999-2002, 2004-2016 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 <http://www.gnu.org/licenses/>. */
|
|
|
|
/* Commentary:
|
|
|
|
Rather than writing this code directly in AH_BOTTOM, we include it
|
|
via this file. This is so that it does not get processed by
|
|
autoheader. Eg, any undefs here would otherwise be commented out.
|
|
*/
|
|
|
|
/* Code: */
|
|
|
|
/* Include any platform specific configuration file. */
|
|
#ifdef config_opsysfile
|
|
# include config_opsysfile
|
|
#endif
|
|
|
|
#include <stdbool.h>
|
|
|
|
/* GNUC_PREREQ (V, W, X) is true if this is GNU C version V.W.X or later.
|
|
It can be used in a preprocessor expression. */
|
|
#ifndef __GNUC_MINOR__
|
|
# define GNUC_PREREQ(v, w, x) false
|
|
#elif ! defined __GNUC_PATCHLEVEL__
|
|
# define GNUC_PREREQ(v, w, x) ((v) < __GNUC__ + ((w) <= __GNUC_MINOR__))
|
|
#else
|
|
# define GNUC_PREREQ(v, w, x) \
|
|
((v) < __GNUC__ + ((w) <= __GNUC_MINOR__ + ((x) <= __GNUC_PATCHLEVEL__)))
|
|
#endif
|
|
|
|
/* The type of bool bitfields. Needed to compile Objective-C with
|
|
standard GCC. It was also needed to port to pre-C99 compilers,
|
|
although we don't care about that any more. */
|
|
#if NS_IMPL_GNUSTEP
|
|
typedef unsigned int bool_bf;
|
|
#else
|
|
typedef bool bool_bf;
|
|
#endif
|
|
|
|
#ifndef WINDOWSNT
|
|
/* On AIX 3 this must be included before any other include file. */
|
|
#include <alloca.h>
|
|
#if ! HAVE_ALLOCA
|
|
# error "alloca not available on this machine"
|
|
#endif
|
|
#endif
|
|
|
|
/* Simulate __has_attribute on compilers that lack it. It is used only
|
|
on arguments like alloc_size that are handled in this simulation. */
|
|
#ifndef __has_attribute
|
|
# define __has_attribute(a) __has_attribute_##a
|
|
# define __has_attribute_alloc_size GNUC_PREREQ (4, 3, 0)
|
|
# define __has_attribute_cleanup GNUC_PREREQ (3, 4, 0)
|
|
# define __has_attribute_externally_visible GNUC_PREREQ (4, 1, 0)
|
|
# define __has_attribute_no_address_safety_analysis false
|
|
# define __has_attribute_no_sanitize_address GNUC_PREREQ (4, 8, 0)
|
|
#endif
|
|
|
|
/* Simulate __has_builtin on compilers that lack it. It is used only
|
|
on arguments like __builtin_assume_aligned that are handled in this
|
|
simulation. */
|
|
#ifndef __has_builtin
|
|
# define __has_builtin(a) __has_builtin_##a
|
|
# define __has_builtin___builtin_assume_aligned GNUC_PREREQ (4, 7, 0)
|
|
#endif
|
|
|
|
/* Simulate __has_feature on compilers that lack it. It is used only
|
|
to define ADDRESS_SANITIZER below. */
|
|
#ifndef __has_feature
|
|
# define __has_feature(a) false
|
|
#endif
|
|
|
|
/* True if addresses are being sanitized. */
|
|
#if defined __SANITIZE_ADDRESS__ || __has_feature (address_sanitizer)
|
|
# define ADDRESS_SANITIZER true
|
|
#else
|
|
# define ADDRESS_SANITIZER false
|
|
#endif
|
|
|
|
/* Yield PTR, which must be aligned to ALIGNMENT. */
|
|
#if ! __has_builtin (__builtin_assume_aligned)
|
|
# define __builtin_assume_aligned(ptr, ...) ((void *) (ptr))
|
|
#endif
|
|
|
|
#ifdef DARWIN_OS
|
|
#ifdef emacs
|
|
#define malloc unexec_malloc
|
|
#define realloc unexec_realloc
|
|
#define free unexec_free
|
|
#endif
|
|
/* The following solves the problem that Emacs hangs when evaluating
|
|
(make-comint "test0" "/nodir/nofile" nil "") when /nodir/nofile
|
|
does not exist. Also, setsid is not allowed in the vfork child's
|
|
context as of Darwin 9/Mac OS X 10.5. */
|
|
#undef HAVE_WORKING_VFORK
|
|
#define vfork fork
|
|
#endif /* DARWIN_OS */
|
|
|
|
/* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use
|
|
gmalloc before dumping and the system malloc after dumping.
|
|
hybrid_malloc and friends, defined in gmalloc.c, are wrappers that
|
|
accomplish this. */
|
|
#ifdef HYBRID_MALLOC
|
|
#ifdef emacs
|
|
#define malloc hybrid_malloc
|
|
#define realloc hybrid_realloc
|
|
#define aligned_alloc hybrid_aligned_alloc
|
|
#define calloc hybrid_calloc
|
|
#define free hybrid_free
|
|
#endif
|
|
#endif /* HYBRID_MALLOC */
|
|
|
|
/* We have to go this route, rather than the old hpux9 approach of
|
|
renaming the functions via macros. The system's stdlib.h has fully
|
|
prototyped declarations, which yields a conflicting definition of
|
|
srand48; it tries to redeclare what was once srandom to be srand48.
|
|
So we go with HAVE_LRAND48 being defined. */
|
|
#ifdef HPUX
|
|
#undef srandom
|
|
#undef random
|
|
#undef HAVE_RANDOM
|
|
#undef HAVE_RINT
|
|
#endif /* HPUX */
|
|
|
|
#ifdef MSDOS
|
|
#ifndef __DJGPP__
|
|
You lose; /* Emacs for DOS must be compiled with DJGPP */
|
|
#endif
|
|
#define _NAIVE_DOS_REGS
|
|
|
|
/* Start of gnulib-related stuff */
|
|
|
|
/* lib/ftoastr.c wants strtold, but DJGPP only has _strtold. DJGPP >
|
|
2.03 has it, but it also has _strtold as a stub that jumps to
|
|
strtold, so use _strtold in all versions. */
|
|
#define strtold _strtold
|
|
|
|
#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 3
|
|
# define HAVE_LSTAT 1
|
|
#else
|
|
# define lstat stat
|
|
/* DJGPP 2.03 and older don't have the next two. */
|
|
# define EOVERFLOW ERANGE
|
|
# define SIZE_MAX 4294967295U
|
|
#endif
|
|
|
|
/* We must intercept 'opendir' calls to stash away the directory name,
|
|
so we could reuse it in readlinkat; see msdos.c. */
|
|
#define opendir sys_opendir
|
|
|
|
/* End of gnulib-related stuff. */
|
|
|
|
#define emacs_raise(sig) msdos_fatal_signal (sig)
|
|
|
|
/* DATA_START is needed by vm-limit.c and unexcoff.c. */
|
|
#define DATA_START (&etext + 1)
|
|
|
|
/* Define one of these for easier conditionals. */
|
|
#ifdef HAVE_X_WINDOWS
|
|
/* We need a little extra space, see ../../lisp/loadup.el and the
|
|
commentary below, in the non-X branch. The 140KB number was
|
|
measured on GNU/Linux and on MS-Windows. */
|
|
#define SYSTEM_PURESIZE_EXTRA (-170000+140000)
|
|
#else
|
|
/* We need a little extra space, see ../../lisp/loadup.el.
|
|
As of 20091024, DOS-specific files use up 62KB of pure space. But
|
|
overall, we end up wasting 130KB of pure space, because
|
|
BASE_PURESIZE starts at 1.47MB, while we need only 1.3MB (including
|
|
non-DOS specific files and load history; the latter is about 55K,
|
|
but depends on the depth of the top-level Emacs directory in the
|
|
directory tree). Given the unknown policy of different DPMI
|
|
hosts regarding loading of untouched pages, I'm not going to risk
|
|
enlarging Emacs footprint by another 100+ KBytes. */
|
|
#define SYSTEM_PURESIZE_EXTRA (-170000+90000)
|
|
#endif
|
|
#endif /* MSDOS */
|
|
|
|
/* Mac OS X / GNUstep need a bit more pure memory. Of the existing knobs,
|
|
SYSTEM_PURESIZE_EXTRA seems like the least likely to cause problems. */
|
|
#ifdef HAVE_NS
|
|
#if defined NS_IMPL_GNUSTEP
|
|
# define SYSTEM_PURESIZE_EXTRA 30000
|
|
#elif defined DARWIN_OS
|
|
# define SYSTEM_PURESIZE_EXTRA 200000
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef CYGWIN
|
|
#define SYSTEM_PURESIZE_EXTRA 50000
|
|
#endif
|
|
|
|
#if defined HAVE_NTGUI && !defined DebPrint
|
|
# ifdef EMACSDEBUG
|
|
extern void _DebPrint (const char *fmt, ...);
|
|
# define DebPrint(stuff) _DebPrint stuff
|
|
# else
|
|
# define DebPrint(stuff) ((void) 0)
|
|
# endif
|
|
#endif
|
|
|
|
#if defined CYGWIN && defined HAVE_NTGUI
|
|
# define NTGUI_UNICODE /* Cygwin runs only on UNICODE-supporting systems */
|
|
# define _WIN32_WINNT 0x500 /* Win2k */
|
|
/* The following was in /usr/include/string.h prior to Cygwin 1.7.33. */
|
|
#ifndef strnicmp
|
|
#define strnicmp strncasecmp
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef emacs /* Don't do this for lib-src. */
|
|
/* Tell regex.c to use a type compatible with Emacs. */
|
|
#define RE_TRANSLATE_TYPE Lisp_Object
|
|
#define RE_TRANSLATE(TBL, C) char_table_translate (TBL, C)
|
|
#define RE_TRANSLATE_P(TBL) (!EQ (TBL, make_number (0)))
|
|
#endif
|
|
|
|
/* Tell time_rz.c to use Emacs's getter and setter for TZ.
|
|
Only Emacs uses time_rz so this is OK. */
|
|
#define getenv_TZ emacs_getenv_TZ
|
|
#define setenv_TZ emacs_setenv_TZ
|
|
extern char *emacs_getenv_TZ (void);
|
|
extern int emacs_setenv_TZ (char const *);
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#if __GNUC__ >= 3 /* On GCC 3.0 we might get a warning. */
|
|
#define NO_INLINE __attribute__((noinline))
|
|
#else
|
|
#define NO_INLINE
|
|
#endif
|
|
|
|
#if __has_attribute (externally_visible)
|
|
#define EXTERNALLY_VISIBLE __attribute__((externally_visible))
|
|
#else
|
|
#define EXTERNALLY_VISIBLE
|
|
#endif
|
|
|
|
#if GNUC_PREREQ (2, 7, 0)
|
|
# define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
|
#else
|
|
# define ATTRIBUTE_FORMAT(spec) /* empty */
|
|
#endif
|
|
|
|
#if GNUC_PREREQ (4, 4, 0) && defined __GLIBC_MINOR__
|
|
# define PRINTF_ARCHETYPE __gnu_printf__
|
|
#elif GNUC_PREREQ (4, 4, 0) && defined __MINGW32__
|
|
# define PRINTF_ARCHETYPE __ms_printf__
|
|
#else
|
|
# define PRINTF_ARCHETYPE __printf__
|
|
#endif
|
|
#define ATTRIBUTE_FORMAT_PRINTF(string_index, first_to_check) \
|
|
ATTRIBUTE_FORMAT ((PRINTF_ARCHETYPE, string_index, first_to_check))
|
|
|
|
#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
|
|
#define ATTRIBUTE_UNUSED _GL_UNUSED
|
|
|
|
#if 3 <= __GNUC__
|
|
# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
|
|
#else
|
|
# define ATTRIBUTE_MALLOC
|
|
#endif
|
|
|
|
#if __has_attribute (alloc_size)
|
|
# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
|
|
#else
|
|
# define ATTRIBUTE_ALLOC_SIZE(args)
|
|
#endif
|
|
|
|
#define ATTRIBUTE_MALLOC_SIZE(args) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE (args)
|
|
|
|
/* Work around GCC bug 59600: when a function is inlined, the inlined
|
|
code may have its addresses sanitized even if the function has the
|
|
no_sanitize_address attribute. This bug is fixed in GCC 4.9.0 and
|
|
clang 3.4. */
|
|
#if (! ADDRESS_SANITIZER \
|
|
|| (GNUC_PREREQ (4, 9, 0) \
|
|
|| 3 < __clang_major__ + (4 <= __clang_minor__)))
|
|
# define ADDRESS_SANITIZER_WORKAROUND /* No workaround needed. */
|
|
#else
|
|
# define ADDRESS_SANITIZER_WORKAROUND NO_INLINE
|
|
#endif
|
|
|
|
/* Attribute of functions whose code should not have addresses
|
|
sanitized. */
|
|
|
|
#if __has_attribute (no_sanitize_address)
|
|
# define ATTRIBUTE_NO_SANITIZE_ADDRESS \
|
|
__attribute__ ((no_sanitize_address)) ADDRESS_SANITIZER_WORKAROUND
|
|
#elif __has_attribute (no_address_safety_analysis)
|
|
# define ATTRIBUTE_NO_SANITIZE_ADDRESS \
|
|
__attribute__ ((no_address_safety_analysis)) ADDRESS_SANITIZER_WORKAROUND
|
|
#else
|
|
# define ATTRIBUTE_NO_SANITIZE_ADDRESS
|
|
#endif
|
|
|
|
/* Some versions of GNU/Linux define noinline in their headers. */
|
|
#ifdef noinline
|
|
#undef noinline
|
|
#endif
|
|
|
|
/* Use Gnulib's extern-inline module for extern inline functions.
|
|
An include file foo.h should prepend FOO_INLINE to function
|
|
definitions, with the following overall pattern:
|
|
|
|
[#include any other .h files first.]
|
|
...
|
|
INLINE_HEADER_BEGIN
|
|
...
|
|
INLINE int
|
|
incr (int i)
|
|
{
|
|
return i + 1;
|
|
}
|
|
...
|
|
INLINE_HEADER_END
|
|
|
|
For every executable, exactly one file that includes the header
|
|
should do this:
|
|
|
|
#define INLINE EXTERN_INLINE
|
|
|
|
before including config.h or any other .h file.
|
|
Other .c files should not define INLINE.
|
|
For Emacs, this is done by having emacs.c first '#define INLINE
|
|
EXTERN_INLINE' and then include every .h file that uses INLINE.
|
|
|
|
The INLINE_HEADER_BEGIN and INLINE_HEADER_END suppress bogus
|
|
warnings in some GCC versions; see ../m4/extern-inline.m4.
|
|
|
|
C99 compilers compile functions like 'incr' as C99-style extern
|
|
inline functions. Buggy GCC implementations do something similar with
|
|
GNU-specific keywords. Buggy non-GCC compilers use static
|
|
functions, which bloats the code but is good enough. */
|
|
|
|
#ifndef INLINE
|
|
# define INLINE _GL_INLINE
|
|
#endif
|
|
#define EXTERN_INLINE _GL_EXTERN_INLINE
|
|
#define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN
|
|
#define INLINE_HEADER_END _GL_INLINE_HEADER_END
|
|
|
|
/* To use the struct hack with N elements, declare the struct like this:
|
|
struct s { ...; t name[FLEXIBLE_ARRAY_MEMBER]; };
|
|
and allocate (offsetof (struct s, name) + N * sizeof (t)) bytes.
|
|
IBM xlc 12.1 claims to do C99 but mishandles flexible array members. */
|
|
#ifdef __IBMC__
|
|
# define FLEXIBLE_ARRAY_MEMBER 1
|
|
#else
|
|
# define FLEXIBLE_ARRAY_MEMBER
|
|
#endif
|
|
|
|
/* When used in place of 'volatile', 'NONVOLATILE' is equivalent to nothing,
|
|
except it cajoles GCC into not warning incorrectly that a variable needs to
|
|
be volatile. This works around GCC bug 54561. */
|
|
#if defined GCC_LINT || defined lint
|
|
# define NONVOLATILE volatile
|
|
#else
|
|
# define NONVOLATILE /* empty */
|
|
#endif
|
|
|
|
/* 'int x UNINIT;' is equivalent to 'int x;', except it cajoles GCC
|
|
into not warning incorrectly about use of an uninitialized variable. */
|
|
#if defined GCC_LINT || defined lint
|
|
# define UNINIT = {0,}
|
|
#else
|
|
# define UNINIT /* empty */
|
|
#endif
|
|
|
|
/* conf_post.h ends here */
|