johannes Tue, 09 Feb 2010 21:58:13 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=294825
Log: Detect if we can rely on compiler-specific alignment features else use custom workarounds. Fixes #50753 Bug: http://bugs.php.net/50753 (Assigned) crypt_sha256.c / crypt_sha512.c - Gnu specific code, non-Gnu compiler Changed paths: U php/php-src/branches/PHP_5_3/ext/standard/config.m4 U php/php-src/branches/PHP_5_3/ext/standard/crypt_sha256.c U php/php-src/branches/PHP_5_3/ext/standard/crypt_sha512.c U php/php-src/trunk/ext/standard/config.m4 U php/php-src/trunk/ext/standard/crypt_sha256.c U php/php-src/trunk/ext/standard/crypt_sha512.c
Modified: php/php-src/branches/PHP_5_3/ext/standard/config.m4 =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/config.m4 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/branches/PHP_5_3/ext/standard/config.m4 2010-02-09 21:58:13 UTC (rev 294825) @@ -235,6 +235,41 @@ dnl If one of them is missing, use our own implementation, portable code is then possible dnl if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then + + dnl + dnl Check for __alignof__ support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports __alignof__,ac_cv_alignof_exists,[ + AC_TRY_COMPILE([ +int main() { + int align = __alignof__(int); + return 0; +} + ],[ + ac_cv_alignof_exists=yes + ],[ + ac_cv_alignof_exists=no + ])]) + if test "$ac_cv_alignof_exists" = "yes"; then + AC_DEFINE([HAVE_ALIGNOF], 1, [whether the compiler supports __alignof__]) + fi + + dnl + dnl Check for __attribute__ ((__aligned__)) support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports aligned attribute,ac_cv_attribute_aligned,[ + AC_TRY_COMPILE([ + unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int)))); + ],[ + ac_cv_attribute_aligned=yes + ],[ + ac_cv_attribute_aligned=no + ])]) + if test "$ac_cv_attribute_aligned" = "yes"; then + AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [wheter the compiler supports __attribute__ ((__aligned__))]) + fi + + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5]) AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, 1, [Whether the system supports standard DES salt]) AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, 1, [Whether the system supports BlowFish salt]) Modified: php/php-src/branches/PHP_5_3/ext/standard/crypt_sha256.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/crypt_sha256.c 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/branches/PHP_5_3/ext/standard/crypt_sha256.c 2010-02-09 21:58:13 UTC (rev 294825) @@ -18,6 +18,15 @@ # elif HAVE_STDINT_H # include <stdint.h> # endif +# ifndef HAVE_ALIGNOF +# include <stddef.h> +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif #endif #include <stdio.h> @@ -342,10 +351,8 @@ __declspec(align(32)) unsigned char temp_result[32]; # endif #else - unsigned char alt_result[32] - __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); - unsigned char temp_result[32] - __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); + unsigned char alt_result[32] ALIGNED(__alignof__ (uint32_t)); + unsigned char temp_result[32] ALIGNED(__alignof__ (uint32_t)); #endif struct sha256_ctx ctx; Modified: php/php-src/branches/PHP_5_3/ext/standard/crypt_sha512.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/crypt_sha512.c 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/branches/PHP_5_3/ext/standard/crypt_sha512.c 2010-02-09 21:58:13 UTC (rev 294825) @@ -17,6 +17,15 @@ # elif HAVE_STDINT_H # include <stdint.h> # endif +# ifndef HAVE_ALIGNOF +# include <stddef.h> +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif #endif #include <stdio.h> @@ -370,10 +379,8 @@ __declspec(align(64)) unsigned char temp_result[64]; # endif #else - unsigned char alt_result[64] - __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); - unsigned char temp_result[64] - __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); + unsigned char alt_result[64] ALIGNED(__alignof__ (uint64_t)); + unsigned char temp_result[64] ALIGNED(__alignof__ (uint64_t)); #endif struct sha512_ctx ctx; struct sha512_ctx alt_ctx; Modified: php/php-src/trunk/ext/standard/config.m4 =================================================================== --- php/php-src/trunk/ext/standard/config.m4 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/trunk/ext/standard/config.m4 2010-02-09 21:58:13 UTC (rev 294825) @@ -236,6 +236,41 @@ dnl If one of them is missing, use our own implementation, portable code is then possible dnl if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then + + dnl + dnl Check for __alignof__ support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports __alignof__,ac_cv_alignof_exists,[ + AC_TRY_COMPILE([ +int main() { + int align = __alignof__(int); + return 0; +} + ],[ + ac_cv_alignof_exists=yes + ],[ + ac_cv_alignof_exists=no + ])]) + if test "$ac_cv_alignof_exists" = "yes"; then + AC_DEFINE([HAVE_ALIGNOF], 1, [whether the compiler supports __alignof__]) + fi + + dnl + dnl Check for __attribute__ ((__aligned__)) support in the compiler + dnl + AC_CACHE_CHECK(whether the compiler supports aligned attribute,ac_cv_attribute_aligned,[ + AC_TRY_COMPILE([ + unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int)))); + ],[ + ac_cv_attribute_aligned=yes + ],[ + ac_cv_attribute_aligned=no + ])]) + if test "$ac_cv_attribute_aligned" = "yes"; then + AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [wheter the compiler supports __attribute__ ((__aligned__))]) + fi + + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5]) AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, 1, [Whether the system supports standard DES salt]) AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, 1, [Whether the system supports BlowFish salt]) Modified: php/php-src/trunk/ext/standard/crypt_sha256.c =================================================================== --- php/php-src/trunk/ext/standard/crypt_sha256.c 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/trunk/ext/standard/crypt_sha256.c 2010-02-09 21:58:13 UTC (rev 294825) @@ -18,6 +18,15 @@ # elif HAVE_STDINT_H # include <stdint.h> # endif +# ifndef HAVE_ALIGNOF +# include <stddef.h> +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif #endif #include <stdio.h> @@ -335,10 +344,8 @@ __declspec(align(32)) unsigned char alt_result[32]; __declspec(align(32)) unsigned char temp_result[32]; #else - unsigned char alt_result[32] - __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); - unsigned char temp_result[32] - __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); + unsigned char alt_result[32] ALIGNED(__alignof__ (uint32_t)); + unsigned char temp_result[32] ALIGNED(__alignof__ (uint32_t)); #endif struct sha256_ctx ctx; Modified: php/php-src/trunk/ext/standard/crypt_sha512.c =================================================================== --- php/php-src/trunk/ext/standard/crypt_sha512.c 2010-02-09 21:38:09 UTC (rev 294824) +++ php/php-src/trunk/ext/standard/crypt_sha512.c 2010-02-09 21:58:13 UTC (rev 294825) @@ -17,6 +17,15 @@ # elif HAVE_STDINT_H # include <stdint.h> # endif +# ifndef HAVE_ALIGNOF +# include <stddef.h> +# define __alignof__(type) offsetof (struct { char c; type member;}, member) +# endif +# if HAVE_ATTRIBUTE_ALIGNED +# define ALIGNED(size) __attribute__ ((__aligned__ (size))) +# else +# define ALIGNED(size) +# endif #endif #include <stdio.h> @@ -363,10 +372,8 @@ __declspec(align(64)) unsigned char alt_result[64]; __declspec(align(64)) unsigned char temp_result[64]; #else - unsigned char alt_result[64] - __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); - unsigned char temp_result[64] - __attribute__ ((__aligned__ (__alignof__ (uint64_t)))); + unsigned char alt_result[64] ALIGNED(__alignof__ (uint64_t)); + unsigned char temp_result[64] ALIGNED(__alignof__ (uint64_t)); #endif struct sha512_ctx ctx; struct sha512_ctx alt_ctx;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php