From 7cae64b4eed192a49ea258089639ec44da6095e2 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 17 Jan 2011 20:54:23 -0800 Subject: [PATCH] Improve performance on non-GCC hosts with __aligned__. --- ChangeLog | 7 +++++++ configure | 32 +++++++++++++++++++++++++++++++- configure.in | 14 +++++++++++++- src/ChangeLog | 8 ++++++++ src/config.in | 3 +++ src/lisp.h | 8 +++++--- 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 095a4a7813a..b75ef310f78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-01-18 Paul Eggert + + * configure.in (HAVE_ATTRIBUTE_ALIGNED): Arrange for this to be + defined if the compiler supports GCC-style __attribute__ + ((__aligned__ ...)). IBM AIX and Oracle Solaris Studio support + this syntax. + 2011-01-17 Paul Eggert Makefile.in: tidy up the building of lib diff --git a/configure b/configure index a15a9ea56a3..56701c27f5b 100755 --- a/configure +++ b/configure @@ -8278,6 +8278,37 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__ ((__aligned__ (expr)))" >&5 +$as_echo_n "checking for __attribute__ ((__aligned__ (expr)))... " >&6; } +if ${emacs_cv_attribute_aligned+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +char __attribute__ ((__aligned__ (1 << 3))) c; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + emacs_cv_attribute_aligned=yes +else + emacs_cv_attribute_aligned=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $emacs_cv_attribute_aligned" >&5 +$as_echo "$emacs_cv_attribute_aligned" >&6; } +if test $emacs_cv_attribute_aligned = yes; then + +$as_echo "#define HAVE_ATTRIBUTE_ALIGNED 1" >>confdefs.h + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} @@ -18959,4 +18990,3 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi - diff --git a/configure.in b/configure.in index 2cac4f3e7d0..c338ff37a60 100644 --- a/configure.in +++ b/configure.in @@ -1323,6 +1323,19 @@ AH_TEMPLATE(POINTER_TYPE, 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 @@ -3734,4 +3747,3 @@ if test ! -f src/.gdbinit && test -f $srcdir/src/.gdbinit; then fi ], [GCC="$GCC" NON_GNU_CPP="$NON_GNU_CPP" CPP="$CPP" CPPFLAGS="$CPPFLAGS"]) - diff --git a/src/ChangeLog b/src/ChangeLog index f91ec458464..6e950569fbc 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2011-01-18 Paul Eggert + + * lisp.h (DECL_ALIGN): Define if HAVE_ATTRIBUTE_ALIGNED, not if + defined __GNUC__. ../configure now checks for this GCC feature, + which is now also supported by IBM and Oracle compilers. + (USE_LSB_TAG) [defined DECL_ALIGN]: Also define if defined __sun, + since Solaris malloc returns mult-of-8. + 2011-01-18 Stefan Monnier * image.c (syms_of_image): Don't access XSYMBOL's internals directly. diff --git a/src/config.in b/src/config.in index d8a9722d316..62e83eea334 100644 --- a/src/config.in +++ b/src/config.in @@ -115,6 +115,9 @@ along with GNU Emacs. If not, see . */ /* Define to 1 if ALSA is available. */ #undef HAVE_ALSA +/* Define to 1 if GCC-style __attribute__ ((__aligned__ (expr))) works. */ +#undef HAVE_ATTRIBUTE_ALIGNED + /* Define to 1 if strtold conforms to C99. */ #undef HAVE_C99_STRTOLD diff --git a/src/lisp.h b/src/lisp.h index d00dbdc5def..5424bf7b83d 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -122,16 +122,18 @@ extern void die (const char *, const char *, int) NO_RETURN; TYPEBITS-aligned. */ #ifndef NO_DECL_ALIGN # ifndef DECL_ALIGN -/* What compiler directive should we use for non-gcc compilers? -stef */ -# if defined (__GNUC__) +# if HAVE_ATTRIBUTE_ALIGNED # define DECL_ALIGN(type, var) \ type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var +# else + /* What directives do other compilers use? */ # endif # endif #endif /* Let's USE_LSB_TAG on systems where we know malloc returns mult-of-8. */ -#if defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ || defined DARWIN_OS +#if (defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ \ + || defined DARWIN_OS || defined __sun) /* We also need to be able to specify mult-of-8 alignment on static vars. */ # if defined DECL_ALIGN # define USE_LSB_TAG -- 2.39.2