diff options
| -rwxr-xr-x | admin/merge-gnulib | 2 | ||||
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | m4/flexmember.m4 | 43 | ||||
| -rw-r--r-- | src/alloc.c | 16 | ||||
| -rw-r--r-- | src/conf_post.h | 10 |
5 files changed, 53 insertions, 20 deletions
diff --git a/admin/merge-gnulib b/admin/merge-gnulib index 1e3b7599626..ada80b4ae86 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib | |||
| @@ -93,7 +93,7 @@ test -x "$gnulib_srcdir"/gnulib-tool || { | |||
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | "$gnulib_srcdir"/gnulib-tool --dir="$src" $GNULIB_TOOL_FLAGS $GNULIB_MODULES && | 95 | "$gnulib_srcdir"/gnulib-tool --dir="$src" $GNULIB_TOOL_FLAGS $GNULIB_MODULES && |
| 96 | rm -- "$src"lib/gl_openssl.h "$src"m4/fcntl-o.m4 "$src"m4/flexmember.m4 \ | 96 | rm -- "$src"lib/gl_openssl.h "$src"m4/fcntl-o.m4 \ |
| 97 | "$src"m4/gl-openssl.m4 \ | 97 | "$src"m4/gl-openssl.m4 \ |
| 98 | "$src"m4/gnulib-cache.m4"$src" m4/warn-on-use.m4 && | 98 | "$src"m4/gnulib-cache.m4"$src" m4/warn-on-use.m4 && |
| 99 | cp -- "$gnulib_srcdir"/build-aux/texinfo.tex "$src"doc/misc && | 99 | cp -- "$gnulib_srcdir"/build-aux/texinfo.tex "$src"doc/misc && |
diff --git a/configure.ac b/configure.ac index 82a672b8cc5..6488f901e33 100644 --- a/configure.ac +++ b/configure.ac | |||
| @@ -775,8 +775,6 @@ dnl alternative to lib/gnulib.mk, so as to avoid generating header files | |||
| 775 | dnl that clash with MinGW. | 775 | dnl that clash with MinGW. |
| 776 | AM_CONDITIONAL([BUILDING_FOR_WINDOWSNT], [test "x$opsys" = "xmingw32"]) | 776 | AM_CONDITIONAL([BUILDING_FOR_WINDOWSNT], [test "x$opsys" = "xmingw32"]) |
| 777 | 777 | ||
| 778 | # Skip gnulib's tests for flexible array members, as Emacs assumes C99. | ||
| 779 | AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER]) | ||
| 780 | # Avoid gnulib's tests for -lcrypto, so that there's no static dependency on it. | 778 | # Avoid gnulib's tests for -lcrypto, so that there's no static dependency on it. |
| 781 | AC_DEFUN([gl_CRYPTO_CHECK]) | 779 | AC_DEFUN([gl_CRYPTO_CHECK]) |
| 782 | # Avoid gnulib's tests for HAVE_WORKING_O_NOATIME and HAVE_WORKING_O_NOFOLLOW, | 780 | # Avoid gnulib's tests for HAVE_WORKING_O_NOATIME and HAVE_WORKING_O_NOFOLLOW, |
diff --git a/m4/flexmember.m4 b/m4/flexmember.m4 new file mode 100644 index 00000000000..155ae9b8120 --- /dev/null +++ b/m4/flexmember.m4 | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | # serial 4 | ||
| 2 | # Check for flexible array member support. | ||
| 3 | |||
| 4 | # Copyright (C) 2006, 2009-2016 Free Software Foundation, Inc. | ||
| 5 | # This file is free software; the Free Software Foundation | ||
| 6 | # gives unlimited permission to copy and/or distribute it, | ||
| 7 | # with or without modifications, as long as this notice is preserved. | ||
| 8 | |||
| 9 | # Written by Paul Eggert. | ||
| 10 | |||
| 11 | AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER], | ||
| 12 | [ | ||
| 13 | AC_CACHE_CHECK([for flexible array member], | ||
| 14 | ac_cv_c_flexmember, | ||
| 15 | [AC_COMPILE_IFELSE( | ||
| 16 | [AC_LANG_PROGRAM( | ||
| 17 | [[#include <stdlib.h> | ||
| 18 | #include <stdio.h> | ||
| 19 | #include <stddef.h> | ||
| 20 | struct s { int n; double d[]; };]], | ||
| 21 | [[int m = getchar (); | ||
| 22 | size_t nbytes = offsetof (struct s, d) + m * sizeof (double); | ||
| 23 | nbytes += sizeof (struct s) - 1; | ||
| 24 | nbytes -= nbytes % sizeof (struct s); | ||
| 25 | struct s *p = malloc (nbytes); | ||
| 26 | p->d[0] = 0.0; | ||
| 27 | return p->d != (double *) NULL;]])], | ||
| 28 | [ac_cv_c_flexmember=yes], | ||
| 29 | [ac_cv_c_flexmember=no])]) | ||
| 30 | if test $ac_cv_c_flexmember = yes; then | ||
| 31 | AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], | ||
| 32 | [Define to nothing if C supports flexible array members, and to | ||
| 33 | 1 if it does not. That way, with a declaration like 'struct s | ||
| 34 | { int n; double d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack | ||
| 35 | can be used with pre-C99 compilers. | ||
| 36 | When computing the size of such an object, don't use 'sizeof (struct s)' | ||
| 37 | as it overestimates the size. Use 'offsetof (struct s, d)' instead. | ||
| 38 | Don't use 'offsetof (struct s, d@<:@0@:>@)', as this doesn't work with | ||
| 39 | MSVC and with C++ compilers.]) | ||
| 40 | else | ||
| 41 | AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1]) | ||
| 42 | fi | ||
| 43 | ]) | ||
diff --git a/src/alloc.c b/src/alloc.c index 1092a34801a..41b2f9e77d2 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -2002,9 +2002,9 @@ allocate_string_data (struct Lisp_String *s, | |||
| 2002 | mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); | 2002 | mallopt (M_MMAP_MAX, MMAP_MAX_AREAS); |
| 2003 | #endif | 2003 | #endif |
| 2004 | 2004 | ||
| 2005 | b->next_free = b->data; | 2005 | data = b->data; |
| 2006 | b->data[0].string = NULL; | ||
| 2007 | b->next = large_sblocks; | 2006 | b->next = large_sblocks; |
| 2007 | b->next_free = data; | ||
| 2008 | large_sblocks = b; | 2008 | large_sblocks = b; |
| 2009 | } | 2009 | } |
| 2010 | else if (current_sblock == NULL | 2010 | else if (current_sblock == NULL |
| @@ -2014,9 +2014,9 @@ allocate_string_data (struct Lisp_String *s, | |||
| 2014 | { | 2014 | { |
| 2015 | /* Not enough room in the current sblock. */ | 2015 | /* Not enough room in the current sblock. */ |
| 2016 | b = lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP); | 2016 | b = lisp_malloc (SBLOCK_SIZE, MEM_TYPE_NON_LISP); |
| 2017 | b->next_free = b->data; | 2017 | data = b->data; |
| 2018 | b->data[0].string = NULL; | ||
| 2019 | b->next = NULL; | 2018 | b->next = NULL; |
| 2019 | b->next_free = data; | ||
| 2020 | 2020 | ||
| 2021 | if (current_sblock) | 2021 | if (current_sblock) |
| 2022 | current_sblock->next = b; | 2022 | current_sblock->next = b; |
| @@ -2025,14 +2025,16 @@ allocate_string_data (struct Lisp_String *s, | |||
| 2025 | current_sblock = b; | 2025 | current_sblock = b; |
| 2026 | } | 2026 | } |
| 2027 | else | 2027 | else |
| 2028 | b = current_sblock; | 2028 | { |
| 2029 | b = current_sblock; | ||
| 2030 | data = b->next_free; | ||
| 2031 | } | ||
| 2029 | 2032 | ||
| 2030 | data = b->next_free; | 2033 | data->string = s; |
| 2031 | b->next_free = (sdata *) ((char *) data + needed + GC_STRING_EXTRA); | 2034 | b->next_free = (sdata *) ((char *) data + needed + GC_STRING_EXTRA); |
| 2032 | 2035 | ||
| 2033 | MALLOC_UNBLOCK_INPUT; | 2036 | MALLOC_UNBLOCK_INPUT; |
| 2034 | 2037 | ||
| 2035 | data->string = s; | ||
| 2036 | s->data = SDATA_DATA (data); | 2038 | s->data = SDATA_DATA (data); |
| 2037 | #ifdef GC_CHECK_STRING_BYTES | 2039 | #ifdef GC_CHECK_STRING_BYTES |
| 2038 | SDATA_NBYTES (data) = nbytes; | 2040 | SDATA_NBYTES (data) = nbytes; |
diff --git a/src/conf_post.h b/src/conf_post.h index 865d0183a57..6d54524b970 100644 --- a/src/conf_post.h +++ b/src/conf_post.h | |||
| @@ -358,16 +358,6 @@ extern int emacs_setenv_TZ (char const *); | |||
| 358 | #define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN | 358 | #define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN |
| 359 | #define INLINE_HEADER_END _GL_INLINE_HEADER_END | 359 | #define INLINE_HEADER_END _GL_INLINE_HEADER_END |
| 360 | 360 | ||
| 361 | /* To use the struct hack with N elements, declare the struct like this: | ||
| 362 | struct s { ...; t name[FLEXIBLE_ARRAY_MEMBER]; }; | ||
| 363 | and allocate (offsetof (struct s, name) + N * sizeof (t)) bytes. | ||
| 364 | IBM xlc 12.1 claims to do C99 but mishandles flexible array members. */ | ||
| 365 | #ifdef __IBMC__ | ||
| 366 | # define FLEXIBLE_ARRAY_MEMBER 1 | ||
| 367 | #else | ||
| 368 | # define FLEXIBLE_ARRAY_MEMBER | ||
| 369 | #endif | ||
| 370 | |||
| 371 | /* 'int x UNINIT;' is equivalent to 'int x;', except it cajoles GCC | 361 | /* 'int x UNINIT;' is equivalent to 'int x;', except it cajoles GCC |
| 372 | into not warning incorrectly about use of an uninitialized variable. */ | 362 | into not warning incorrectly about use of an uninitialized variable. */ |
| 373 | #if defined GCC_LINT || defined lint | 363 | #if defined GCC_LINT || defined lint |