Cleanup the usage of the SQLITE_DISABLE_INTRINSIC compile-time option.

Remove the SQLITE_RUNTIME_BYTEORDER compile-time option.  Use
-DSQLITE_BYTEORDER=0 instead.  Fix a bug in R-Tree that occurs when compiling
on a known little-endian machine without the use of intrinsic byteswapping
functions.

FossilOrigin-Name: 798fb9d70d2e5f95e64237b04d6692360133381a
This commit is contained in:
drh 2017-02-09 17:12:22 +00:00
parent ad3b4c078e
commit a39284bfa8
7 changed files with 61 additions and 64 deletions

View File

@ -370,7 +370,7 @@ struct RtreeMatchArg {
/* What version of GCC is being used. 0 means GCC is not being used */ /* What version of GCC is being used. 0 means GCC is not being used */
#ifndef GCC_VERSION #ifndef GCC_VERSION
#ifdef __GNUC__ #if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC)
# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__)
#else #else
# define GCC_VERSION 0 # define GCC_VERSION 0
@ -379,7 +379,7 @@ struct RtreeMatchArg {
/* What version of CLANG is being used. 0 means CLANG is not being used */ /* What version of CLANG is being used. 0 means CLANG is not being used */
#ifndef CLANG_VERSION #ifndef CLANG_VERSION
#if defined(__clang__) && !defined(_WIN32) #if defined(__clang__) && !defined(_WIN32) && !defined(SQLITE_DISABLE_INTRINSIC)
# define CLANG_VERSION \ # define CLANG_VERSION \
(__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__)
#else #else
@ -404,13 +404,12 @@ struct RtreeMatchArg {
** at run-time. ** at run-time.
*/ */
#ifndef SQLITE_BYTEORDER #ifndef SQLITE_BYTEORDER
#if (defined(i386) || defined(__i386__) || defined(_M_IX86) || \ #if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
defined(__arm__)) && !defined(SQLITE_RUNTIME_BYTEORDER) defined(__arm__)
# define SQLITE_BYTEORDER 1234 # define SQLITE_BYTEORDER 1234
#elif (defined(sparc) || defined(__ppc__)) \ #elif defined(sparc) || defined(__ppc__)
&& !defined(SQLITE_RUNTIME_BYTEORDER)
# define SQLITE_BYTEORDER 4321 # define SQLITE_BYTEORDER 4321
#else #else
# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ # define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */
@ -420,7 +419,7 @@ struct RtreeMatchArg {
/* What version of MSVC is being used. 0 means MSVC is not being used */ /* What version of MSVC is being used. 0 means MSVC is not being used */
#ifndef MSVC_VERSION #ifndef MSVC_VERSION
#if defined(_MSC_VER) #if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC)
# define MSVC_VERSION _MSC_VER # define MSVC_VERSION _MSC_VER
#else #else
# define MSVC_VERSION 0 # define MSVC_VERSION 0
@ -440,9 +439,6 @@ static void readCoord(u8 *p, RtreeCoord *pCoord){
pCoord->u = _byteswap_ulong(*(u32*)p); pCoord->u = _byteswap_ulong(*(u32*)p);
#elif SQLITE_BYTEORDER==1234 && (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000) #elif SQLITE_BYTEORDER==1234 && (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000)
pCoord->u = __builtin_bswap32(*(u32*)p); pCoord->u = __builtin_bswap32(*(u32*)p);
#elif SQLITE_BYTEORDER==1234
pCoord->u = ((pCoord->u>>24)&0xff)|((pCoord->u>>8)&0xff00)|
((pCoord->u&0xff)<<24)|((pCoord->u&0xff00)<<8);
#elif SQLITE_BYTEORDER==4321 #elif SQLITE_BYTEORDER==4321
pCoord->u = *(u32*)p; pCoord->u = *(u32*)p;
#else #else
@ -486,10 +482,9 @@ static i64 readInt64(u8 *p){
** 64 bit integer. The value returned is the number of bytes written ** 64 bit integer. The value returned is the number of bytes written
** to the argument buffer (always 2, 4 and 8 respectively). ** to the argument buffer (always 2, 4 and 8 respectively).
*/ */
static int writeInt16(u8 *p, int i){ static void writeInt16(u8 *p, int i){
p[0] = (i>> 8)&0xFF; p[0] = (i>> 8)&0xFF;
p[1] = (i>> 0)&0xFF; p[1] = (i>> 0)&0xFF;
return 2;
} }
static int writeCoord(u8 *p, RtreeCoord *pCoord){ static int writeCoord(u8 *p, RtreeCoord *pCoord){
u32 i; u32 i;

View File

@ -1,5 +1,5 @@
C Avoid\spreparing\sa\sSELECT\sstatement\seach\stime\san\sUPDATE\sor\sDELETE\sby\sdocid\sis\nexecuted\sagainst\san\sfts3\stable. C Cleanup\sthe\susage\sof\sthe\sSQLITE_DISABLE_INTRINSIC\scompile-time\soption.\nRemove\sthe\sSQLITE_RUNTIME_BYTEORDER\scompile-time\soption.\s\sUse\n-DSQLITE_BYTEORDER=0\sinstead.\s\sFix\sa\sbug\sin\sR-Tree\sthat\soccurs\swhen\scompiling\non\sa\sknown\slittle-endian\smachine\swithout\sthe\suse\sof\sintrinsic\sbyteswapping\nfunctions.
D 2017-02-08T19:12:36.968 D 2017-02-09T17:12:22.122
F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 067a6766f800cc8d72845ab61f8de4ffe8f3fc99 F Makefile.msc 067a6766f800cc8d72845ab61f8de4ffe8f3fc99
@ -264,7 +264,7 @@ F ext/rbu/sqlite3rbu.c bb0de6cdbdb14a7d55a097238a434b7e99caf318
F ext/rbu/sqlite3rbu.h 6fb6294c34a9ca93b5894a33bca530c6f08decba F ext/rbu/sqlite3rbu.h 6fb6294c34a9ca93b5894a33bca530c6f08decba
F ext/rbu/test_rbu.c 5aa22616afac6f71ebd3d9bc9bf1006cfabcca88 F ext/rbu/test_rbu.c 5aa22616afac6f71ebd3d9bc9bf1006cfabcca88
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
F ext/rtree/rtree.c d92be99e3a662e1934658201f0fc7ad51b44325a F ext/rtree/rtree.c 358796a385de74e40ed66c103df77ba3c2e98fab
F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e
F ext/rtree/rtree1.test 42dadfc7b44a436cd74a1bebc0b9b689e4eaf7ec F ext/rtree/rtree1.test 42dadfc7b44a436cd74a1bebc0b9b689e4eaf7ec
F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba
@ -339,7 +339,7 @@ F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca
F src/btree.c 9fe65ab418d99e80289f024016b5e5e74c3059dd F src/btree.c 9fe65ab418d99e80289f024016b5e5e74c3059dd
F src/btree.h e6d352808956ec163a17f832193a3e198b3fb0ac F src/btree.h e6d352808956ec163a17f832193a3e198b3fb0ac
F src/btreeInt.h 10c4b77c2fb399580babbcc7cf652ac10dba796e F src/btreeInt.h 429bbfebae05ab3beb1c4508ba94c292036c660f
F src/build.c 9e799f1edd910dfa8a0bc29bd390d35d310596af F src/build.c 9e799f1edd910dfa8a0bc29bd390d35d310596af
F src/callback.c 2e76147783386374bf01b227f752c81ec872d730 F src/callback.c 2e76147783386374bf01b227f752c81ec872d730
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
@ -372,7 +372,7 @@ F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
F src/mutex_unix.c 27bb6cc49485ee46711a6580ab7b3f1402211d23 F src/mutex_unix.c 27bb6cc49485ee46711a6580ab7b3f1402211d23
F src/mutex_w32.c 5e6fe1c298fb5a8a15aaed4161d5759311431c17 F src/mutex_w32.c 00bbf37d80fb763a8159b83cc3cbde0f91d37f7b
F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7
F src/os.c add02933b1dce7a39a005b00a2f5364b763e9a24 F src/os.c add02933b1dce7a39a005b00a2f5364b763e9a24
F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343 F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343
@ -399,7 +399,7 @@ F src/shell.c a84e453c213f3e0d6935a582024da4e242f85a19
F src/sqlite.h.in 751ff125eb159c8f92c182b8df980a5e4f50e966 F src/sqlite.h.in 751ff125eb159c8f92c182b8df980a5e4f50e966
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae F src/sqlite3ext.h 8648034aa702469afb553231677306cc6492a1ae
F src/sqliteInt.h 3724c48e82605b471bbf7e41109b5850c6e89f31 F src/sqliteInt.h 4dc66ec1948765f151899333f7a55267d807d099
F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247 F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@ -459,7 +459,7 @@ F src/treeview.c 4e44ade3bfe59d82005039f72e09333ce2b4162c
F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182 F src/trigger.c c9f0810043b265724fdb1bdd466894f984dfc182
F src/update.c 456d4a4656f8a03c2abc88a51b19172197400e58 F src/update.c 456d4a4656f8a03c2abc88a51b19172197400e58
F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c
F src/util.c a88b0466fddf445ce752226d4698ca3faada620a F src/util.c 3d2ce209a89b95cf35bffa16440f57368576e2ee
F src/vacuum.c 33c174b28886b2faf26e503b5a49a1c01a9b1c16 F src/vacuum.c 33c174b28886b2faf26e503b5a49a1c01a9b1c16
F src/vdbe.c e7b1e860140f1d1803c6f4176b1e8f3801f3a290 F src/vdbe.c e7b1e860140f1d1803c6f4176b1e8f3801f3a290
F src/vdbe.h 59998ffd71d7caa8886bc78dafaf8caeccd4c13c F src/vdbe.h 59998ffd71d7caa8886bc78dafaf8caeccd4c13c
@ -1555,7 +1555,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P c09dd5c0befaf5028abfead8114bd74a30ffe5d4 9962c10a5c6672bd82b2bf640d878fcdac0b815a P 1afec5758b624e6a066d4e7ef50695095e9d7ff1
R fbd7643b7e0c4a3c885d2a6aeb5fecfa R d99a1e96a3817ca7543fc882a1f70881
U dan U drh
Z a7e2195607498eebba62ce2716ddc0de Z 871c0b5ab0829dba2d37da91622734c8

View File

@ -1 +1 @@
1afec5758b624e6a066d4e7ef50695095e9d7ff1 798fb9d70d2e5f95e64237b04d6692360133381a

View File

@ -692,11 +692,9 @@ struct IntegrityCk {
*/ */
#if SQLITE_BYTEORDER==4321 #if SQLITE_BYTEORDER==4321
# define get2byteAligned(x) (*(u16*)(x)) # define get2byteAligned(x) (*(u16*)(x))
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4008000
&& GCC_VERSION>=4008000
# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x)) # define get2byteAligned(x) __builtin_bswap16(*(u16*)(x))
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && MSCV_VERSION>=1300
&& defined(_MSC_VER) && _MSC_VER>=1300
# define get2byteAligned(x) _byteswap_ushort(*(u16*)(x)) # define get2byteAligned(x) _byteswap_ushort(*(u16*)(x))
#else #else
# define get2byteAligned(x) ((x)[0]<<8 | (x)[1]) # define get2byteAligned(x) ((x)[0]<<8 | (x)[1])

View File

@ -87,8 +87,7 @@ void sqlite3MemoryBarrier(void){
SQLITE_MEMORY_BARRIER; SQLITE_MEMORY_BARRIER;
#elif defined(__GNUC__) #elif defined(__GNUC__)
__sync_synchronize(); __sync_synchronize();
#elif !defined(SQLITE_DISABLE_INTRINSIC) && \ #elif MSCV_VERSION>=1300
defined(_MSC_VER) && _MSC_VER>=1300
_ReadWriteBarrier(); _ReadWriteBarrier();
#elif defined(MemoryBarrier) #elif defined(MemoryBarrier)
MemoryBarrier(); MemoryBarrier();

View File

@ -103,20 +103,28 @@
# define _LARGEFILE_SOURCE 1 # define _LARGEFILE_SOURCE 1
#endif #endif
/* What version of GCC is being used. 0 means GCC is not being used */ /* The GCC_VERSION, CLANG_VERSION, and MSVC_VERSION macros are used to
#ifdef __GNUC__ ** conditionally include optimizations for each of these compilers. A
** value of 0 means that compiler is not being used. The
** SQLITE_DISABLE_INTRINSIC macro means do not use any compiler-specific
** optimizations, and hence set all compiler macros to 0
*/
#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC)
# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__)
#else #else
# define GCC_VERSION 0 # define GCC_VERSION 0
#endif #endif
#if defined(__clang__) && !defined(_WIN32) && !defined(SQLITE_DISABLE_INTRINSIC)
/* What version of CLANG is being used. 0 means CLANG is not being used */
#if defined(__clang__) && !defined(_WIN32)
# define CLANG_VERSION \ # define CLANG_VERSION \
(__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__)
#else #else
# define CLANG_VERSION 0 # define CLANG_VERSION 0
#endif #endif
#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC)
# define MSVC_VERSION _MSC_VER
#else
# define MSVC_VERSION 0
#endif
/* Needed for various definitions... */ /* Needed for various definitions... */
#if defined(__GNUC__) && !defined(_GNU_SOURCE) #if defined(__GNUC__) && !defined(_GNU_SOURCE)
@ -247,6 +255,7 @@
# include <intrin.h> # include <intrin.h>
# pragma intrinsic(_byteswap_ushort) # pragma intrinsic(_byteswap_ushort)
# pragma intrinsic(_byteswap_ulong) # pragma intrinsic(_byteswap_ulong)
# pragma intrinsic(_byteswap_uint64)
# pragma intrinsic(_ReadWriteBarrier) # pragma intrinsic(_ReadWriteBarrier)
# else # else
# include <cmnintrin.h> # include <cmnintrin.h>
@ -787,32 +796,35 @@ typedef INT16_TYPE LogEst;
** **
** For best performance, an attempt is made to guess at the byte-order ** For best performance, an attempt is made to guess at the byte-order
** using C-preprocessor macros. If that is unsuccessful, or if ** using C-preprocessor macros. If that is unsuccessful, or if
** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined ** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined
** at run-time. ** at run-time.
*/ */
#if (defined(i386) || defined(__i386__) || defined(_M_IX86) || \ #ifndef SQLITE_BYTEORDER
# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \
defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \
defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \
defined(__arm__)) && !defined(SQLITE_RUNTIME_BYTEORDER) defined(__arm__)
# define SQLITE_BYTEORDER 1234 # define SQLITE_BYTEORDER 1234
# define SQLITE_BIGENDIAN 0 # elif defined(sparc) || defined(__ppc__)
# define SQLITE_LITTLEENDIAN 1 # define SQLITE_BYTEORDER 4321
# define SQLITE_UTF16NATIVE SQLITE_UTF16LE # else
# define SQLITE_BYTEORDER 0
# endif
#endif #endif
#if (defined(sparc) || defined(__ppc__)) \ #if SQLITE_BYTEORDER==4321
&& !defined(SQLITE_RUNTIME_BYTEORDER)
# define SQLITE_BYTEORDER 4321
# define SQLITE_BIGENDIAN 1 # define SQLITE_BIGENDIAN 1
# define SQLITE_LITTLEENDIAN 0 # define SQLITE_LITTLEENDIAN 0
# define SQLITE_UTF16NATIVE SQLITE_UTF16BE # define SQLITE_UTF16NATIVE SQLITE_UTF16BE
#endif #elif SQLITE_BYTEORDER==1234
#if !defined(SQLITE_BYTEORDER) # define SQLITE_BIGENDIAN 0
# define SQLITE_LITTLEENDIAN 1
# define SQLITE_UTF16NATIVE SQLITE_UTF16LE
#else
# ifdef SQLITE_AMALGAMATION # ifdef SQLITE_AMALGAMATION
const int sqlite3one = 1; const int sqlite3one = 1;
# else # else
extern const int sqlite3one; extern const int sqlite3one;
# endif # endif
# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */
# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) # define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0)
# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) # define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1)
# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) # define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE)

View File

@ -1140,13 +1140,11 @@ u32 sqlite3Get4byte(const u8 *p){
u32 x; u32 x;
memcpy(&x,p,4); memcpy(&x,p,4);
return x; return x;
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000)
&& (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000)
u32 x; u32 x;
memcpy(&x,p,4); memcpy(&x,p,4);
return __builtin_bswap32(x); return __builtin_bswap32(x);
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
&& defined(_MSC_VER) && _MSC_VER>=1300
u32 x; u32 x;
memcpy(&x,p,4); memcpy(&x,p,4);
return _byteswap_ulong(x); return _byteswap_ulong(x);
@ -1158,12 +1156,10 @@ u32 sqlite3Get4byte(const u8 *p){
void sqlite3Put4byte(unsigned char *p, u32 v){ void sqlite3Put4byte(unsigned char *p, u32 v){
#if SQLITE_BYTEORDER==4321 #if SQLITE_BYTEORDER==4321
memcpy(p,&v,4); memcpy(p,&v,4);
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000)
&& (GCC_VERSION>=4003000 || CLANG_VERSION>=3000000)
u32 x = __builtin_bswap32(v); u32 x = __builtin_bswap32(v);
memcpy(p,&x,4); memcpy(p,&x,4);
#elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \ #elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300
&& defined(_MSC_VER) && _MSC_VER>=1300
u32 x = _byteswap_ulong(v); u32 x = _byteswap_ulong(v);
memcpy(p,&x,4); memcpy(p,&x,4);
#else #else
@ -1279,8 +1275,7 @@ int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
** overflow, leave *pA unchanged and return 1. ** overflow, leave *pA unchanged and return 1.
*/ */
int sqlite3AddInt64(i64 *pA, i64 iB){ int sqlite3AddInt64(i64 *pA, i64 iB){
#if !defined(SQLITE_DISABLE_INTRINSIC) \ #if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
&& (GCC_VERSION>=5004000 || CLANG_VERSION>=4000000)
return __builtin_add_overflow(*pA, iB, pA); return __builtin_add_overflow(*pA, iB, pA);
#else #else
i64 iA = *pA; i64 iA = *pA;
@ -1300,8 +1295,7 @@ int sqlite3AddInt64(i64 *pA, i64 iB){
#endif #endif
} }
int sqlite3SubInt64(i64 *pA, i64 iB){ int sqlite3SubInt64(i64 *pA, i64 iB){
#if !defined(SQLITE_DISABLE_INTRINSIC) \ #if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
&& (GCC_VERSION>=5004000 || CLANG_VERSION>=4000000)
return __builtin_sub_overflow(*pA, iB, pA); return __builtin_sub_overflow(*pA, iB, pA);
#else #else
testcase( iB==SMALLEST_INT64+1 ); testcase( iB==SMALLEST_INT64+1 );
@ -1316,8 +1310,7 @@ int sqlite3SubInt64(i64 *pA, i64 iB){
#endif #endif
} }
int sqlite3MulInt64(i64 *pA, i64 iB){ int sqlite3MulInt64(i64 *pA, i64 iB){
#if !defined(SQLITE_DISABLE_INTRINSIC) \ #if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
&& (GCC_VERSION>=5004000 || CLANG_VERSION>=4000000)
return __builtin_mul_overflow(*pA, iB, pA); return __builtin_mul_overflow(*pA, iB, pA);
#else #else
i64 iA = *pA; i64 iA = *pA;