Skip to content

Commit b0d1f9e

Browse files
committed
Restore _Float128 support by default
_Float128 was exposed by GCC as of version 4.3 (x86-64) to 4.5 (i386 and I think others). cbmc still makes no effort to imitate a particular GCC version, so I simply enable recognising the token by default, which used to happen universally; goto-cc on the other hand uses the new `gcc_versiont` to choose an appropriate behaviour. This fixes a regression on tests using math.h due to some versions of glibc defining _Float128 conditional on the compiler version, which cbmc and goto-cc now both allow to appear like the gcc found on the path.
1 parent 10a4685 commit b0d1f9e

File tree

7 files changed

+18
-2
lines changed

7 files changed

+18
-2
lines changed

src/ansi-c/ansi_c_language.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ bool ansi_c_languaget::parse(
7676
ansi_c_parser.set_message_handler(get_message_handler());
7777
ansi_c_parser.for_has_scope=config.ansi_c.for_has_scope;
7878
ansi_c_parser.ts_18661_3_Floatn_types=config.ansi_c.ts_18661_3_Floatn_types;
79+
ansi_c_parser.Float128_type = config.ansi_c.Float128_type;
7980
ansi_c_parser.cpp98=false; // it's not C++
8081
ansi_c_parser.cpp11=false; // it's not C++
8182
ansi_c_parser.mode=config.ansi_c.mode;

src/ansi-c/ansi_c_parser.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class ansi_c_parsert:public parsert
3636
cpp98(false),
3737
cpp11(false),
3838
for_has_scope(false),
39-
ts_18661_3_Floatn_types(false)
39+
ts_18661_3_Floatn_types(false),
40+
Float128_type(false)
4041
{
4142
}
4243

@@ -81,6 +82,9 @@ class ansi_c_parsert:public parsert
8182
// ISO/IEC TS 18661-3:2015
8283
bool ts_18661_3_Floatn_types;
8384

85+
// Does the compiler version emulated provide _Float128?
86+
bool Float128_type;
87+
8488
typedef ansi_c_identifiert identifiert;
8589
typedef ansi_c_scopet scopet;
8690

src/ansi-c/scanner.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ void ansi_c_scanner_init()
503503
return make_identifier();
504504
}
505505

506-
"_Float128" { if(PARSER.ts_18661_3_Floatn_types)
506+
"_Float128" { if(PARSER.Float128_type)
507507
{ loc(); return TOK_GCC_FLOAT128; }
508508
else
509509
return make_identifier();

src/cpp/cpp_parser.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ bool cpp_parsert::parse()
2525
config.cpp.cpp_standard==configt::cppt::cpp_standardt::CPP11 ||
2626
config.cpp.cpp_standard==configt::cppt::cpp_standardt::CPP14;
2727
ansi_c_parser.ts_18661_3_Floatn_types=false;
28+
ansi_c_parser.Float128_type = false;
2829
ansi_c_parser.in=in;
2930
ansi_c_parser.mode=mode;
3031
ansi_c_parser.set_file(get_file());

src/goto-cc/gcc_mode.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,12 @@ int gcc_modet::doit()
530530
gcc_version.is_at_least(7))
531531
config.ansi_c.ts_18661_3_Floatn_types=true;
532532

533+
int gcc_float128_minor_version = config.ansi_c.arch == "x86_64" ? 3 : 5;
534+
535+
config.ansi_c.Float128_type =
536+
gcc_version.flavor == gcc_versiont::flavort::GCC &&
537+
gcc_version.is_at_least(4, gcc_float128_minor_version);
538+
533539
// -fshort-double makes double the same as float
534540
if(cmdline.isset("fshort-double"))
535541
config.ansi_c.double_width=config.ansi_c.single_width;

src/util/config.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,9 @@ bool configt::set(const cmdlinet &cmdline)
912912
ansi_c.preprocessor=ansi_ct::preprocessort::GCC;
913913
}
914914

915+
if(ansi_c.preprocessor == ansi_ct::preprocessort::GCC)
916+
ansi_c.Float128_type = true;
917+
915918
set_arch(arch);
916919

917920
if(os=="windows")

src/util/config.h

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class configt
4343
bool char_is_unsigned, wchar_t_is_unsigned;
4444
bool for_has_scope;
4545
bool ts_18661_3_Floatn_types; // ISO/IEC TS 18661-3:2015
46+
bool Float128_type;
4647
bool single_precision_constant;
4748
enum class c_standardt { C89, C99, C11 } c_standard;
4849
static c_standardt default_c_standard();

0 commit comments

Comments
 (0)