Skip to content

Commit 7839c49

Browse files
author
Daniel Kroening
committed
bugfix: __float128
1 parent 4cb2afa commit 7839c49

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

src/ansi-c/ansi_c_internal_additions.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,25 @@ void ansi_c_internal_additions(std::string &code)
192192
// there are many more, e.g., look at
193193
// https://developer.apple.com/library/mac/#documentation/developertools/gcc-4.0.1/gcc/Target-Builtins.html
194194

195-
if(config.ansi_c.arch=="i386" ||
196-
config.ansi_c.arch=="x86_64" ||
197-
config.ansi_c.arch=="x32")
195+
if(
196+
config.ansi_c.arch == "i386" || config.ansi_c.arch == "x86_64" ||
197+
config.ansi_c.arch == "x32" || config.ansi_c.arch == "powerpc" ||
198+
config.ansi_c.arch == "ppc64" || config.ansi_c.arch == "ppc64le" ||
199+
config.ansi_c.arch == "ia64")
198200
{
199-
if(config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG)
200-
code+="typedef double __float128;\n"; // clang doesn't do __float128
201+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
202+
// clang doesn't do __float128
203+
// Note that this is a typedef and not a keyword.
204+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
205+
code += "typedef _Float128 __float128;\n";
206+
}
207+
else if(config.ansi_c.arch == "hppa")
208+
{
209+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
210+
// clang doesn't do __float128
211+
// Note that this is a typedef and not a keyword.
212+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
213+
code+="typedef long double __float128;\n";
201214
}
202215

203216
// On 64-bit systems, both gcc and clang have typedefs

src/ansi-c/scanner.l

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -496,13 +496,6 @@ void ansi_c_scanner_init()
496496
return make_identifier();
497497
}
498498

499-
"__float128" { // clang doesn't have it
500-
if(PARSER.mode==configt::ansi_ct::flavourt::GCC)
501-
{ loc(); return TOK_GCC_FLOAT128; }
502-
else
503-
return make_identifier();
504-
}
505-
506499
"_Float128" { if(PARSER.Float128_type)
507500
{ loc(); return TOK_GCC_FLOAT128; }
508501
else

src/cpp/cpp_internal_additions.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,23 @@ void cpp_internal_additions(std::ostream &out)
124124

125125
if(
126126
config.ansi_c.arch == "i386" || config.ansi_c.arch == "x86_64" ||
127-
config.ansi_c.arch == "x32")
127+
config.ansi_c.arch == "x32" || config.ansi_c.arch == "powerpc" ||
128+
config.ansi_c.arch == "ppc64" || config.ansi_c.arch == "ppc64le" ||
129+
config.ansi_c.arch == "ia64")
128130
{
131+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
129132
// clang doesn't do __float128
130-
if(config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG)
131-
out << "typedef double __float128;" << '\n';
133+
// Note that this is a typedef and not a keyword.
134+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
135+
out << "typedef _Float128 __float128;" << '\n';
136+
}
137+
else if(config.ansi_c.arch == "hppa")
138+
{
139+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
140+
// clang doesn't do __float128
141+
// Note that this is a typedef and not a keyword.
142+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
143+
out << "typedef long double __float128;" << '\n';
132144
}
133145

134146
// On 64-bit systems, gcc has typedefs

0 commit comments

Comments
 (0)