54 long_long_int_width=8*8;
58 long_double_width=16*8;
59 char_is_unsigned=
false;
60 wchar_t_is_unsigned=
false;
63 memory_operand_size=int_width/8;
78 long_long_int_width=8*8;
82 long_double_width=8*8;
83 char_is_unsigned=
false;
84 wchar_t_is_unsigned=
false;
87 memory_operand_size=int_width/8;
98 long_long_int_width=8*8;
102 long_double_width=8*8;
103 char_is_unsigned=
false;
104 wchar_t_is_unsigned=
false;
107 memory_operand_size=int_width/8;
118 long_long_int_width=8*8;
122 long_double_width=12*8;
123 char_is_unsigned=
false;
124 wchar_t_is_unsigned=
false;
127 memory_operand_size=int_width/8;
138 long_long_int_width=8*8;
142 long_double_width=8*8;
143 char_is_unsigned=
false;
144 wchar_t_is_unsigned=
false;
147 memory_operand_size=int_width/8;
160 mode == flavourt::VISUAL_STUDIO ||
161 (arch_is_x86_family && mode == flavourt::GCC))
163 argument_evaluation_order = argument_evaluation_ordert::RIGHT_TO_LEFT;
166 argument_evaluation_order = argument_evaluation_ordert::LEFT_TO_RIGHT;
171 arch_is_x86_family =
true;
172 set_argument_evaluation_order();
174 endianness=endiannesst::IS_LITTLE_ENDIAN;
175 char_is_unsigned=
false;
181 case flavourt::CLANG:
182 defines.push_back(
"i386");
183 defines.push_back(
"__i386");
184 defines.push_back(
"__i386__");
185 if(mode == flavourt::CLANG)
186 defines.push_back(
"__LITTLE_ENDIAN__");
189 case flavourt::VISUAL_STUDIO:
190 defines.push_back(
"_M_IX86");
193 case flavourt::CODEWARRIOR:
205 arch_is_x86_family =
true;
206 set_argument_evaluation_order();
208 endianness=endiannesst::IS_LITTLE_ENDIAN;
209 long_double_width=16*8;
210 char_is_unsigned=
false;
216 case flavourt::CLANG:
217 defines.push_back(
"__LP64__");
218 defines.push_back(
"__x86_64");
219 defines.push_back(
"__x86_64__");
220 defines.push_back(
"_LP64");
221 defines.push_back(
"__amd64__");
222 defines.push_back(
"__amd64");
224 if(os == ost::OS_MACOS)
225 defines.push_back(
"__LITTLE_ENDIAN__");
228 case flavourt::VISUAL_STUDIO:
229 defines.push_back(
"_M_X64");
230 defines.push_back(
"_M_AMD64");
233 case flavourt::CODEWARRIOR:
245 arch_is_x86_family =
false;
246 set_argument_evaluation_order();
253 endianness=endiannesst::IS_LITTLE_ENDIAN;
255 endianness=endiannesst::IS_BIG_ENDIAN;
257 long_double_width=16*8;
258 char_is_unsigned=
true;
264 case flavourt::CLANG:
265 defines.push_back(
"__powerpc");
266 defines.push_back(
"__powerpc__");
267 defines.push_back(
"__POWERPC__");
268 defines.push_back(
"__ppc__");
270 if(os == ost::OS_MACOS)
271 defines.push_back(
"__BIG_ENDIAN__");
275 defines.push_back(
"__powerpc64");
276 defines.push_back(
"__powerpc64__");
277 defines.push_back(
"__PPC64__");
278 defines.push_back(
"__ppc64__");
281 defines.push_back(
"_CALL_ELF=2");
282 defines.push_back(
"__LITTLE_ENDIAN__");
286 defines.push_back(
"_CALL_ELF=1");
287 defines.push_back(
"__BIG_ENDIAN__");
292 case flavourt::VISUAL_STUDIO:
293 defines.push_back(
"_M_PPC");
296 case flavourt::CODEWARRIOR:
308 arch_is_x86_family =
false;
309 set_argument_evaluation_order();
313 long_double_width=16*8;
318 long_double_width=8*8;
321 endianness=endiannesst::IS_LITTLE_ENDIAN;
322 char_is_unsigned=
true;
328 case flavourt::CLANG:
330 defines.push_back(
"__aarch64__");
332 defines.push_back(
"__arm__");
334 defines.push_back(
"__ARM_PCS_VFP");
337 case flavourt::VISUAL_STUDIO:
339 defines.push_back(
"_M_ARM64");
341 defines.push_back(
"_M_ARM");
344 case flavourt::CODEWARRIOR:
356 arch_is_x86_family =
false;
357 set_argument_evaluation_order();
359 endianness=endiannesst::IS_LITTLE_ENDIAN;
360 long_double_width=16*8;
361 char_is_unsigned=
false;
367 defines.push_back(
"__alpha__");
370 case flavourt::VISUAL_STUDIO:
371 defines.push_back(
"_M_ALPHA");
374 case flavourt::CLANG:
375 case flavourt::CODEWARRIOR:
387 arch_is_x86_family =
false;
388 set_argument_evaluation_order();
395 long_double_width=8*8;
400 long_double_width=16*8;
406 endianness=endiannesst::IS_LITTLE_ENDIAN;
408 endianness=endiannesst::IS_BIG_ENDIAN;
410 char_is_unsigned=
false;
416 defines.push_back(
"__mips__");
417 defines.push_back(
"mips");
419 "_MIPS_SZPTR="+std::to_string(
config.
ansi_c.pointer_width));
422 case flavourt::VISUAL_STUDIO:
426 case flavourt::CLANG:
427 case flavourt::CODEWARRIOR:
439 arch_is_x86_family =
false;
440 set_argument_evaluation_order();
442 endianness = endiannesst::IS_LITTLE_ENDIAN;
443 long_double_width = 16 * 8;
444 char_is_unsigned =
true;
450 defines.push_back(
"__riscv");
453 case flavourt::VISUAL_STUDIO:
454 case flavourt::CLANG:
455 case flavourt::CODEWARRIOR:
467 arch_is_x86_family =
false;
468 set_argument_evaluation_order();
470 endianness=endiannesst::IS_BIG_ENDIAN;
471 long_double_width=16*8;
472 char_is_unsigned=
true;
478 defines.push_back(
"__s390__");
481 case flavourt::VISUAL_STUDIO:
485 case flavourt::CLANG:
486 case flavourt::CODEWARRIOR:
498 arch_is_x86_family =
false;
499 set_argument_evaluation_order();
501 endianness=endiannesst::IS_BIG_ENDIAN;
502 char_is_unsigned=
true;
508 defines.push_back(
"__s390x__");
511 case flavourt::VISUAL_STUDIO:
515 case flavourt::CLANG:
516 case flavourt::CODEWARRIOR:
528 arch_is_x86_family =
false;
529 set_argument_evaluation_order();
533 long_double_width=16*8;
538 long_double_width=16*8;
541 endianness=endiannesst::IS_BIG_ENDIAN;
542 char_is_unsigned=
false;
548 defines.push_back(
"__sparc__");
550 defines.push_back(
"__arch64__");
553 case flavourt::VISUAL_STUDIO:
557 case flavourt::CLANG:
558 case flavourt::CODEWARRIOR:
570 arch_is_x86_family =
false;
571 set_argument_evaluation_order();
573 long_double_width=16*8;
574 endianness=endiannesst::IS_LITTLE_ENDIAN;
575 char_is_unsigned=
false;
581 defines.push_back(
"__ia64__");
582 defines.push_back(
"_IA64");
583 defines.push_back(
"__IA64__");
586 case flavourt::VISUAL_STUDIO:
587 defines.push_back(
"_M_IA64");
590 case flavourt::CLANG:
591 case flavourt::CODEWARRIOR:
603 arch_is_x86_family =
true;
604 set_argument_evaluation_order();
608 long_double_width=16*8;
609 endianness=endiannesst::IS_LITTLE_ENDIAN;
610 char_is_unsigned=
false;
616 defines.push_back(
"__ILP32__");
617 defines.push_back(
"__x86_64");
618 defines.push_back(
"__x86_64__");
619 defines.push_back(
"__amd64__");
620 defines.push_back(
"__amd64");
623 case flavourt::VISUAL_STUDIO:
627 case flavourt::CLANG:
628 case flavourt::CODEWARRIOR:
641 arch_is_x86_family =
false;
642 set_argument_evaluation_order();
654 long_double_width=8*8;
655 endianness=endiannesst::IS_LITTLE_ENDIAN;
658 char_is_unsigned=
false;
666 arch_is_x86_family =
false;
667 set_argument_evaluation_order();
669 long_double_width=8*8;
670 endianness=endiannesst::IS_BIG_ENDIAN;
671 char_is_unsigned=
false;
677 defines.push_back(
"__hppa__");
680 case flavourt::VISUAL_STUDIO:
684 case flavourt::CLANG:
685 case flavourt::CODEWARRIOR:
697 arch_is_x86_family =
false;
698 set_argument_evaluation_order();
700 long_double_width=8*8;
701 endianness=endiannesst::IS_LITTLE_ENDIAN;
702 char_is_unsigned=
false;
708 defines.push_back(
"__sh__");
709 defines.push_back(
"__SH4__");
712 case flavourt::VISUAL_STUDIO:
716 case flavourt::CLANG:
717 case flavourt::CODEWARRIOR:
729 arch_is_x86_family =
false;
730 set_argument_evaluation_order();
732 endianness = endiannesst::IS_LITTLE_ENDIAN;
733 long_double_width = 16 * 8;
734 char_is_unsigned =
false;
740 defines.push_back(
"__loongarch__");
743 case flavourt::VISUAL_STUDIO:
747 case flavourt::CODEWARRIOR:
748 case flavourt::CLANG:
760 arch_is_x86_family =
false;
761 set_argument_evaluation_order();
763 endianness = endiannesst::IS_LITTLE_ENDIAN;
764 long_double_width = 16 * 8;
765 char_is_unsigned =
false;
770 case flavourt::CLANG:
771 defines.push_back(
"__EMSCRIPTEN__");
774 case flavourt::VISUAL_STUDIO:
779 case flavourt::CODEWARRIOR:
791#if defined(__APPLE__)
793 return c_standardt::C11;
794#elif defined(__FreeBSD__) || defined(__OpenBSD__)
797 return c_standardt::C99;
800 return c_standardt::C11;
810 return cpp_standardt::CPP14;
812 return cpp_standardt::CPP98;
825 ansi_c.NULL_is_zero=
false;
826 ansi_c.arch_is_x86_family =
false;
827 ansi_c.set_argument_evaluation_order();
829 if(
sizeof(
long int)==8)
834 else if(arch==
"alpha")
835 ansi_c.set_arch_spec_alpha();
836 else if(arch==
"arm64" ||
840 ansi_c.set_arch_spec_arm(arch);
841 else if(arch==
"mips64el" ||
847 ansi_c.set_arch_spec_mips(arch);
848 else if(arch==
"powerpc" ||
851 ansi_c.set_arch_spec_power(arch);
852 else if(arch ==
"riscv64")
853 ansi_c.set_arch_spec_riscv64();
854 else if(arch==
"sparc" ||
856 ansi_c.set_arch_spec_sparc(arch);
857 else if(arch==
"ia64")
858 ansi_c.set_arch_spec_ia64();
859 else if(arch==
"s390x")
860 ansi_c.set_arch_spec_s390x();
861 else if(arch==
"s390")
862 ansi_c.set_arch_spec_s390();
864 ansi_c.set_arch_spec_x32();
865 else if(arch==
"v850")
866 ansi_c.set_arch_spec_v850();
867 else if(arch==
"hppa")
868 ansi_c.set_arch_spec_hppa();
870 ansi_c.set_arch_spec_sh4();
871 else if(arch==
"x86_64")
872 ansi_c.set_arch_spec_x86_64();
873 else if(arch==
"i386")
874 ansi_c.set_arch_spec_i386();
875 else if(arch ==
"loongarch64")
876 ansi_c.set_arch_spec_loongarch64();
877 else if(arch ==
"emscripten")
878 ansi_c.set_arch_spec_emscripten();
883 ansi_c.set_arch_spec_i386();
897 const std::size_t pointer_width)
901 "Value of \"" +
argument +
"\" given for object-bits is " + reason +
902 ". object-bits must be positive and less than the pointer width (" +
903 std::to_string(pointer_width) +
") ",
909 if(*object_bits == 0 || *object_bits >= pointer_width)
924 ansi_c.single_precision_constant=
false;
925 ansi_c.allow_anonymous_struct_embedding =
false;
926 ansi_c.for_has_scope=
true;
927 ansi_c.ts_18661_3_Floatn_types=
false;
928 ansi_c.__float128_is_keyword =
false;
929 ansi_c.float16_type =
false;
938 ansi_c.NULL_is_zero=
reinterpret_cast<size_t>(
nullptr)==0;
947 if(cmdline.
isset(
"function"))
950 if(cmdline.
isset(
'D'))
953 if(cmdline.
isset(
'I'))
956 if(cmdline.
isset(
"classpath"))
962 else if(cmdline.
isset(
"cp"))
978 if(cmdline.
isset(
"main-class"))
981 if(cmdline.
isset(
"include"))
993 if(cmdline.
isset(
"i386-linux"))
998 else if(cmdline.
isset(
"i386-win32") ||
999 cmdline.
isset(
"win32"))
1004 else if(cmdline.
isset(
"winx64"))
1009 else if(cmdline.
isset(
"i386-macos"))
1014 else if(cmdline.
isset(
"ppc-macos"))
1020 if(cmdline.
isset(
"arch"))
1025 if(cmdline.
isset(
"os"))
1037 if(cmdline.
isset(
"gcc"))
1046 ansi_c.defines.push_back(
"__CYGWIN__");
1050 ansi_c.defines.push_back(
"__int64=long long");
1062#elif defined(__FreeBSD__) || defined(__OpenBSD__)
1073 else if(os==
"macos")
1082 ansi_c.__float128_is_keyword =
true;
1083 ansi_c.float16_type =
true;
1087 else if(os ==
"linux" || os ==
"solaris" || os ==
"netbsd" || os ==
"hurd")
1094 else if(os ==
"freebsd" || os ==
"openbsd")
1103 ansi_c.__float128_is_keyword =
true;
1104 ansi_c.float16_type =
true;
1118 ansi_c.gcc__float128_type =
true;
1130 ansi_c.wchar_t_width=2*8;
1131 ansi_c.wchar_t_is_unsigned=
true;
1135 if(arch ==
"x86_64" && cmdline.
isset(
"gcc"))
1136 ansi_c.long_double_width=16*8;
1138 ansi_c.long_double_width=8*8;
1140 else if(os ==
"macos" && arch ==
"arm64")
1144 ansi_c.char_is_unsigned =
false;
1145 ansi_c.long_double_width = 8 * 8;
1154 "int width shall be equal to the system int width");
1157 "long int width shall be equal to the system long int width");
1160 "bool width shall be equal to the system bool width");
1163 "char width shall be equal to the system char width");
1166 "short int width shall be equal to the system short int width");
1169 "long long int width shall be equal to the system long long int width");
1172 "pointer width shall be equal to the system pointer width");
1175 "float width shall be equal to the system float width");
1178 "double width shall be equal to the system double width");
1180 ansi_c.char_is_unsigned ==
1182 "char_is_unsigned flag shall indicate system char unsignedness");
1188 "long double width shall be equal to the system long double width");
1194 if(cmdline.
isset(
"16"))
1197 if(cmdline.
isset(
"32"))
1200 if(cmdline.
isset(
"64"))
1203 if(cmdline.
isset(
"LP64"))
1206 if(cmdline.
isset(
"ILP64"))
1209 if(cmdline.
isset(
"LLP64"))
1212 if(cmdline.
isset(
"ILP32"))
1215 if(cmdline.
isset(
"LP32"))
1218 if(cmdline.
isset(
"string-abstraction"))
1219 ansi_c.string_abstraction=
true;
1221 ansi_c.string_abstraction=
false;
1223 if(cmdline.
isset(
"dfcc-debug-lib"))
1224 ansi_c.dfcc_debug_lib =
true;
1226 ansi_c.dfcc_debug_lib =
false;
1228 if(cmdline.
isset(
"dfcc-simple-invalid-pointer-model"))
1229 ansi_c.simple_invalid_pointer_model =
true;
1231 ansi_c.simple_invalid_pointer_model =
false;
1233 if(cmdline.
isset(
"no-library"))
1236 if(cmdline.
isset(
"little-endian"))
1239 if(cmdline.
isset(
"big-endian"))
1242 if(cmdline.
isset(
"little-endian") &&
1243 cmdline.
isset(
"big-endian"))
1246 if(cmdline.
isset(
"unsigned-char"))
1247 ansi_c.char_is_unsigned=
true;
1249 if(cmdline.
isset(
"round-to-even") ||
1250 cmdline.
isset(
"round-to-nearest"))
1253 if(cmdline.
isset(
"round-to-plus-inf"))
1256 if(cmdline.
isset(
"round-to-minus-inf"))
1259 if(cmdline.
isset(
"round-to-zero"))
1262 if(cmdline.
isset(
"object-bits"))
1268 if(cmdline.
isset(
"malloc-fail-assert") && cmdline.
isset(
"malloc-fail-null"))
1271 "at most one malloc failure mode is acceptable",
"--malloc-fail-null"};
1273 if(cmdline.
isset(
"malloc-fail-null"))
1274 ansi_c.malloc_failure_mode =
ansi_c.malloc_failure_mode_return_null;
1275 if(cmdline.
isset(
"malloc-fail-assert"))
1276 ansi_c.malloc_failure_mode =
ansi_c.malloc_failure_mode_assert_then_assume;
1278 if(cmdline.
isset(
"malloc-may-fail"))
1280 ansi_c.malloc_may_fail =
true;
1282 if(cmdline.
isset(
"no-malloc-may-fail"))
1284 ansi_c.malloc_may_fail =
false;
1288 if(cmdline.
isset(
"c89"))
1291 if(cmdline.
isset(
"c99"))
1294 if(cmdline.
isset(
"c11"))
1297 if(cmdline.
isset(
"c17"))
1300 if(cmdline.
isset(
"c23"))
1303 if(cmdline.
isset(
"cpp98"))
1306 if(cmdline.
isset(
"cpp03"))
1309 if(cmdline.
isset(
"cpp11"))
1345 case ost::OS_LINUX:
return "linux";
1346 case ost::OS_MACOS:
return "macos";
1347 case ost::OS_WIN:
return "win";
1348 case ost::NO_OS:
return "none";
1358 return ost::OS_LINUX;
1359 else if(os==
"macos")
1360 return ost::OS_MACOS;
1369 const std::string &what)
1384 "symbol table configuration entry '" +
id2string(
id) +
1385 "' must be a string constant");
1392 const std::string &what)
1405 "symbol table configuration entry '" +
id2string(
id) +
1406 "' must be a constant");
1413 "symbol table configuration entry '" +
id2string(
id) +
1414 "' must be convertible to mp_integer");
1478 "argument_evaluation_order") !=
1481 ansi_c.argument_evaluation_order =
1515 "object_bits should fit into pointer width");
1521 return "Running with "+std::to_string(
bv_encoding.object_bits)+
1525 (
bv_encoding.is_object_bits_default ?
"default" :
"user-specified")+
1538 #elif defined(__armel__)
1540 #elif defined(__aarch64__)
1542 #elif defined(__arm__)
1543 #ifdef __ARM_PCS_VFP
1548 #elif defined(_MIPSEL)
1549 #if _MIPS_SIM==_ABIO32
1551 #elif _MIPS_SIM==_ABIN32
1556 #elif defined(__mips__)
1557 #if _MIPS_SIM==_ABIO32
1559 #elif _MIPS_SIM==_ABIN32
1564 #elif defined(__powerpc__)
1565 #if defined(__ppc64__) || defined(__PPC64__) || \
1566 defined(__powerpc64__) || defined(__POWERPC64__)
1567 #ifdef __LITTLE_ENDIAN__
1575 #elif defined(__riscv)
1577 #elif defined(__sparc__)
1583 #elif defined(__ia64__)
1585 #elif defined(__s390x__)
1587 #elif defined(__s390__)
1589 #elif defined(__x86_64__)
1595 #elif defined(__i386__)
1597 #elif defined(_WIN64)
1599 #elif defined(_WIN32)
1601 #elif defined(__hppa__)
1603 #elif defined(__sh__)
1605 #elif defined(__loongarch__)
1607 #elif defined(__EMSCRIPTEN__)
1630 java.classpath.insert(
virtual void clear()
Reset the abstract state.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
std::string get_value(char option) const
virtual bool isset(char option) const
const std::list< std::string > & get_values(const std::string &option) const
Globally accessible architectural configuration.
void set_object_bits_from_symbol_table(const symbol_table_baset &)
Sets the number of bits used for object addresses.
void set_arch(const irep_idt &)
struct configt::bv_encodingt bv_encoding
bool set(const cmdlinet &cmdline)
std::string object_bits_info()
void set_classpath(const std::string &cp)
mp_integer max_malloc_size() const
The maximum allocation size is determined by the number of bits that are left in the pointer of width...
void set_from_symbol_table(const symbol_table_baset &)
static irep_idt this_architecture()
std::optional< std::string > main
struct configt::javat java
static irep_idt this_operating_system()
struct configt::ansi_ct ansi_c
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Base class for all expressions.
Thrown when users pass incorrect command line arguments, for example passing no files to analysis or ...
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
bool lookup(const irep_idt &name, const symbolt *&symbol) const override
See documentation for namespace_baset::lookup().
The symbol table base class interface.
const symbolt * lookup(const irep_idt &name) const
Find a symbol in the symbol table for read-only access.
const symbolst & symbols
Read-only field, used to look up symbols given their names.
exprt value
Initial value of symbol.
configt::bv_encodingt parse_object_bits_encoding(const std::string &argument, const std::size_t pointer_width)
Parses the object_bits argument from the command line arguments.
static unsigned unsigned_from_ns(const namespacet &ns, const std::string &what)
static irep_idt string_from_ns(const namespacet &ns, const std::string &what)
const std::string & id2string(const irep_idt &d)
mp_integer alignment(const typet &type, const namespacet &ns)
API to expression classes for Pointers.
const address_of_exprt & to_address_of_expr(const exprt &expr)
Cast an exprt to an address_of_exprt.
bool simplify(exprt &expr, const namespacet &ns)
#define UNREACHABLE
This should be used to mark dead code.
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
#define PRECONDITION(CONDITION)
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
char * getenv(const char *name)
void split_string(std::string_view s, char delim, std::vector< std::string > &result, bool strip, bool remove_empty)
void set_arch_spec_riscv64()
void set_arch_spec_loongarch64()
void set_ILP32()
int=32, long=32, pointer=32
void set_arch_spec_v850()
Sets up the widths of variables for the Renesas V850.
argument_evaluation_ordert
void set_arch_spec_hppa()
static std::string os_to_string(ost)
void set_ILP64()
int=64, long=64, pointer=64
void set_arch_spec_sparc(const irep_idt &subarch)
static ost string_to_os(const std::string &)
void set_argument_evaluation_order()
Sets the architectural parameter recording the order in which compilers evaluate the arguments of a f...
void set_LLP64()
int=32, long=32, pointer=64
void set_arch_spec_arm(const irep_idt &subarch)
@ malloc_failure_mode_none
static c_standardt default_c_standard()
void set_arch_spec_alpha()
void set_arch_spec_power(const irep_idt &subarch)
void set_arch_spec_s390()
void set_LP64()
int=32, long=64, pointer=64
void set_arch_spec_x86_64()
void set_LP32()
int=16, long=32, pointer=32
void set_arch_spec_s390x()
void set_arch_spec_mips(const irep_idt &subarch)
void set_arch_spec_i386()
void set_arch_spec_ia64()
void set_arch_spec_emscripten()
static cpp_standardt default_cpp_standard()