diff --git a/regression/ansi-c/gcc_float_types1/main.c b/regression/ansi-c/gcc_float_types1/main.c new file mode 100644 index 00000000000..e72a6f65273 --- /dev/null +++ b/regression/ansi-c/gcc_float_types1/main.c @@ -0,0 +1,19 @@ +// for gcc, __float80 and __float128 are typedefs +// for clang, __float128 is a keyword, and __float80 doesn't exist. + +#ifdef __clang__ +int __float80; +__float128 f128; +#else +__float80 f80; +__float128 f128; +#endif + +int main() +{ + #ifndef __clang__ + // on gcc, they can be re-declared, as they are identifiers, not keywords + int __float80; + int __float128; + #endif +} diff --git a/regression/ansi-c/gcc_float_types1/test.desc b/regression/ansi-c/gcc_float_types1/test.desc new file mode 100644 index 00000000000..0e1ed863bc1 --- /dev/null +++ b/regression/ansi-c/gcc_float_types1/test.desc @@ -0,0 +1,8 @@ +CORE gcc-only +main.c + +^EXIT=0$ +^SIGNAL=0$ +-- +^warning: ignoring +^CONVERSION ERROR$ diff --git a/src/ansi-c/ansi_c_declaration.cpp b/src/ansi-c/ansi_c_declaration.cpp index 5287fa6cfb6..859b99a2d36 100644 --- a/src/ansi-c/ansi_c_declaration.cpp +++ b/src/ansi-c/ansi_c_declaration.cpp @@ -150,9 +150,10 @@ void ansi_c_declarationt::to_symbol( if(get_is_inline()) symbol.type.set(ID_C_inlined, true); - if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC || - config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE || - config.ansi_c.mode==configt::ansi_ct::flavourt::ARM) + if( + config.ansi_c.mode == configt::ansi_ct::flavourt::GCC || + config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG || + config.ansi_c.mode == configt::ansi_ct::flavourt::ARM) { // GCC extern inline cleanup, to enable remove_internal_symbols // do its full job diff --git a/src/ansi-c/ansi_c_internal_additions.cpp b/src/ansi-c/ansi_c_internal_additions.cpp index 21f6fc41f4a..d8174265c17 100644 --- a/src/ansi-c/ansi_c_internal_additions.cpp +++ b/src/ansi-c/ansi_c_internal_additions.cpp @@ -182,21 +182,45 @@ void ansi_c_internal_additions(std::string &code) "\n"; // GCC junk stuff, also for CLANG and ARM - if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC || - config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE || - config.ansi_c.mode==configt::ansi_ct::flavourt::ARM) + if( + config.ansi_c.mode == configt::ansi_ct::flavourt::GCC || + config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG || + config.ansi_c.mode == configt::ansi_ct::flavourt::ARM) { code+=gcc_builtin_headers_types; // there are many more, e.g., look at // https://developer.apple.com/library/mac/#documentation/developertools/gcc-4.0.1/gcc/Target-Builtins.html - if(config.ansi_c.arch=="i386" || - config.ansi_c.arch=="x86_64" || - config.ansi_c.arch=="x32") + if( + config.ansi_c.arch == "i386" || config.ansi_c.arch == "x86_64" || + config.ansi_c.arch == "x32" || config.ansi_c.arch == "powerpc" || + config.ansi_c.arch == "ppc64" || config.ansi_c.arch == "ppc64le" || + config.ansi_c.arch == "ia64") { - if(config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE) - code+="typedef double __float128;\n"; // clang doesn't do __float128 + // https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html + // For clang, __float128 is a keyword. + // For gcc, this is a typedef and not a keyword. + if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG) + code += "typedef __CPROVER_Float128 __float128;\n"; + } + else if(config.ansi_c.arch == "hppa") + { + // https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html + // For clang, __float128 is a keyword. + // For gcc, this is a typedef and not a keyword. + if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG) + code+="typedef long double __float128;\n"; + } + + if( + config.ansi_c.arch == "i386" || config.ansi_c.arch == "x86_64" || + config.ansi_c.arch == "x32" || config.ansi_c.arch == "ia64") + { + // clang doesn't do __float80 + // Note that __float80 is a typedef, and not a keyword. + if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG) + code += "typedef __CPROVER_Float64x __float80;\n"; } // On 64-bit systems, gcc has typedefs diff --git a/src/ansi-c/builtin_factory.cpp b/src/ansi-c/builtin_factory.cpp index a92269a754c..f20c669cf87 100644 --- a/src/ansi-c/builtin_factory.cpp +++ b/src/ansi-c/builtin_factory.cpp @@ -134,9 +134,10 @@ bool builtin_factory( } // GCC junk stuff, also for CLANG and ARM - if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC || - config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE || - config.ansi_c.mode==configt::ansi_ct::flavourt::ARM) + if( + config.ansi_c.mode == configt::ansi_ct::flavourt::GCC || + config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG || + config.ansi_c.mode == configt::ansi_ct::flavourt::ARM) { if(find_pattern(pattern, gcc_builtin_headers_generic, s)) return convert(identifier, s, symbol_table, mh); diff --git a/src/ansi-c/c_typecheck_base.cpp b/src/ansi-c/c_typecheck_base.cpp index aeddbf14a0a..ee120fe00fd 100644 --- a/src/ansi-c/c_typecheck_base.cpp +++ b/src/ansi-c/c_typecheck_base.cpp @@ -336,7 +336,7 @@ void c_typecheck_baset::typecheck_redefinition_non_type( if( old_symbol.type.get_bool(ID_C_inlined) && (config.ansi_c.mode == configt::ansi_ct::flavourt::GCC || - config.ansi_c.mode == configt::ansi_ct::flavourt::APPLE || + config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG || config.ansi_c.mode == configt::ansi_ct::flavourt::ARM || config.ansi_c.mode == configt::ansi_ct::flavourt::VISUAL_STUDIO)) { diff --git a/src/ansi-c/gcc_builtin_headers_ia32.h b/src/ansi-c/gcc_builtin_headers_ia32.h index 9be09f54701..1cf8a04df6c 100644 --- a/src/ansi-c/gcc_builtin_headers_ia32.h +++ b/src/ansi-c/gcc_builtin_headers_ia32.h @@ -1,11 +1,11 @@ // from // http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/X86-Built_002din-Functions.html -__float128 __builtin_fabsq(__float128); -__float128 __builtin_copysignq(__float128, __float128); +__CPROVER_Float128 __builtin_fabsq(__CPROVER_Float128); +__CPROVER_Float128 __builtin_copysignq(__CPROVER_Float128, __CPROVER_Float128); void __builtin_ia32_pause(); -__float128 __builtin_infq(void); -__float128 __builtin_huge_valq(void); +__CPROVER_Float128 __builtin_infq(void); +__CPROVER_Float128 __builtin_huge_valq(void); __gcc_v8qi __builtin_ia32_paddb(__gcc_v8qi, __gcc_v8qi); __gcc_v4hi __builtin_ia32_paddw(__gcc_v4hi, __gcc_v4hi); __gcc_v2si __builtin_ia32_paddd(__gcc_v2si, __gcc_v2si); diff --git a/src/ansi-c/get-gcc-builtins.sh b/src/ansi-c/get-gcc-builtins.sh index fd06b79945d..344c271d692 100755 --- a/src/ansi-c/get-gcc-builtins.sh +++ b/src/ansi-c/get-gcc-builtins.sh @@ -102,7 +102,7 @@ cat > builtins.h <