From: Paul Eggert <eggert@cs.ucla.edu>
To: 9772@debbugs.gnu.org
Subject: bug#9772: <stdalign.h>, USE_LSB_TAG, and MSVC
Date: Sun, 16 Oct 2011 20:24:31 -0700 [thread overview]
Message-ID: <4E9B9FEF.7020207@cs.ucla.edu> (raw)
Package: Emacs
Version: 24.0.90
Tags: patch
Here's a patch to the Emacs trunk (bzr 106094) to cause it to use
<stdalign.h> if available, falling back on a Gnulib replacement
otherwise. This simplifies Emacs proper, and should future-proof it
for C1X compilers.
Although this patch is mostly just a cleanup patch for GNU and POSIX
platforms, it may improve performance on some Microsoft hosts, as it
contains code for supporting <stdalign.h> under MSVC. As far as I can
see, USE_LSB_TAG currently doesn't work with MSVC, so if this patch
works it should increase the maximum Emacs buffer size in that
environment. I haven't tested it under Windows, though, and quite
possibly further work will be needed in that area.
Since this is Microsoft-build relevant, I'll CC: this bug report to Eli.
=== modified file '.bzrignore'
--- .bzrignore 2011-09-29 14:19:11 +0000
+++ .bzrignore 2011-10-17 01:22:19 +0000
@@ -53,6 +53,7 @@
lib/c++defs.h
lib/getopt.h
lib/inttypes.h
+lib/stdalign.h
lib/stdbool.h
lib/stdio.h
lib/stdint.h
=== modified file 'ChangeLog'
--- ChangeLog 2011-10-13 02:16:59 +0000
+++ ChangeLog 2011-10-17 01:22:19 +0000
@@ -1,3 +1,18 @@
+2011-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use Gnulib stdalign module.
+ This should improve portability of macros like alignof and DECL_ALIGN.
+ * lib/stdalign.in.h, m4/stdalign.m4: New files, from gnulib.
+ * .bzrignore: Add lib/stdalign.h.
+ * Makefile.in (GNULIB_MODULES): Add stdalign.
+ * config.bat: Set HAVE_ATTRIBUTE_ALIGNED in lib/stdalign.h,
+ instead of NO_DECL_ALIGN in config.h. Copy lib/stdalign.in.h to
+ lib/stdalign.in-h as needed.
+ * configure.in (HAVE_ATTRIBUTE_ALIGNED): Remove the code that
+ fiddles with this, as gnulib now does this for us.
+ * lib/gnulib.mk, lib/md5.c, lib/sha1.c, lib/sha256.c, lib/sha512.c:
+ * m4/gl-comp.m4, m4/pthread_sigmask.m4: Merge from gnulib.
+
2011-10-13 Glenn Morris <rgm@gnu.org>
* configure.in: Also look for tputs in libcurses. (Bug#9736)
=== modified file 'Makefile.in'
--- Makefile.in 2011-09-26 21:30:18 +0000
+++ Makefile.in 2011-10-17 01:22:19 +0000
@@ -337,7 +337,7 @@
dup2 \
filemode getloadavg getopt-gnu ignore-value intprops lstat \
mktime pthread_sigmask readlink \
- socklen stdarg stdio strftime strtoimax strtoumax symlink sys_stat
+ socklen stdalign stdarg stdio strftime strtoimax strtoumax symlink sys_stat
GNULIB_TOOL_FLAGS = \
--avoid=msvc-inval --avoid=msvc-nothrow --avoid=pathmax \
--avoid=raise --avoid=threadlib \
=== modified file 'config.bat'
--- config.bat 2011-09-29 12:08:36 +0000
+++ config.bat 2011-10-17 01:22:19 +0000
@@ -161,7 +161,8 @@
sed -f ../msdos/sed2x.inp < ..\autogen\config.in > config.tmp
:src4
sed -f ../msdos/sed2v2.inp <config.tmp >config.h2
-Rem See if DECL_ALIGN can be supported with this GCC
+Rem See if alignas can be supported with this GCC
+set HAVE_ATTRIBUTE_ALIGNED=1
rm -f junk.c junk.o junk junk.exe
echo struct { int i; char *p; } __attribute__((__aligned__(8))) foo; >junk.c
rem Two percent signs because it is a special character for COMMAND.COM/CMD
@@ -173,9 +174,9 @@
If Not ErrorLevel 1 Goto alignOk
Echo WARNING: Your GCC does not support 8-byte aligned variables.
Echo WARNING: Therefore Emacs cannot support buffers larger than 128MB.
-rem The following line disables DECL_ALIGN which in turn disables USE_LSB_TAG
+rem The following line disables alignas which in turn disables USE_LSB_TAG
rem For details see lisp.h where it defines USE_LSB_TAG
-echo #define NO_DECL_ALIGN >>config.h2
+set HAVE_ATTRIBUTE_ALIGNED=0
:alignOk
Rem See if they have libxml2 later than v2.2.0 installed
Echo Checking whether libxml2 v2.2.1 or later is installed ...
@@ -281,6 +282,7 @@
If Exist build-aux\snippet\c++defs.h update build-aux/snippet/c++defs.h build-aux/snippet/cxxdefs.h
If Exist alloca.in.h update alloca.in.h alloca.in-h
If Exist getopt.in.h update getopt.in.h getopt.in-h
+If Exist stdalign.in.h update stdalign.in.h stdalign.in-h
If Exist stdbool.in.h update stdbool.in.h stdbool.in-h
If Exist signal.in.h update signal.in.h signal.in-h
If Exist stddef.in.h update stddef.in.h stddef.in-h
@@ -290,7 +292,7 @@
If Exist sys_stat.in.h update sys_stat.in.h sys_stat.in-h
If Exist time.in.h update time.in.h time.in-h
If Exist unistd.in.h update unistd.in.h unistd.in-h
-sed -f ../msdos/sedlibcf.inp < ..\autogen\Makefile.in > makefile.tmp
+sed -e "s/@HAVE_ATTRIBUTE_ALIGNED@/%HAVE_ATTRIBUTE_ALIGNED%/g" -f ../msdos/sedlibcf.inp < ..\autogen\Makefile.in > makefile.tmp
sed -f ../msdos/sedlibmk.inp < makefile.tmp > Makefile
rm -f makefile.tmp
Rem Create .Po files for new files in lib/
@@ -343,4 +345,3 @@
set djgpp_ver=
set sys_malloc=
set libxml=
-
=== modified file 'configure.in'
--- configure.in 2011-10-13 02:16:59 +0000
+++ configure.in 2011-10-17 01:22:19 +0000
@@ -1357,19 +1357,6 @@
dnl Check for endianess
AC_C_BIGENDIAN
-AC_CACHE_CHECK([for __attribute__ ((__aligned__ (expr)))],
- [emacs_cv_attribute_aligned],
- [AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [[char __attribute__ ((__aligned__ (1 << 3))) c;]],
- [[]])],
- [emacs_cv_attribute_aligned=yes],
- [emacs_cv_attribute_aligned=no])])
-if test $emacs_cv_attribute_aligned = yes; then
- AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1,
- [Define to 1 if GCC-style __attribute__ ((__aligned__ (expr))) works.])
-fi
-
dnl check for Make feature
AC_PROG_MAKE_SET
=== modified file 'lib/gnulib.mk'
--- lib/gnulib.mk 2011-09-26 21:30:18 +0000
+++ lib/gnulib.mk 2011-10-17 01:22:19 +0000
@@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=msvc-inval --avoid=msvc-nothrow --avoid=pathmax --avoid=raise --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dup2 filemode getloadavg getopt-gnu ignore-value intprops lstat mktime pthread_sigmask readlink socklen stdarg stdio strftime strtoimax strtoumax symlink sys_stat
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=msvc-inval --avoid=msvc-nothrow --avoid=pathmax --avoid=raise --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt careadlinkat crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dup2 filemode getloadavg getopt-gnu ignore-value intprops lstat mktime pthread_sigmask readlink socklen stdalign stdarg stdio strftime strtoimax strtoumax symlink sys_stat
MOSTLYCLEANFILES += core *.stackdump
@@ -421,6 +421,29 @@
## end gnulib module stat
+## begin gnulib module stdalign
+
+BUILT_SOURCES += $(STDALIGN_H)
+
+# We need the following in order to create <stdalign.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDALIGN_H
+stdalign.h: stdalign.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_ATTRIBUTE_ALIGNED''@/$(HAVE_ATTRIBUTE_ALIGNED)/g' < $(srcdir)/stdalign.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+stdalign.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += stdalign.h stdalign.h-t
+
+EXTRA_DIST += stdalign.in.h
+
+## end gnulib module stdalign
+
## begin gnulib module stdarg
BUILT_SOURCES += $(STDARG_H)
=== modified file 'lib/md5.c'
--- lib/md5.c 2011-02-19 07:28:29 +0000
+++ lib/md5.c 2011-10-17 01:22:19 +0000
@@ -24,7 +24,8 @@
#include "md5.h"
-#include <stddef.h>
+#include <stdalign.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
@@ -254,8 +255,7 @@
if (len >= 64)
{
#if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
-# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
if (UNALIGNED_P (buffer))
while (len > 64)
{
=== modified file 'lib/sha1.c'
--- lib/sha1.c 2011-05-24 08:12:52 +0000
+++ lib/sha1.c 2011-10-17 01:22:19 +0000
@@ -26,7 +26,8 @@
#include "sha1.h"
-#include <stddef.h>
+#include <stdalign.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -241,8 +242,7 @@
if (len >= 64)
{
#if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
-# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
if (UNALIGNED_P (buffer))
while (len > 64)
{
=== modified file 'lib/sha256.c'
--- lib/sha256.c 2011-06-21 08:45:39 +0000
+++ lib/sha256.c 2011-10-17 01:22:19 +0000
@@ -24,7 +24,8 @@
#include "sha256.h"
-#include <stddef.h>
+#include <stdalign.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -373,8 +374,7 @@
if (len >= 64)
{
#if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
-# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
if (UNALIGNED_P (buffer))
while (len > 64)
{
=== modified file 'lib/sha512.c'
--- lib/sha512.c 2011-06-21 08:45:39 +0000
+++ lib/sha512.c 2011-10-17 01:22:19 +0000
@@ -24,7 +24,8 @@
#include "sha512.h"
-#include <stddef.h>
+#include <stdalign.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -381,8 +382,7 @@
if (len >= 128)
{
#if !_STRING_ARCH_unaligned
-# define alignof(type) offsetof (struct { char c; type x; }, x)
-# define UNALIGNED_P(p) (((size_t) p) % alignof (u64) != 0)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (u64) != 0)
if (UNALIGNED_P (buffer))
while (len > 128)
{
=== added file 'lib/stdalign.in.h'
--- lib/stdalign.in.h 1970-01-01 00:00:00 +0000
+++ lib/stdalign.in.h 2011-10-17 01:22:19 +0000
@@ -0,0 +1,61 @@
+/* A substitute for ISO C 1x <stdalign.h>.
+
+ Copyright 2011 Free Software Foundation, Inc.
+
+ This program 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, or (at your option)
+ any later version.
+
+ This program 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 this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Written by Paul Eggert and Bruno Haible. */
+
+#ifndef _GL_STDALIGN_H
+#define _GL_STDALIGN_H
+
+/* ISO C1X <stdalign.h> for platforms that lack it.
+
+ References:
+ ISO C1X <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>
+ sections 6.5.3.4, 6.7.5, 7.15.
+ C++0X <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>
+ section 18.10. */
+
+/* Return the alignment of a structure slot (field) of TYPE,
+ as an integer constant expression. The result cannot be used as a
+ value for an 'enum' constant, if you want to be portable to HP-UX
+ 10.20 cc and AIX 3.2.5 xlc.
+
+ This is not the same as GCC's __alignof__ operator; for example, on
+ x86 with GCC, _Alignof (long long) is typically 4 whereas
+ __alignof__ (long long) is 8. */
+#include <stddef.h>
+#if defined __cplusplus
+ template <class __t> struct __alignof_helper { char __a; __t __b; };
+# define _Alignof(type) offsetof (__alignof_helper<type>, __b)
+#else
+# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
+#endif
+#define alignof _Alignof
+#define __alignof_is_defined 1
+
+/* Align a type or variable to the alignment A. */
+#if @HAVE_ATTRIBUTE_ALIGNED@ && !defined __cplusplus
+# define _Alignas(a) __attribute__ ((__aligned__ (a)))
+#elif 1300 <= _MSC_VER
+# define _Alignas(a) __declspec ((align (a)))
+#endif
+#ifdef _Alignas
+# define alignas _Alignas
+# define __alignas_is_defined 1
+#endif
+
+#endif /* _GL_STDALIGN_H */
=== modified file 'm4/gl-comp.m4'
--- m4/gl-comp.m4 2011-10-07 21:15:00 +0000
+++ m4/gl-comp.m4 2011-10-17 01:22:19 +0000
@@ -76,6 +76,7 @@
# Code from module socklen:
# Code from module ssize_t:
# Code from module stat:
+ # Code from module stdalign:
# Code from module stdarg:
dnl Some compilers (e.g., AIX 5.3 cc) need to be in c99 mode
dnl for the builtin va_copy to work. With Autoconf 2.60 or later,
@@ -180,6 +181,7 @@
gl_SIGNAL_H
gl_TYPE_SOCKLEN_T
gt_TYPE_SSIZE_T
+gl_STDALIGN_H
gl_STDARG_H
AM_STDBOOL_H
gl_STDDEF_H
@@ -311,18 +313,18 @@
if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
func_gl_gnulib_m4code_stat
fi
- if test $ac_cv_func_strtoimax = no; then
- func_gl_gnulib_m4code_verify
- fi
if test $ac_cv_func_strtoimax = no && test $ac_cv_type_long_long_int = yes; then
func_gl_gnulib_m4code_strtoll
fi
- if test $ac_cv_func_strtoumax = no; then
+ if test $ac_cv_func_strtoimax = no; then
func_gl_gnulib_m4code_verify
fi
if test $ac_cv_func_strtoumax = no && test $ac_cv_type_unsigned_long_long_int = yes; then
func_gl_gnulib_m4code_strtoull
fi
+ if test $ac_cv_func_strtoumax = no; then
+ func_gl_gnulib_m4code_verify
+ fi
m4_pattern_allow([^gl_GNULIB_ENABLED_])
AM_CONDITIONAL([gl_GNULIB_ENABLED_dosname], [$gl_gnulib_enabled_dosname])
AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36])
@@ -513,6 +515,7 @@
lib/signal.in.h
lib/sigprocmask.c
lib/stat.c
+ lib/stdalign.in.h
lib/stdarg.in.h
lib/stdbool.in.h
lib/stddef.in.h
@@ -563,6 +566,7 @@
m4/ssize_t.m4
m4/st_dm_mode.m4
m4/stat.m4
+ m4/stdalign.m4
m4/stdarg.m4
m4/stdbool.m4
m4/stddef_h.m4
=== modified file 'm4/pthread_sigmask.m4'
--- m4/pthread_sigmask.m4 2011-09-03 23:08:32 +0000
+++ m4/pthread_sigmask.m4 2011-10-17 01:22:19 +0000
@@ -1,4 +1,4 @@
-# pthread_sigmask.m4 serial 12
+# pthread_sigmask.m4 serial 13
dnl Copyright (C) 2011 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
@@ -6,6 +6,8 @@
AC_DEFUN([gl_FUNC_PTHREAD_SIGMASK],
[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+
AC_CHECK_FUNCS_ONCE([pthread_sigmask])
LIB_PTHREAD_SIGMASK=
=== added file 'm4/stdalign.m4'
--- m4/stdalign.m4 1970-01-01 00:00:00 +0000
+++ m4/stdalign.m4 2011-10-17 01:22:19 +0000
@@ -0,0 +1,37 @@
+# Check for stdalign.h that conforms to C1x.
+
+dnl Copyright 2011 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Prepare for substituting <stdalign.h> if it is not supported.
+
+AC_DEFUN([gl_STDALIGN_H],
+[
+ AC_CHECK_HEADERS_ONCE([stdalign.h])
+ HAVE_ATTRIBUTE_ALIGNED='?'
+
+ if test "$ac_cv_header_stdalign_h" = yes; then
+ STDALIGN_H=''
+ else
+ STDALIGN_H='stdalign.h'
+ AC_CACHE_CHECK([for __attribute__ ((__aligned__ (expr)))],
+ [gl_cv_attribute_aligned],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[char __attribute__ ((__aligned__ (1 << 3))) c;]],
+ [[]])],
+ [gl_cv_attribute_aligned=yes],
+ [gl_cv_attribute_aligned=no])])
+ if test $gl_cv_attribute_aligned = yes; then
+ HAVE_ATTRIBUTE_ALIGNED=1
+ else
+ HAVE_ATTRIBUTE_ALIGNED=0
+ fi
+ fi
+
+ AC_SUBST([HAVE_ATTRIBUTE_ALIGNED])
+ AC_SUBST([STDALIGN_H])
+ AM_CONDITIONAL([GL_GENERATE_STDALIGN_H], [test -n "$STDALIGN_H"])
+])
=== modified file 'msdos/ChangeLog'
--- msdos/ChangeLog 2011-09-29 12:00:18 +0000
+++ msdos/ChangeLog 2011-10-17 01:22:19 +0000
@@ -1,3 +1,10 @@
+2011-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use Gnulib stdalign module.
+ * sed2v2.inp (HAVE_ATTRIBUTE_ALIGNED): Remove edit.
+ * sedlibmk.inp (STDALIGN_H, @GL_GENERATE_STDALIGN_H_TRUE@)
+ (GL_GENERATE_STDALIGN_H_FALSE): New edits.
+
2011-09-29 Eli Zaretskii <eliz@gnu.org>
* mainmake.v2 (boot): Condition the value on the existence of
=== modified file 'msdos/sed2v2.inp'
--- msdos/sed2v2.inp 2011-09-29 12:00:18 +0000
+++ msdos/sed2v2.inp 2011-10-17 01:22:19 +0000
@@ -35,7 +35,6 @@
/^#undef HAVE_FREXP *$/s/^.*$/#define HAVE_FREXP 1/
/^#undef HAVE_FMOD *$/s/^.*$/#define HAVE_FMOD 1/
/^#undef HAVE_RINT *$/s/^.*$/#define HAVE_RINT 1/
-/^#undef HAVE_ATTRIBUTE_ALIGNED *$/s/^.*$/#define HAVE_ATTRIBUTE_ALIGNED 1/
/^#undef HAVE_C99_STRTOLD *$/s/^.*$/#define HAVE_C99_STRTOLD 1/
/^#undef HAVE_CBRT *$/s/^.*$/#define HAVE_CBRT 1/
/^#undef HAVE_DIFFTIME *$/s/^.*$/#define HAVE_DIFFTIME 1/
@@ -119,4 +118,3 @@
# might be defined in sys/config.h we include at the top of config.h.
/^#undef BSTRING/s|#undef|# undef|
/^#undef .*$/s|^.*$|/* & */|
-
=== modified file 'msdos/sedlibmk.inp'
--- msdos/sedlibmk.inp 2011-09-29 12:00:18 +0000
+++ msdos/sedlibmk.inp 2011-10-17 01:22:19 +0000
@@ -27,7 +27,7 @@
# otherwise edit them to zero:
#
# /^REPLACE_CALLOC *=/s/@REPLACE_CALLOC@/0/
-#
+#
# . If the module is a header or adds headers, edit the corresponding
# variable to either an empty value or to the name of the header.
# Examples:
@@ -547,6 +547,7 @@
/^SIZE_T_SUFFIX *=/s/@SIZE_T_SUFFIX@/u/
/^ALLOCA_H *=/s/@[^@\n]*@/alloca.h/
/^STDBOOL_H *=/s/@[^@\n]*@//
+/^STDALIGN_H *=/s/@[^@\n]*@/stdalign.h/
/^STDARG_H *=/s/@[^@\n]*@//
/^STDDEF_H *=/s/@[^@\n]*@//
/^STDINT_H *=/s/@[^@\n]*@/stdint.h/
@@ -600,6 +601,8 @@
s/^@GL_GENERATE_ALLOCA_H_FALSE@/\#/
s/^@GL_GENERATE_STDBOOL_H_TRUE@/\#/
s/^@GL_GENERATE_STDBOOL_H_FALSE@//
+s/^@GL_GENERATE_STDALIGN_H_TRUE@//
+s/^@GL_GENERATE_STDALIGN_H_FALSE@/\#/
s/^@GL_GENERATE_STDARG_H_TRUE@/\#/
s/^@GL_GENERATE_STDARG_H_FALSE@/\#/
s/^@GL_GENERATE_STDDEF_H_TRUE@/\#/
=== modified file 'nt/ChangeLog'
--- nt/ChangeLog 2011-09-04 21:52:59 +0000
+++ nt/ChangeLog 2011-10-17 01:22:19 +0000
@@ -1,3 +1,8 @@
+2011-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use Gnulib stdalign module.
+ * config.nt (HAVE_ATTRIBUTE_ALIGNED): Remove.
+
2011-09-04 Paul Eggert <eggert@cs.ucla.edu>
* config.nt (HAVE_SNPRINTF): New macro.
=== modified file 'nt/config.nt'
--- nt/config.nt 2011-09-26 03:20:03 +0000
+++ nt/config.nt 2011-10-17 01:22:19 +0000
@@ -271,13 +271,6 @@
/* Preprocessor macros needed for gnulib imports. */
-/* Define to 1 if GCC-style __attribute__ ((__aligned__ (expr))) works. */
-#ifdef __GNUC__
-#define HAVE_ATTRIBUTE_ALIGNED 1
-#else
-#undef HAVE_ATTRIBUTE_ALIGNED
-#endif
-
/* Define to 1 if strtold conforms to C99. */
#ifdef __GNUC__
#define HAVE_C99_STRTOLD 1
=== modified file 'src/ChangeLog'
--- src/ChangeLog 2011-10-15 10:12:00 +0000
+++ src/ChangeLog 2011-10-17 01:22:19 +0000
@@ -1,3 +1,12 @@
+2011-10-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use Gnulib stdalign module.
+ * alloc.c (XMALLOC_BASE_ALIGNMENT, GC_LISP_OBJECT_ALIGNMENT)
+ (GC_POINTER_ALIGNMENT, pure_alloc): Simplify by using alignof.
+ (pure_alloc) [! USE_LSB_TAG]: Don't over-align EMACS_INT values.
+ * lisp.h: Include <stdalign.h>.
+ (DECL_ALIGN): Simplify by using alignas.
+
2011-10-15 Martin Rudalics <rudalics@gmx.at>
* window.c (coordinates_in_window): Rewrite and delabelize
=== modified file 'src/alloc.c'
--- src/alloc.c 2011-10-12 06:09:40 +0000
+++ src/alloc.c 2011-10-17 01:22:19 +0000
@@ -507,12 +507,7 @@
hold a size_t value and (2) the header size is a multiple of the
alignment that Emacs needs for C types and for USE_LSB_TAG. */
#define XMALLOC_BASE_ALIGNMENT \
- offsetof ( \
- struct { \
- union { long double d; intmax_t i; void *p; } u; \
- char c; \
- }, \
- c)
+ alignof (union { long double d; intmax_t i; void *p; })
#ifdef USE_LSB_TAG
/* A common multiple of the positive integers A and B. Ideally this
would be the least common multiple, but there's no way to do that
@@ -4235,15 +4230,15 @@
}
-/* Alignment of Lisp_Object and pointer values. Use offsetof, as it
+/* Alignment of Lisp_Object and pointer values. Use alignof, as it
sometimes returns a smaller alignment than GCC's __alignof__ and
mark_memory might miss objects if __alignof__ were used. For
example, on x86 with WIDE_EMACS_INT, __alignof__ (Lisp_Object) is 8
but GC_LISP_OBJECT_ALIGNMENT should be 4. */
#ifndef GC_LISP_OBJECT_ALIGNMENT
-# define GC_LISP_OBJECT_ALIGNMENT offsetof (struct {char a; Lisp_Object b;}, b)
+# define GC_LISP_OBJECT_ALIGNMENT alignof (Lisp_Object)
#endif
-#define GC_POINTER_ALIGNMENT offsetof (struct {char a; void *b;}, b)
+#define GC_POINTER_ALIGNMENT alignof (void *)
/* Mark Lisp objects referenced from the address range START+OFFSET..END
or END+OFFSET..START. */
@@ -4662,17 +4657,11 @@
#ifdef USE_LSB_TAG
size_t alignment = (1 << GCTYPEBITS);
#else
- size_t alignment = sizeof (EMACS_INT);
+ size_t alignment = alignof (EMACS_INT);
/* Give Lisp_Floats an extra alignment. */
if (type == Lisp_Float)
- {
-#if defined __GNUC__ && __GNUC__ >= 2
- alignment = __alignof (struct Lisp_Float);
-#else
- alignment = sizeof (struct Lisp_Float);
-#endif
- }
+ alignment = alignof (struct Lisp_Float);
#endif
again:
=== modified file 'src/lisp.h'
--- src/lisp.h 2011-10-11 17:35:16 +0000
+++ src/lisp.h 2011-10-17 01:22:19 +0000
@@ -20,6 +20,7 @@
#ifndef EMACS_LISP_H
#define EMACS_LISP_H
+#include <stdalign.h>
#include <stdarg.h>
#include <stddef.h>
#include <inttypes.h>
@@ -163,15 +164,8 @@
/* First, try and define DECL_ALIGN(type,var) which declares a static
variable VAR of type TYPE with the added requirement that it be
TYPEBITS-aligned. */
-#ifndef NO_DECL_ALIGN
-# ifndef DECL_ALIGN
-# if HAVE_ATTRIBUTE_ALIGNED
-# define DECL_ALIGN(type, var) \
- type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var
-# else
- /* What directives do other compilers use? */
-# endif
-# endif
+#ifdef alignas
+# define DECL_ALIGN(type, var) type alignas (1 << GCTYPEBITS) var
#endif
/* Let's USE_LSB_TAG on systems where we know malloc returns mult-of-8. */
next reply other threads:[~2011-10-17 3:24 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-17 3:24 Paul Eggert [this message]
2011-10-17 4:04 ` bug#9772: <stdalign.h>, USE_LSB_TAG, and MSVC Eli Zaretskii
2011-10-17 5:18 ` Paul Eggert
2011-10-17 13:22 ` Stefan Monnier
2011-10-17 14:02 ` Eli Zaretskii
2011-10-17 17:46 ` Paul Eggert
2011-10-27 20:19 ` bug#9772: stdalign status report Paul Eggert
2011-11-08 6:09 ` bug#9772: fix for Bug#9772 should also help fix Bug#9660 Paul Eggert
2011-11-08 6:42 ` Paul Eggert
2012-07-28 23:21 ` bug#9772: <stdalign.h>, USE_LSB_TAG, and MSVC Paul Eggert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E9B9FEF.7020207@cs.ucla.edu \
--to=eggert@cs.ucla.edu \
--cc=9772@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).