From: Junio C Hamano Date: Fri, 7 Jul 2017 01:14:44 +0000 (-0700) Subject: Merge branch 'ab/sha1dc-maint' X-Git-Tag: v2.14.0-rc0~30 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/cbb8704adb8b6199a220a7b3770437b24cf1d5f8?hp=-c Merge branch 'ab/sha1dc-maint' Update the sha1dc again to fix portability glitches. * ab/sha1dc-maint: sha1dc: update from upstream --- cbb8704adb8b6199a220a7b3770437b24cf1d5f8 diff --combined sha1dc/sha1.c index 3a1735e5ca,d5948826c8..25eded1399 --- a/sha1dc/sha1.c +++ b/sha1dc/sha1.c @@@ -10,6 -10,9 +10,9 @@@ #include #include #include + #ifdef __unix__ + #include /* make sure macros like _BIG_ENDIAN visible */ + #endif #endif #ifdef SHA1DC_CUSTOM_INCLUDE_SHA1_C @@@ -23,6 -26,13 +26,13 @@@ #include "sha1.h" #include "ubc_check.h" + #if (defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || \ + defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__) || \ + defined(__i586__) || defined(__i686__) || defined(_M_IX86) || defined(__X86__) || \ + defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || defined(__INTEL__) || \ + defined(__386) || defined(_M_X64) || defined(_M_AMD64)) + #define SHA1DC_ON_INTEL_LIKE_PROCESSOR + #endif /* Because Little-Endian architectures are most common, @@@ -32,29 -42,70 +42,70 @@@ If you are compiling on a big endian platform and your compiler does not define one of these, you will have to add whatever macros your tool chain defines to indicate Big-Endianness. */ - #ifdef SHA1DC_BIGENDIAN - #undef SHA1DC_BIGENDIAN - #endif - #if (defined(_BYTE_ORDER) || defined(__BYTE_ORDER) || defined(__BYTE_ORDER__)) - - #if ((defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN)) || \ - (defined(__BYTE_ORDER) && (__BYTE_ORDER == __BIG_ENDIAN)) || \ - (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __BIG_ENDIAN__)) ) + #if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) + /* + * Should detect Big Endian under GCC since at least 4.6.0 (gcc svn + * rev #165881). See + * https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html + * + * This also works under clang since 3.2, it copied the GCC-ism. See + * clang.git's 3b198a97d2 ("Preprocessor: add __BYTE_ORDER__ + * predefined macro", 2012-07-27) + */ + #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define SHA1DC_BIGENDIAN #endif - #else - - #if (defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN) || defined(__BIG_ENDIAN__) || \ - defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \ - defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || \ - defined(__sparc)) + /* Not under GCC-alike */ + #elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) + /* + * Should detect Big Endian under glibc.git since 14245eb70e ("entered + * into RCS", 1992-11-25). Defined in which will have been + * brought in by standard headers. See glibc.git and + * https://sourceforge.net/p/predef/wiki/Endianness/ + */ + #if __BYTE_ORDER == __BIG_ENDIAN #define SHA1DC_BIGENDIAN #endif + /* Not under GCC-alike or glibc */ + #elif defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN) + /* + * *BSD and newlib (embeded linux, cygwin, etc). + * the defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN) part prevents + * this condition from matching with Solaris/sparc. + * (Solaris defines only one endian macro) + */ + #if _BYTE_ORDER == _BIG_ENDIAN + #define SHA1DC_BIGENDIAN #endif + /* Not under GCC-alike or glibc or *BSD or newlib */ + #elif (defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || \ + defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || \ + defined(__sparc)) + /* + * Should define Big Endian for a whitelist of known processors. See + * https://sourceforge.net/p/predef/wiki/Endianness/ and + * http://www.oracle.com/technetwork/server-storage/solaris/portingtosolaris-138514.html + */ + #define SHA1DC_BIGENDIAN + + /* Not under GCC-alike or glibc or *BSD or newlib or */ + #elif defined(SHA1DC_ON_INTEL_LIKE_PROCESSOR) + /* + * As a last resort before we do anything else we're not 100% sure + * about below, we blacklist specific processors here. We could add + * more, see e.g. https://wiki.debian.org/ArchitectureSpecificsMemo + */ + #else /* Not under GCC-alike or glibc or *BSD or newlib or or */ + + /* We do nothing more here for now */ + /*#error "Uncomment this to see if you fall through all the detection"*/ + + #endif /* Big Endian detection */ + #if (defined(SHA1DC_FORCE_LITTLEENDIAN) && defined(SHA1DC_BIGENDIAN)) #undef SHA1DC_BIGENDIAN #endif @@@ -63,15 -114,8 +114,8 @@@ #endif /*ENDIANNESS SELECTION*/ - #if (defined SHA1DC_FORCE_UNALIGNED_ACCESS || \ - defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || \ - defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__) || \ - defined(__i586__) || defined(__i686__) || defined(_M_IX86) || defined(__X86__) || \ - defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || defined(__INTEL__) || \ - defined(__386) || defined(_M_X64) || defined(_M_AMD64)) - + #if defined(SHA1DC_FORCE_UNALIGNED_ACCESS) || defined(SHA1DC_ON_INTEL_LIKE_PROCESSOR) #define SHA1DC_ALLOW_UNALIGNED_ACCESS - #endif /*UNALIGNMENT DETECTION*/ @@@ -918,7 -962,7 +962,7 @@@ static void sha1recompress_fast_ ## t ( #ifdef _MSC_VER #pragma warning(push) -#pragma warning(disable: 4127) /* Complier complains about the checks in the above macro being constant. */ +#pragma warning(disable: 4127) /* Compiler complains about the checks in the above macro being constant. */ #endif #ifdef DOSTORESTATE0