Skip to content

Commit 0618f7d

Browse files
author
Daniel Kroening
authored
Merge pull request diffblue#2628 from diffblue/clang-extensions
ansi-c: clang extensions
2 parents 5e43131 + f74c161 commit 0618f7d

15 files changed

+220
-97
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// for gcc, __float80 and __float128 are typedefs
2+
// for clang, __float128 is a keyword, and __float80 doesn't exist.
3+
4+
#ifdef __clang__
5+
int __float80;
6+
__float128 f128;
7+
#else
8+
__float80 f80;
9+
__float128 f128;
10+
#endif
11+
12+
int main()
13+
{
14+
#ifndef __clang__
15+
// on gcc, they can be re-declared, as they are identifiers, not keywords
16+
int __float80;
17+
int __float128;
18+
#endif
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE gcc-only
2+
main.c
3+
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
^CONVERSION ERROR$

src/ansi-c/ansi_c_declaration.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,10 @@ void ansi_c_declarationt::to_symbol(
150150
if(get_is_inline())
151151
symbol.type.set(ID_C_inlined, true);
152152

153-
if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC ||
154-
config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE ||
155-
config.ansi_c.mode==configt::ansi_ct::flavourt::ARM)
153+
if(
154+
config.ansi_c.mode == configt::ansi_ct::flavourt::GCC ||
155+
config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG ||
156+
config.ansi_c.mode == configt::ansi_ct::flavourt::ARM)
156157
{
157158
// GCC extern inline cleanup, to enable remove_internal_symbols
158159
// do its full job

src/ansi-c/ansi_c_internal_additions.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,21 +182,45 @@ void ansi_c_internal_additions(std::string &code)
182182
"\n";
183183

184184
// GCC junk stuff, also for CLANG and ARM
185-
if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC ||
186-
config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE ||
187-
config.ansi_c.mode==configt::ansi_ct::flavourt::ARM)
185+
if(
186+
config.ansi_c.mode == configt::ansi_ct::flavourt::GCC ||
187+
config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG ||
188+
config.ansi_c.mode == configt::ansi_ct::flavourt::ARM)
188189
{
189190
code+=gcc_builtin_headers_types;
190191

191192
// there are many more, e.g., look at
192193
// https://developer.apple.com/library/mac/#documentation/developertools/gcc-4.0.1/gcc/Target-Builtins.html
193194

194-
if(config.ansi_c.arch=="i386" ||
195-
config.ansi_c.arch=="x86_64" ||
196-
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")
197200
{
198-
if(config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE)
199-
code+="typedef double __float128;\n"; // clang doesn't do __float128
201+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
202+
// For clang, __float128 is a keyword.
203+
// For gcc, this is a typedef and not a keyword.
204+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
205+
code += "typedef __CPROVER_Float128 __float128;\n";
206+
}
207+
else if(config.ansi_c.arch == "hppa")
208+
{
209+
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
210+
// For clang, __float128 is a keyword.
211+
// For gcc, 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";
214+
}
215+
216+
if(
217+
config.ansi_c.arch == "i386" || config.ansi_c.arch == "x86_64" ||
218+
config.ansi_c.arch == "x32" || config.ansi_c.arch == "ia64")
219+
{
220+
// clang doesn't do __float80
221+
// Note that __float80 is a typedef, and not a keyword.
222+
if(config.ansi_c.mode != configt::ansi_ct::flavourt::CLANG)
223+
code += "typedef __CPROVER_Float64x __float80;\n";
200224
}
201225

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

src/ansi-c/builtin_factory.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,10 @@ bool builtin_factory(
134134
}
135135

136136
// GCC junk stuff, also for CLANG and ARM
137-
if(config.ansi_c.mode==configt::ansi_ct::flavourt::GCC ||
138-
config.ansi_c.mode==configt::ansi_ct::flavourt::APPLE ||
139-
config.ansi_c.mode==configt::ansi_ct::flavourt::ARM)
137+
if(
138+
config.ansi_c.mode == configt::ansi_ct::flavourt::GCC ||
139+
config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG ||
140+
config.ansi_c.mode == configt::ansi_ct::flavourt::ARM)
140141
{
141142
if(find_pattern(pattern, gcc_builtin_headers_generic, s))
142143
return convert(identifier, s, symbol_table, mh);

src/ansi-c/c_typecheck_base.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
336336
if(
337337
old_symbol.type.get_bool(ID_C_inlined) &&
338338
(config.ansi_c.mode == configt::ansi_ct::flavourt::GCC ||
339-
config.ansi_c.mode == configt::ansi_ct::flavourt::APPLE ||
339+
config.ansi_c.mode == configt::ansi_ct::flavourt::CLANG ||
340340
config.ansi_c.mode == configt::ansi_ct::flavourt::ARM ||
341341
config.ansi_c.mode == configt::ansi_ct::flavourt::VISUAL_STUDIO))
342342
{

src/ansi-c/gcc_builtin_headers_ia32.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// from
22
// http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/X86-Built_002din-Functions.html
33

4-
__float128 __builtin_fabsq(__float128);
5-
__float128 __builtin_copysignq(__float128, __float128);
4+
__CPROVER_Float128 __builtin_fabsq(__CPROVER_Float128);
5+
__CPROVER_Float128 __builtin_copysignq(__CPROVER_Float128, __CPROVER_Float128);
66
void __builtin_ia32_pause();
7-
__float128 __builtin_infq(void);
8-
__float128 __builtin_huge_valq(void);
7+
__CPROVER_Float128 __builtin_infq(void);
8+
__CPROVER_Float128 __builtin_huge_valq(void);
99
__gcc_v8qi __builtin_ia32_paddb(__gcc_v8qi, __gcc_v8qi);
1010
__gcc_v4hi __builtin_ia32_paddw(__gcc_v4hi, __gcc_v4hi);
1111
__gcc_v2si __builtin_ia32_paddd(__gcc_v2si, __gcc_v2si);

src/ansi-c/get-gcc-builtins.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ cat > builtins.h <<EOF
102102
// some newer versions of GCC apparently support __floatXYZ
103103
#define dfloat32_type_node __float32
104104
#define dfloat64_type_node __float64
105-
#define dfloat128_type_node __float128
105+
#define dfloat128_type_node __CPROVER_Float128
106106
107107
#define build_qualified_type(t, q) q t
108108
#define build_pointer_type(t) t*

0 commit comments

Comments
 (0)