diff --git a/share/libc/__fc_gcc_builtins.h b/share/libc/__fc_gcc_builtins.h index df845fa24bd02f32bb687b907bf774776ff084f2..aef4f536c808adcd12ea9bfdbc82d645e3d81418 100644 --- a/share/libc/__fc_gcc_builtins.h +++ b/share/libc/__fc_gcc_builtins.h @@ -26,6 +26,7 @@ #ifndef __FC_GCC_BUILTINS #define __FC_GCC_BUILTINS #include "features.h" +#include "__fc_machdep.h" __PUSH_FC_STDLIB @@ -193,6 +194,66 @@ _Bool __builtin_umull_overflow (unsigned long a, unsigned long b, unsigned long */ _Bool __builtin_umulll_overflow (unsigned long long a, unsigned long long b, unsigned long long *res); +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_clz (unsigned int x); + +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_clzl (unsigned long x); + +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_clzll (unsigned long long x); + +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_ctz (unsigned int x); + +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_ctzl (unsigned long x); + +/*@ + requires x_nonzero: x != 0; + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result < __CHAR_BIT * sizeof(x); + */ +int __builtin_ctzll (unsigned long long x); + +/*@ + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result <= __CHAR_BIT * sizeof(x); + */ +int __builtin_popcount (unsigned int x); + +/*@ + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result <= __CHAR_BIT * sizeof(x); + */ +int __builtin_popcountl (unsigned long x); + +/*@ + assigns \result \from indirect:x; + ensures result_is_bit_count: 0 <= \result <= __CHAR_BIT * sizeof(x); + */ +int __builtin_popcountll (unsigned long long x); + __END_DECLS __POP_FC_STDLIB diff --git a/share/libc/__fc_machdep.h b/share/libc/__fc_machdep.h index 6411df164b8ce1a9ac78aa3eabb30942dcf41e0e..39a8c7b78a436263450fdc5f9e7ffa35ccdfcdf7 100644 --- a/share/libc/__fc_machdep.h +++ b/share/libc/__fc_machdep.h @@ -26,9 +26,6 @@ #if defined(__FC_MACHDEP_X86_32) || defined(__FC_MACHDEP_GCC_X86_32) #define __FC_FORCE_INCLUDE_MACHDEP__ #include "__fc_machdep_linux_shared.h" -#ifdef __FC_MACHDEP_GCC_X86_32 -#include "__fc_gcc_builtins.h" -#endif #undef __FC_FORCE_INCLUDE_MACHDEP__ #define __FC_BYTE_ORDER __LITTLE_ENDIAN /* Required */ @@ -112,14 +109,15 @@ #define __FC_WINT_MIN 0 #define __FC_WINT_MAX __FC_UINT_MAX +#ifdef __FC_MACHDEP_GCC_X86_32 +#include "__fc_gcc_builtins.h" +#endif + // End of X86_32 || GCC_X86_32 #else #if defined(__FC_MACHDEP_X86_64) || defined(__FC_MACHDEP_GCC_X86_64) #define __FC_FORCE_INCLUDE_MACHDEP__ #include "__fc_machdep_linux_shared.h" -#ifdef __FC_MACHDEP_GCC_X86_64 -#include "__fc_gcc_builtins.h" -#endif #undef __FC_FORCE_INCLUDE_MACHDEP__ #define __FC_BYTE_ORDER __LITTLE_ENDIAN /* Required */ @@ -212,14 +210,15 @@ #define __FC_WINT_MIN 0 #define __FC_WINT_MAX __FC_UINT_MAX +#ifdef __FC_MACHDEP_GCC_X86_64 +#include "__fc_gcc_builtins.h" +#endif + // End of X86_64 || GCC_X86_64 #else #if defined(__FC_MACHDEP_X86_16) || defined(__FC_MACHDEP_GCC_X86_16) #define __FC_FORCE_INCLUDE_MACHDEP__ #include "__fc_machdep_linux_shared.h" -#ifdef __FC_MACHDEP_GCC_X86_16 -#include "__fc_gcc_builtins.h" -#endif #undef __FC_FORCE_INCLUDE_MACHDEP__ #define __FC_BYTE_ORDER __LITTLE_ENDIAN /* Required */ @@ -315,6 +314,10 @@ #define __FC_WINT_MIN 0 #define __FC_WINT_MAX __FC_ULONG_MAX +#ifdef __FC_MACHDEP_GCC_X86_16 +#include "__fc_gcc_builtins.h" +#endif + // End of X86_16 || GCC_X86_16 #else #ifdef __FC_MACHDEP_PPC_32 diff --git a/src/kernel_services/ast_queries/cil.ml b/src/kernel_services/ast_queries/cil.ml index e8ae6d486057747ea1dcc2ea5e5b18d52fd7756c..544e912ca692472f847d2aa060ffd96c604f2c19 100644 --- a/src/kernel_services/ast_queries/cil.ml +++ b/src/kernel_services/ast_queries/cil.ml @@ -4994,13 +4994,7 @@ let initGccBuiltins () : unit = add "coshf" floatType [ floatType ] false; add "coshl" longDoubleType [ longDoubleType ] false; - add "clz" intType [ uintType ] false; - add "clzl" intType [ ulongType ] false; - add "clzll" intType [ ulongLongType ] false; add "constant_p" intType [ intType ] false; - add "ctz" intType [ uintType ] false; - add "ctzl" intType [ ulongType ] false; - add "ctzll" intType [ ulongLongType ] false; add "exp" doubleType [ doubleType ] false; add "expf" floatType [ floatType ] false; @@ -5071,10 +5065,6 @@ let initGccBuiltins () : unit = add "parityl" intType [ ulongType ] false; add "parityll" intType [ ulongLongType ] false; - add "popcount" intType [ uintType ] false; - add "popcountl" intType [ ulongType ] false; - add "popcountll" intType [ ulongLongType ] false; - add "powi" doubleType [ doubleType; intType ] false; add "powif" floatType [ floatType; intType ] false; add "powil" longDoubleType [ longDoubleType; intType ] false; diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c index 42381d641e8bc28066722d4c81e162c4763744cd..8a80b25247831cfca43226478f5dced6e8568b54 100644 --- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c +++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions.c @@ -232,61 +232,6 @@ void __gen_e_acsl_k(int x) return; } -int __gen_e_acsl_h_short(int s) -{ - return s; -} - -int __gen_e_acsl_g_hidden(int x) -{ - return x; -} - -double __gen_e_acsl_f2(double x) -{ - __e_acsl_mpq_t __gen_e_acsl__8; - __e_acsl_mpq_t __gen_e_acsl__9; - __e_acsl_mpq_t __gen_e_acsl_div; - double __gen_e_acsl__10; - __gmpq_init(__gen_e_acsl__8); - __gmpq_set_str(__gen_e_acsl__8,"1",10); - __gmpq_init(__gen_e_acsl__9); - __gmpq_set_d(__gen_e_acsl__9,x); - __gmpq_init(__gen_e_acsl_div); - __gmpq_div(__gen_e_acsl_div,(__e_acsl_mpq_struct const *)(__gen_e_acsl__8), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__9)); - __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); - __gmpq_clear(__gen_e_acsl__8); - __gmpq_clear(__gen_e_acsl__9); - __gmpq_clear(__gen_e_acsl_div); - /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */ - return __gen_e_acsl__10; -} - -int __gen_e_acsl_g(int x) -{ - int __gen_e_acsl_g_hidden_2; - __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); - return __gen_e_acsl_g_hidden_2; -} - -mystruct __gen_e_acsl_t1(mystruct m) -{ - return m; -} - -int __gen_e_acsl_p1(int x, int y) -{ - int __retres = x + (long)y > 0L; - return __retres; -} - -long __gen_e_acsl_t2(mystruct m) -{ - long __retres = m.k + (long)m.l; - return __retres; -} - int __gen_e_acsl_p2(int x, int y) { int __retres = x + (long)y > 0L; @@ -384,4 +329,59 @@ int __gen_e_acsl_h_char(int c) return c; } +int __gen_e_acsl_h_short(int s) +{ + return s; +} + +int __gen_e_acsl_g_hidden(int x) +{ + return x; +} + +double __gen_e_acsl_f2(double x) +{ + __e_acsl_mpq_t __gen_e_acsl__8; + __e_acsl_mpq_t __gen_e_acsl__9; + __e_acsl_mpq_t __gen_e_acsl_div; + double __gen_e_acsl__10; + __gmpq_init(__gen_e_acsl__8); + __gmpq_set_str(__gen_e_acsl__8,"1",10); + __gmpq_init(__gen_e_acsl__9); + __gmpq_set_d(__gen_e_acsl__9,x); + __gmpq_init(__gen_e_acsl_div); + __gmpq_div(__gen_e_acsl_div,(__e_acsl_mpq_struct const *)(__gen_e_acsl__8), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__9)); + __gen_e_acsl__10 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); + __gmpq_clear(__gen_e_acsl__8); + __gmpq_clear(__gen_e_acsl__9); + __gmpq_clear(__gen_e_acsl_div); + /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__10); */ + return __gen_e_acsl__10; +} + +int __gen_e_acsl_g(int x) +{ + int __gen_e_acsl_g_hidden_2; + __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); + return __gen_e_acsl_g_hidden_2; +} + +mystruct __gen_e_acsl_t1(mystruct m) +{ + return m; +} + +int __gen_e_acsl_p1(int x, int y) +{ + int __retres = x + (long)y > 0L; + return __retres; +} + +long __gen_e_acsl_t2(mystruct m) +{ + long __retres = m.k + (long)m.l; + return __retres; +} + diff --git a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c index b9015c95933c865e01c9d365c7a3b2c73c8c4a4f..d7e6ba9cda321e94b0312fcf67ef5007ba3a8486 100644 --- a/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c +++ b/src/plugins/e-acsl/tests/arith/oracle_ci/gen_functions_rec.c @@ -105,6 +105,88 @@ int main(void) return __retres; } +int __gen_e_acsl_g(int n) +{ + int __retres = 0; + return __retres; +} + +int __gen_e_acsl_g_5(long n) +{ + int __retres = 0; + return __retres; +} + +int __gen_e_acsl_f3(int n) +{ + int __gen_e_acsl_if_6; + if (n > 0) { + int __gen_e_acsl_g_2; + int __gen_e_acsl_f3_5; + __gen_e_acsl_g_2 = __gen_e_acsl_g(n); + __gen_e_acsl_f3_5 = __gen_e_acsl_f3_2(n - 1L); + __gen_e_acsl_if_6 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_5 - 5; + } + else { + int __gen_e_acsl_g_8; + __gen_e_acsl_g_8 = __gen_e_acsl_g_5(n + 1L); + __gen_e_acsl_if_6 = __gen_e_acsl_g_8; + } + return __gen_e_acsl_if_6; +} + +int __gen_e_acsl_f3_2(long n) +{ + int __gen_e_acsl_if_5; + if (n > 0L) { + int __gen_e_acsl_g_4; + int __gen_e_acsl_f3_4; + __gen_e_acsl_g_4 = __gen_e_acsl_g((int)n); + __gen_e_acsl_f3_4 = __gen_e_acsl_f3_2(n - 1L); + __gen_e_acsl_if_5 = __gen_e_acsl_g_4 * __gen_e_acsl_f3_4 - 5; + } + else { + int __gen_e_acsl_g_6; + __gen_e_acsl_g_6 = __gen_e_acsl_g_5(n + 1L); + __gen_e_acsl_if_5 = __gen_e_acsl_g_6; + } + return __gen_e_acsl_if_5; +} + +unsigned long __gen_e_acsl_f4(int n) +{ + unsigned long __gen_e_acsl_if_10; + if (n < 100) { + unsigned long __gen_e_acsl_f4_5; + __gen_e_acsl_f4_5 = __gen_e_acsl_f4_2(n + 1L); + __gen_e_acsl_if_10 = __gen_e_acsl_f4_5; + } + else { + unsigned long __gen_e_acsl_if_9; + if ((long)n < 9223372036854775807L) __gen_e_acsl_if_9 = 9223372036854775807UL; + else __gen_e_acsl_if_9 = 6UL; + __gen_e_acsl_if_10 = __gen_e_acsl_if_9; + } + return __gen_e_acsl_if_10; +} + +unsigned long __gen_e_acsl_f4_2(long n) +{ + unsigned long __gen_e_acsl_if_8; + if (n < 100L) { + unsigned long __gen_e_acsl_f4_4; + __gen_e_acsl_f4_4 = __gen_e_acsl_f4_2(n + 1L); + __gen_e_acsl_if_8 = __gen_e_acsl_f4_4; + } + else { + unsigned long __gen_e_acsl_if_7; + if (n < 9223372036854775807L) __gen_e_acsl_if_7 = 9223372036854775807UL; + else __gen_e_acsl_if_7 = 6UL; + __gen_e_acsl_if_8 = __gen_e_acsl_if_7; + } + return __gen_e_acsl_if_8; +} + void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int n) { __e_acsl_mpz_t __gen_e_acsl_if_2; @@ -235,86 +317,4 @@ int __gen_e_acsl_f2_2(long n) return __gen_e_acsl_if_3; } -int __gen_e_acsl_g(int n) -{ - int __retres = 0; - return __retres; -} - -int __gen_e_acsl_g_5(long n) -{ - int __retres = 0; - return __retres; -} - -int __gen_e_acsl_f3(int n) -{ - int __gen_e_acsl_if_6; - if (n > 0) { - int __gen_e_acsl_g_2; - int __gen_e_acsl_f3_5; - __gen_e_acsl_g_2 = __gen_e_acsl_g(n); - __gen_e_acsl_f3_5 = __gen_e_acsl_f3_2(n - 1L); - __gen_e_acsl_if_6 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_5 - 5; - } - else { - int __gen_e_acsl_g_8; - __gen_e_acsl_g_8 = __gen_e_acsl_g_5(n + 1L); - __gen_e_acsl_if_6 = __gen_e_acsl_g_8; - } - return __gen_e_acsl_if_6; -} - -int __gen_e_acsl_f3_2(long n) -{ - int __gen_e_acsl_if_5; - if (n > 0L) { - int __gen_e_acsl_g_4; - int __gen_e_acsl_f3_4; - __gen_e_acsl_g_4 = __gen_e_acsl_g((int)n); - __gen_e_acsl_f3_4 = __gen_e_acsl_f3_2(n - 1L); - __gen_e_acsl_if_5 = __gen_e_acsl_g_4 * __gen_e_acsl_f3_4 - 5; - } - else { - int __gen_e_acsl_g_6; - __gen_e_acsl_g_6 = __gen_e_acsl_g_5(n + 1L); - __gen_e_acsl_if_5 = __gen_e_acsl_g_6; - } - return __gen_e_acsl_if_5; -} - -unsigned long __gen_e_acsl_f4(int n) -{ - unsigned long __gen_e_acsl_if_10; - if (n < 100) { - unsigned long __gen_e_acsl_f4_5; - __gen_e_acsl_f4_5 = __gen_e_acsl_f4_2(n + 1L); - __gen_e_acsl_if_10 = __gen_e_acsl_f4_5; - } - else { - unsigned long __gen_e_acsl_if_9; - if ((long)n < 9223372036854775807L) __gen_e_acsl_if_9 = 9223372036854775807UL; - else __gen_e_acsl_if_9 = 6UL; - __gen_e_acsl_if_10 = __gen_e_acsl_if_9; - } - return __gen_e_acsl_if_10; -} - -unsigned long __gen_e_acsl_f4_2(long n) -{ - unsigned long __gen_e_acsl_if_8; - if (n < 100L) { - unsigned long __gen_e_acsl_f4_4; - __gen_e_acsl_f4_4 = __gen_e_acsl_f4_2(n + 1L); - __gen_e_acsl_if_8 = __gen_e_acsl_f4_4; - } - else { - unsigned long __gen_e_acsl_if_7; - if (n < 9223372036854775807L) __gen_e_acsl_if_7 = 9223372036854775807UL; - else __gen_e_acsl_if_7 = 6UL; - __gen_e_acsl_if_8 = __gen_e_acsl_if_7; - } - return __gen_e_acsl_if_8; -} - diff --git a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c index 2bdf4cd9f28dee2f151cd9ff921dc647cbbcff9d..91010d0c7a4cd82b480d4e6cbf53122b5e49ce5b 100644 --- a/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c +++ b/src/plugins/e-acsl/tests/gmp-only/oracle_ci/gen_functions.c @@ -277,92 +277,6 @@ void __gen_e_acsl_k(int x) return; } -int __gen_e_acsl_h_short(int s) -{ - return s; -} - -int __gen_e_acsl_g_hidden(int x) -{ - return x; -} - -double __gen_e_acsl_f2(double x) -{ - __e_acsl_mpq_t __gen_e_acsl__13; - __e_acsl_mpq_t __gen_e_acsl__14; - __e_acsl_mpq_t __gen_e_acsl_div; - double __gen_e_acsl__15; - __gmpq_init(__gen_e_acsl__13); - __gmpq_set_str(__gen_e_acsl__13,"1",10); - __gmpq_init(__gen_e_acsl__14); - __gmpq_set_d(__gen_e_acsl__14,x); - __gmpq_init(__gen_e_acsl_div); - __gmpq_div(__gen_e_acsl_div, - (__e_acsl_mpq_struct const *)(__gen_e_acsl__13), - (__e_acsl_mpq_struct const *)(__gen_e_acsl__14)); - __gen_e_acsl__15 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); - __gmpq_clear(__gen_e_acsl__13); - __gmpq_clear(__gen_e_acsl__14); - __gmpq_clear(__gen_e_acsl_div); - /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__15); */ - return __gen_e_acsl__15; -} - -int __gen_e_acsl_g(int x) -{ - int __gen_e_acsl_g_hidden_2; - __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); - return __gen_e_acsl_g_hidden_2; -} - -mystruct __gen_e_acsl_t1(mystruct m) -{ - return m; -} - -int __gen_e_acsl_p1(int x, int y) -{ - __e_acsl_mpz_t __gen_e_acsl_x; - __e_acsl_mpz_t __gen_e_acsl_y; - __e_acsl_mpz_t __gen_e_acsl_add; - __e_acsl_mpz_t __gen_e_acsl_; - int __gen_e_acsl_gt; - __gmpz_init_set_si(__gen_e_acsl_x,(long)x); - __gmpz_init_set_si(__gen_e_acsl_y,(long)y); - __gmpz_init(__gen_e_acsl_add); - __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); - __gmpz_init_set_si(__gen_e_acsl_,0L); - __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add), - (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); - int __retres = __gen_e_acsl_gt > 0; - __gmpz_clear(__gen_e_acsl_x); - __gmpz_clear(__gen_e_acsl_y); - __gmpz_clear(__gen_e_acsl_add); - __gmpz_clear(__gen_e_acsl_); - return __retres; -} - -void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m) -{ - __e_acsl_mpz_t __gen_e_acsl__10; - __e_acsl_mpz_t __gen_e_acsl__11; - __e_acsl_mpz_t __gen_e_acsl_add_7; - __gmpz_init_set_si(__gen_e_acsl__10,(long)m.k); - __gmpz_init_set_si(__gen_e_acsl__11,(long)m.l); - __gmpz_init(__gen_e_acsl_add_7); - __gmpz_add(__gen_e_acsl_add_7, - (__e_acsl_mpz_struct const *)(__gen_e_acsl__10), - (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); - __gmpz_init_set(*__retres_arg, - (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_7)); - __gmpz_clear(__gen_e_acsl__10); - __gmpz_clear(__gen_e_acsl__11); - __gmpz_clear(__gen_e_acsl_add_7); - return; -} - int __gen_e_acsl_p2(int x, int y) { __e_acsl_mpz_t __gen_e_acsl_x_2; @@ -477,4 +391,90 @@ int __gen_e_acsl_h_char(int c) return c; } +int __gen_e_acsl_h_short(int s) +{ + return s; +} + +int __gen_e_acsl_g_hidden(int x) +{ + return x; +} + +double __gen_e_acsl_f2(double x) +{ + __e_acsl_mpq_t __gen_e_acsl__13; + __e_acsl_mpq_t __gen_e_acsl__14; + __e_acsl_mpq_t __gen_e_acsl_div; + double __gen_e_acsl__15; + __gmpq_init(__gen_e_acsl__13); + __gmpq_set_str(__gen_e_acsl__13,"1",10); + __gmpq_init(__gen_e_acsl__14); + __gmpq_set_d(__gen_e_acsl__14,x); + __gmpq_init(__gen_e_acsl_div); + __gmpq_div(__gen_e_acsl_div, + (__e_acsl_mpq_struct const *)(__gen_e_acsl__13), + (__e_acsl_mpq_struct const *)(__gen_e_acsl__14)); + __gen_e_acsl__15 = __gmpq_get_d((__e_acsl_mpq_struct const *)(__gen_e_acsl_div)); + __gmpq_clear(__gen_e_acsl__13); + __gmpq_clear(__gen_e_acsl__14); + __gmpq_clear(__gen_e_acsl_div); + /*@ assert Eva: is_nan_or_infinite: \is_finite(__gen_e_acsl__15); */ + return __gen_e_acsl__15; +} + +int __gen_e_acsl_g(int x) +{ + int __gen_e_acsl_g_hidden_2; + __gen_e_acsl_g_hidden_2 = __gen_e_acsl_g_hidden(x); + return __gen_e_acsl_g_hidden_2; +} + +mystruct __gen_e_acsl_t1(mystruct m) +{ + return m; +} + +int __gen_e_acsl_p1(int x, int y) +{ + __e_acsl_mpz_t __gen_e_acsl_x; + __e_acsl_mpz_t __gen_e_acsl_y; + __e_acsl_mpz_t __gen_e_acsl_add; + __e_acsl_mpz_t __gen_e_acsl_; + int __gen_e_acsl_gt; + __gmpz_init_set_si(__gen_e_acsl_x,(long)x); + __gmpz_init_set_si(__gen_e_acsl_y,(long)y); + __gmpz_init(__gen_e_acsl_add); + __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(__gen_e_acsl_x), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_y)); + __gmpz_init_set_si(__gen_e_acsl_,0L); + __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_add), + (__e_acsl_mpz_struct const *)(__gen_e_acsl_)); + int __retres = __gen_e_acsl_gt > 0; + __gmpz_clear(__gen_e_acsl_x); + __gmpz_clear(__gen_e_acsl_y); + __gmpz_clear(__gen_e_acsl_add); + __gmpz_clear(__gen_e_acsl_); + return __retres; +} + +void __gen_e_acsl_t2(__e_acsl_mpz_t *__retres_arg, mystruct m) +{ + __e_acsl_mpz_t __gen_e_acsl__10; + __e_acsl_mpz_t __gen_e_acsl__11; + __e_acsl_mpz_t __gen_e_acsl_add_7; + __gmpz_init_set_si(__gen_e_acsl__10,(long)m.k); + __gmpz_init_set_si(__gen_e_acsl__11,(long)m.l); + __gmpz_init(__gen_e_acsl_add_7); + __gmpz_add(__gen_e_acsl_add_7, + (__e_acsl_mpz_struct const *)(__gen_e_acsl__10), + (__e_acsl_mpz_struct const *)(__gen_e_acsl__11)); + __gmpz_init_set(*__retres_arg, + (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_7)); + __gmpz_clear(__gen_e_acsl__10); + __gmpz_clear(__gen_e_acsl__11); + __gmpz_clear(__gen_e_acsl_add_7); + return; +} + diff --git a/tests/libc/more_gcc_builtins.c b/tests/libc/more_gcc_builtins.c index 835f64e8cc80a61eacd93ae770e9db917b75881f..d3d023ac786338c8701dd77e2a3baaefbc959b03 100644 --- a/tests/libc/more_gcc_builtins.c +++ b/tests/libc/more_gcc_builtins.c @@ -2,7 +2,7 @@ STDOPT: #"-machdep gcc_x86_32" */ - +volatile int v; #include <limits.h> int main() { @@ -42,5 +42,32 @@ int main() { r = __builtin_smulll_overflow(-1, LLONG_MIN, &llres); //@ assert llres == (long long)(-1 * LLONG_MIN); //@ assert r == 1; + if (v) { + __builtin_clz(0); + //@ assert unreachable:\false; + } + res = __builtin_clz(1); + //@ assert 0 <= res < CHAR_BIT * sizeof(int); + res = __builtin_clzl(ULONG_MAX); + //@ assert 0 <= res < CHAR_BIT * sizeof(long); + res = __builtin_clzll(ULLONG_MAX); + //@ assert 0 <= res < CHAR_BIT * sizeof(long long); + if (v) { + __builtin_ctz(0); + //@ assert unreachable:\false; + } + res = __builtin_ctz(42); + //@ assert 0 <= res < CHAR_BIT * sizeof(int); + res = __builtin_ctzl(1234567); + //@ assert 0 <= res < CHAR_BIT * sizeof(long); + res = __builtin_ctzll(1); + //@ assert 0 <= res < CHAR_BIT * sizeof(long long); + + res = __builtin_popcount(0); + //@ assert 0 <= res <= CHAR_BIT * sizeof(int); + res = __builtin_popcountl(ULONG_MAX); + //@ assert 0 <= res <= CHAR_BIT * sizeof(long); + res = __builtin_popcountll(ULLONG_MAX); + //@ assert 0 <= res <= CHAR_BIT * sizeof(long long); return 0; } diff --git a/tests/libc/oracle/fc_libc.0.res.oracle b/tests/libc/oracle/fc_libc.0.res.oracle index f0d8a56d9da389ed98ffffb2f82d20a89d8716b8..fefd9fce133ac0e463ea535e54a79caec09fc2af 100644 --- a/tests/libc/oracle/fc_libc.0.res.oracle +++ b/tests/libc/oracle/fc_libc.0.res.oracle @@ -40,7 +40,7 @@ unsetenv (0 call); wcscat (0 call); wcscpy (0 call); wcslen (2 calls); wcsncat (0 call); wcsncpy (0 call); wmemcpy (0 call); wmemset (0 call); - Undefined functions (397) + Undefined functions (406) ========================= FD_CLR (0 call); FD_ISSET (0 call); FD_SET (0 call); FD_ZERO (0 call); Frama_C_int_interval (0 call); Frama_C_long_interval (0 call); @@ -51,18 +51,21 @@ Frama_C_unsigned_long_interval (0 call); Frama_C_unsigned_long_long_interval (0 call); Frama_C_unsigned_short_interval (0 call); _Exit (0 call); - __builtin_abort (1 call); __builtin_sadd_overflow (0 call); - __builtin_saddl_overflow (0 call); __builtin_saddll_overflow (0 call); - __builtin_smul_overflow (0 call); __builtin_smull_overflow (0 call); - __builtin_smulll_overflow (0 call); __builtin_ssub_overflow (0 call); - __builtin_ssubl_overflow (0 call); __builtin_ssubll_overflow (0 call); - __builtin_uadd_overflow (0 call); __builtin_uaddl_overflow (0 call); - __builtin_uaddll_overflow (0 call); __builtin_umul_overflow (0 call); - __builtin_umull_overflow (0 call); __builtin_umulll_overflow (0 call); - __builtin_usub_overflow (0 call); __builtin_usubl_overflow (0 call); - __builtin_usubll_overflow (0 call); __fc_fpclassify (0 call); - __fc_fpclassifyf (0 call); __fc_infinity (0 call); __fc_nan (0 call); - __va_fcntl_flock (0 call); __va_fcntl_int (0 call); + __builtin_abort (1 call); __builtin_clz (0 call); __builtin_clzl (0 call); + __builtin_clzll (0 call); __builtin_ctz (0 call); __builtin_ctzl (0 call); + __builtin_ctzll (0 call); __builtin_popcount (0 call); + __builtin_popcountl (0 call); __builtin_popcountll (0 call); + __builtin_sadd_overflow (0 call); __builtin_saddl_overflow (0 call); + __builtin_saddll_overflow (0 call); __builtin_smul_overflow (0 call); + __builtin_smull_overflow (0 call); __builtin_smulll_overflow (0 call); + __builtin_ssub_overflow (0 call); __builtin_ssubl_overflow (0 call); + __builtin_ssubll_overflow (0 call); __builtin_uadd_overflow (0 call); + __builtin_uaddl_overflow (0 call); __builtin_uaddll_overflow (0 call); + __builtin_umul_overflow (0 call); __builtin_umull_overflow (0 call); + __builtin_umulll_overflow (0 call); __builtin_usub_overflow (0 call); + __builtin_usubl_overflow (0 call); __builtin_usubll_overflow (0 call); + __fc_fpclassify (0 call); __fc_fpclassifyf (0 call); __fc_infinity (0 call); + __fc_nan (0 call); __va_fcntl_flock (0 call); __va_fcntl_int (0 call); __va_fcntl_void (0 call); __va_ioctl_int (0 call); __va_ioctl_ptr (0 call); __va_ioctl_void (0 call); __va_open_mode_t (0 call); __va_open_void (0 call); __va_openat_mode_t (0 call); @@ -181,7 +184,7 @@ Goto = 89 Assignment = 438 Exit point = 82 - Function = 479 + Function = 488 Function call = 89 Pointer dereferencing = 158 Cyclomatic complexity = 286 diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle index c4e0a539a60ff3e4315e6d03fc56aa523733ffe4..f940ecca0a0a3bd89df54454c6c97cbe5cbfa77a 100644 --- a/tests/libc/oracle/fc_libc.1.res.oracle +++ b/tests/libc/oracle/fc_libc.1.res.oracle @@ -7238,6 +7238,66 @@ _Bool __builtin_umull_overflow(unsigned long a, unsigned long b, _Bool __builtin_umulll_overflow(unsigned long long a, unsigned long long b, unsigned long long *res); +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_clz(unsigned int x); + +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_clzl(unsigned long x); + +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_clzll(unsigned long long x); + +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_ctz(unsigned int x); + +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_ctzl(unsigned long x); + +/*@ requires x_nonzero: x ≢ 0; + ensures result_is_bit_count: 0 ≤ \result < 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_ctzll(unsigned long long x); + +/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_popcount(unsigned int x); + +/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_popcountl(unsigned long x); + +/*@ ensures result_is_bit_count: 0 ≤ \result ≤ 8 * sizeof(\old(x)); + assigns \result; + assigns \result \from (indirect: x); + */ +int __builtin_popcountll(unsigned long long x); + /*@ requires valid_filename: valid_read_string(filename); assigns \result; assigns \result \from (indirect: *(filename + (0 ..))), (indirect: mode); diff --git a/tests/libc/oracle/more_gcc_builtins.res.oracle b/tests/libc/oracle/more_gcc_builtins.res.oracle index 0ad30701226b8bdd8f77ce8a05a61da4d36caca3..91b6a0d432d63d1e7c29f12e19155a1da1251880 100644 --- a/tests/libc/oracle/more_gcc_builtins.res.oracle +++ b/tests/libc/oracle/more_gcc_builtins.res.oracle @@ -3,7 +3,7 @@ [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization - + v ∈ [--..--] [eva] computing for function __builtin_sadd_overflow <- main. Called from tests/libc/more_gcc_builtins.c:10. [eva] using specification for function __builtin_sadd_overflow @@ -82,11 +82,78 @@ [eva] Done for function __builtin_smulll_overflow [eva] tests/libc/more_gcc_builtins.c:43: assertion got status valid. [eva] tests/libc/more_gcc_builtins.c:44: assertion got status valid. +[eva] computing for function __builtin_clz <- main. + Called from tests/libc/more_gcc_builtins.c:46. +[eva] using specification for function __builtin_clz +[eva:alarm] tests/libc/more_gcc_builtins.c:46: Warning: + function __builtin_clz: precondition 'x_nonzero' got status invalid. +[eva] Done for function __builtin_clz +[eva] computing for function __builtin_clz <- main. + Called from tests/libc/more_gcc_builtins.c:49. +[eva] tests/libc/more_gcc_builtins.c:49: + function __builtin_clz: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_clz +[eva] tests/libc/more_gcc_builtins.c:50: assertion got status valid. +[eva] computing for function __builtin_clzl <- main. + Called from tests/libc/more_gcc_builtins.c:51. +[eva] using specification for function __builtin_clzl +[eva] tests/libc/more_gcc_builtins.c:51: + function __builtin_clzl: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_clzl +[eva] tests/libc/more_gcc_builtins.c:52: assertion got status valid. +[eva] computing for function __builtin_clzll <- main. + Called from tests/libc/more_gcc_builtins.c:53. +[eva] using specification for function __builtin_clzll +[eva] tests/libc/more_gcc_builtins.c:53: + function __builtin_clzll: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_clzll +[eva] tests/libc/more_gcc_builtins.c:54: assertion got status valid. +[eva] computing for function __builtin_ctz <- main. + Called from tests/libc/more_gcc_builtins.c:56. +[eva] using specification for function __builtin_ctz +[eva:alarm] tests/libc/more_gcc_builtins.c:56: Warning: + function __builtin_ctz: precondition 'x_nonzero' got status invalid. +[eva] Done for function __builtin_ctz +[eva] computing for function __builtin_ctz <- main. + Called from tests/libc/more_gcc_builtins.c:59. +[eva] tests/libc/more_gcc_builtins.c:59: + function __builtin_ctz: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_ctz +[eva] tests/libc/more_gcc_builtins.c:60: assertion got status valid. +[eva] computing for function __builtin_ctzl <- main. + Called from tests/libc/more_gcc_builtins.c:61. +[eva] using specification for function __builtin_ctzl +[eva] tests/libc/more_gcc_builtins.c:61: + function __builtin_ctzl: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_ctzl +[eva] tests/libc/more_gcc_builtins.c:62: assertion got status valid. +[eva] computing for function __builtin_ctzll <- main. + Called from tests/libc/more_gcc_builtins.c:63. +[eva] using specification for function __builtin_ctzll +[eva] tests/libc/more_gcc_builtins.c:63: + function __builtin_ctzll: precondition 'x_nonzero' got status valid. +[eva] Done for function __builtin_ctzll +[eva] tests/libc/more_gcc_builtins.c:64: assertion got status valid. +[eva] computing for function __builtin_popcount <- main. + Called from tests/libc/more_gcc_builtins.c:66. +[eva] using specification for function __builtin_popcount +[eva] Done for function __builtin_popcount +[eva] tests/libc/more_gcc_builtins.c:67: assertion got status valid. +[eva] computing for function __builtin_popcountl <- main. + Called from tests/libc/more_gcc_builtins.c:68. +[eva] using specification for function __builtin_popcountl +[eva] Done for function __builtin_popcountl +[eva] tests/libc/more_gcc_builtins.c:69: assertion got status valid. +[eva] computing for function __builtin_popcountll <- main. + Called from tests/libc/more_gcc_builtins.c:70. +[eva] using specification for function __builtin_popcountll +[eva] Done for function __builtin_popcountll +[eva] tests/libc/more_gcc_builtins.c:71: assertion got status valid. [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function main: - res ∈ {-2147483607} + res ∈ [0..64] r ∈ {1} lres ∈ {2147483647} llres ∈ {-9223372036854775808} diff --git a/tests/syntax/oracle/check_builtin_bts1440.res.oracle b/tests/syntax/oracle/check_builtin_bts1440.res.oracle index 4e0e7ae6c6aa45fbc67adee69362135b5dd1fcb6..091c7d8002d8a53274789b3887edaaec956ffbe2 100644 --- a/tests/syntax/oracle/check_builtin_bts1440.res.oracle +++ b/tests/syntax/oracle/check_builtin_bts1440.res.oracle @@ -81,12 +81,6 @@ long double __builtin_ceill(long double); - int __builtin_clz(unsigned int); - - int __builtin_clzl(unsigned long); - - int __builtin_clzll(unsigned long long); - int __builtin_constant_p(int); double __builtin_cos(double); @@ -101,12 +95,6 @@ long double __builtin_cosl(long double); - int __builtin_ctz(unsigned int); - - int __builtin_ctzl(unsigned long); - - int __builtin_ctzll(unsigned long long); - double __builtin_exp(double); long __builtin_expect(long, long); @@ -217,12 +205,6 @@ int __builtin_parityll(unsigned long long); - int __builtin_popcount(unsigned int); - - int __builtin_popcountl(unsigned long); - - int __builtin_popcountll(unsigned long long); - double __builtin_powi(double, int); float __builtin_powif(float, int);