diff options
author | drh <drh@noemail.net> | 2017-01-03 17:33:43 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-01-03 17:33:43 +0000 |
commit | 4a47761e0dfa3d62feae632d90c6fb22d1d0df3f (patch) | |
tree | 929b31f84abc6b06686b3ce75b3779bb72a64999 /src/util.c | |
parent | 5c41d00f42c577f54eb78bab974345cc8d92aeac (diff) | |
download | sqlite-4a47761e0dfa3d62feae632d90c6fb22d1d0df3f.tar.gz sqlite-4a47761e0dfa3d62feae632d90c6fb22d1d0df3f.zip |
Make use of the __buildin_OP_overflow() functions from GCC when doing
64-bit signed integer arithmetic.
FossilOrigin-Name: 82cbebb8ee4484f13e5f48d305e20e73063f273e
Diffstat (limited to 'src/util.c')
-rw-r--r-- | src/util.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c index b9684c6c0..4a2266ee6 100644 --- a/src/util.c +++ b/src/util.c @@ -1279,6 +1279,10 @@ int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ ** overflow, leave *pA unchanged and return 1. */ int sqlite3AddInt64(i64 *pA, i64 iB){ +#if !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(__GNUC__) && GCC_VERSION>=5004000 + return __builtin_add_overflow(*pA, iB, pA); +#else i64 iA = *pA; testcase( iA==0 ); testcase( iA==1 ); testcase( iB==-1 ); testcase( iB==0 ); @@ -1293,8 +1297,13 @@ int sqlite3AddInt64(i64 *pA, i64 iB){ } *pA += iB; return 0; +#endif } int sqlite3SubInt64(i64 *pA, i64 iB){ +#if !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(__GNUC__) && GCC_VERSION>=5004000 + return __builtin_sub_overflow(*pA, iB, pA); +#else testcase( iB==SMALLEST_INT64+1 ); if( iB==SMALLEST_INT64 ){ testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); @@ -1304,8 +1313,13 @@ int sqlite3SubInt64(i64 *pA, i64 iB){ }else{ return sqlite3AddInt64(pA, -iB); } +#endif } int sqlite3MulInt64(i64 *pA, i64 iB){ +#if !defined(SQLITE_DISABLE_INTRINSIC) \ + && defined(__GNUC__) && GCC_VERSION>=5004000 + return __builtin_mul_overflow(*pA, iB, pA); +#else i64 iA = *pA; if( iB>0 ){ if( iA>LARGEST_INT64/iB ) return 1; @@ -1321,6 +1335,7 @@ int sqlite3MulInt64(i64 *pA, i64 iB){ } *pA = iA*iB; return 0; +#endif } /* |