CBMC
config.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #ifndef CPROVER_UTIL_CONFIG_H
10 #define CPROVER_UTIL_CONFIG_H
11 
12 #include <list>
13 
14 #include "ieee_float.h"
15 #include "irep.h"
16 #include "optional.h"
17 
18 class cmdlinet;
19 class symbol_tablet;
20 
21 // Configt is the one place beyond *_parse_options where options are ... parsed.
22 // Options that are handled by configt are documented here.
23 
24 // clang-format off
25 #define OPT_CONFIG_C_CPP \
26  "D:I:(include)(function)" \
27  "(c89)(c99)(c11)(cpp98)(cpp03)(cpp11)" \
28  "(unsigned-char)" \
29  "(round-to-even)(round-to-nearest)" \
30  "(round-to-plus-inf)(round-to-minus-inf)(round-to-zero)" \
31  "(no-library)" \
32 
33 #define HELP_CONFIG_C_CPP \
34  " -I path set include path (C/C++)\n" \
35  " --include file set include file (C/C++)\n" \
36  " -D macro define preprocessor macro (C/C++)\n" \
37  " --c89, --c99, --c11 set C language standard (default: " \
38  << (configt::ansi_ct::default_c_standard()== \
39  configt::ansi_ct::c_standardt::C89?"c89": \
40  configt::ansi_ct::default_c_standard()== \
41  configt::ansi_ct::c_standardt::C99?"c99": \
42  configt::ansi_ct::default_c_standard()== \
43  configt::ansi_ct::c_standardt::C11?"c11":"") << ")\n"\
44  " --cpp98, --cpp03, --cpp11 set C++ language standard (default: " \
45  << (configt::cppt::default_cpp_standard()== \
46  configt::cppt::cpp_standardt::CPP98?"cpp98":\
47  configt::cppt::default_cpp_standard()== \
48  configt::cppt::cpp_standardt::CPP03?"cpp03":\
49  configt::cppt::default_cpp_standard()== \
50  configt::cppt::cpp_standardt::CPP11?"cpp11":"") << ")\n"\
51  " --unsigned-char make \"char\" unsigned by default\n" \
52  " --round-to-nearest, --round-to-even\n" \
53  " rounding towards nearest even (default)\n" \
54  " --round-to-plus-inf rounding towards plus infinity\n" \
55  " --round-to-minus-inf rounding towards minus infinity\n" \
56  " --round-to-zero rounding towards zero\n" \
57  " --no-library disable built-in abstract C library\n" \
58 
59 
60 #define OPT_CONFIG_LIBRARY \
61  "(malloc-fail-assert)(malloc-fail-null)(malloc-may-fail)" \
62  "(string-abstraction)" \
63 
64 #define HELP_CONFIG_LIBRARY \
65 " --malloc-may-fail allow malloc calls to return a null pointer\n" \
66 " --malloc-fail-assert set malloc failure mode to assert-then-assume\n"\
67 " --malloc-fail-null set malloc failure mode to return null\n" \
68 " --string-abstraction track C string lengths and zero-termination\n" \
69 
70 
71 #define OPT_CONFIG_JAVA \
72  "(classpath)(cp)(main-class)" \
73 
74 
75 #define OPT_CONFIG_PLATFORM \
76  "(arch):(os):" \
77  "(16)(32)(64)(LP64)(ILP64)(LLP64)(ILP32)(LP32)" \
78  "(little-endian)(big-endian)" \
79  "(i386-linux)" \
80  "(i386-win32)(win32)(winx64)" \
81  "(i386-macos)(ppc-macos)" \
82  "(gcc)" \
83 
84 #define HELP_CONFIG_PLATFORM \
85  " --arch <arch> set architecture (default: " \
86  << configt::this_architecture() << ")\n" \
87  " to one of: alpha, arm, arm64, armel, armhf,\n"\
88  " hppa, i386, ia64, mips, mips64, mips64el,\n" \
89  " mipsel, mipsn32, mipsn32el, powerpc, ppc64,\n"\
90  " ppc64le, riscv64, s390, s390x, sh4, sparc,\n" \
91  " sparc64, v850, x32, x86_64, or none\n" \
92  " --os <os> set operating system (default: " \
93  << configt::this_operating_system() << ")\n" \
94  " to one of: freebsd, linux, macos, solaris,\n" \
95  " or windows\n" \
96  " --i386-linux, --i386-win32, --i386-macos, --ppc-macos\n" \
97  " --win32, --winx64 set architecture and operating system\n" \
98  " --LP64, --ILP64, --LLP64,\n" \
99  " --ILP32, --LP32 set width of int, long and pointers, but\n" \
100  " don't override default architecture and\n" \
101  " operating system\n" \
102  " --16, --32, --64 equivalent to --LP32, --ILP32, --LP64 (on\n" \
103  " Windows: --LLP64)\n" \
104  " --little-endian allow little-endian word-byte conversions\n" \
105  " --big-endian allow big-endian word-byte conversions\n" \
106  " --gcc use GCC as preprocessor\n" \
107 
108 #define OPT_CONFIG_BACKEND \
109  "(object-bits):" \
110 
111 #define HELP_CONFIG_BACKEND \
112  " --object-bits n number of bits used for object addresses\n"
113 
114 // clang-format on
115 
118 class configt
119 {
120 public:
121  struct ansi_ct
122  {
123  // for ANSI-C
124  std::size_t int_width;
125  std::size_t long_int_width;
126  std::size_t bool_width;
127  std::size_t char_width;
128  std::size_t short_int_width;
129  std::size_t long_long_int_width;
130  std::size_t pointer_width;
131  std::size_t single_width;
132  std::size_t double_width;
133  std::size_t long_double_width;
134  std::size_t wchar_t_width;
135 
136  // various language options
139  bool ts_18661_3_Floatn_types; // ISO/IEC TS 18661-3:2015
140  bool gcc__float128_type; // __float128, a gcc extension since 4.3/4.5
142  enum class c_standardt
143  {
144  C89,
145  C99,
146  C11
147  } c_standard;
149 
150  void set_c89()
151  {
153  for_has_scope = false;
154  }
155  void set_c99()
156  {
158  for_has_scope = true;
159  }
160  void set_c11()
161  {
163  for_has_scope = true;
164  }
165 
167 
168  void set_16();
169  void set_32();
170  void set_64();
171 
172  // http://www.unix.org/version2/whatsnew/lp64_wp.html
173  void set_LP64(); // int=32, long=64, pointer=64
174  void set_ILP64(); // int=64, long=64, pointer=64
175  void set_LLP64(); // int=32, long=32, pointer=64
176  void set_ILP32(); // int=32, long=32, pointer=32
177  void set_LP32(); // int=16, long=32, pointer=32
178 
179  // minimum alignment (in structs) measured in bytes
180  std::size_t alignment;
181 
182  // maximum minimum size of the operands for a machine
183  // instruction (in bytes)
184  std::size_t memory_operand_size;
185 
186  enum class endiannesst
187  {
191  };
193 
194  enum class ost
195  {
196  NO_OS,
197  OS_LINUX,
198  OS_MACOS,
199  OS_WIN
200  };
202 
203  static std::string os_to_string(ost);
204  static ost string_to_os(const std::string &);
205 
207 
208  // architecture-specific integer value of null pointer constant
210 
211  void set_arch_spec_i386();
212  void set_arch_spec_x86_64();
213  void set_arch_spec_power(const irep_idt &subarch);
214  void set_arch_spec_arm(const irep_idt &subarch);
215  void set_arch_spec_alpha();
216  void set_arch_spec_mips(const irep_idt &subarch);
217  void set_arch_spec_riscv64();
218  void set_arch_spec_s390();
219  void set_arch_spec_s390x();
220  void set_arch_spec_sparc(const irep_idt &subarch);
221  void set_arch_spec_ia64();
222  void set_arch_spec_x32();
223  void set_arch_spec_v850();
224  void set_arch_spec_hppa();
225  void set_arch_spec_sh4();
226 
227  enum class flavourt
228  {
229  NONE,
230  ANSI,
231  GCC,
232  ARM,
233  CLANG,
236  };
237  flavourt mode; // the syntax of source files
238 
239  enum class preprocessort
240  {
241  NONE,
242  GCC,
243  CLANG,
245  CODEWARRIOR,
246  ARM
247  };
248  preprocessort preprocessor; // the preprocessor to use
249 
250  std::list<std::string> defines;
251  std::list<std::string> undefines;
252  std::list<std::string> preprocessor_options;
253  std::list<std::string> include_paths;
254  std::list<std::string> include_files;
255 
256  enum class libt
257  {
258  LIB_NONE,
259  LIB_FULL
260  };
262 
264  bool malloc_may_fail = false;
265 
267  {
271  };
272 
274 
275  static const std::size_t default_object_bits = 8;
276 
281  } ansi_c;
282 
283  struct cppt
284  {
285  enum class cpp_standardt
286  {
287  CPP98,
288  CPP03,
289  CPP11,
290  CPP14,
291  CPP17
292  } cpp_standard;
294 
295  void set_cpp98()
296  {
298  }
299  void set_cpp03()
300  {
302  }
303  void set_cpp11()
304  {
306  }
307  void set_cpp14()
308  {
310  }
311  void set_cpp17()
312  {
314  }
315 
316  static const std::size_t default_object_bits = 8;
317  } cpp;
318 
319  struct verilogt
320  {
321  std::list<std::string> include_paths;
322  } verilog;
323 
324  struct javat
325  {
326  typedef std::list<std::string> classpatht;
329 
330  static const std::size_t default_object_bits = 16;
331  } java;
332 
334  {
335  // number of bits to encode heap object addresses
336  std::size_t object_bits = 8;
338  } bv_encoding;
339 
340  // this is the function to start executing
342 
343  void set_arch(const irep_idt &);
344 
345  void set_from_symbol_table(const symbol_tablet &);
346 
347  bool set(const cmdlinet &cmdline);
348 
350  std::string object_bits_info();
351 
352  static irep_idt this_architecture();
354 
355 private:
356  void set_classpath(const std::string &cp);
357 };
358 
359 extern configt config;
360 
361 #endif // CPROVER_UTIL_CONFIG_H
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
configt::ansi_ct::ts_18661_3_Floatn_types
bool ts_18661_3_Floatn_types
Definition: config.h:139
configt::cppt::cpp_standardt::CPP98
@ CPP98
configt::bv_encodingt::object_bits
std::size_t object_bits
Definition: config.h:336
configt::ansi_ct::defines
std::list< std::string > defines
Definition: config.h:250
configt::ansi_ct::bool_width
std::size_t bool_width
Definition: config.h:126
configt::verilog
struct configt::verilogt verilog
configt::object_bits_info
std::string object_bits_info()
Definition: config.cpp:1339
configt::ansi_ct::set_c99
void set_c99()
Definition: config.h:155
symbol_tablet
The symbol table.
Definition: symbol_table.h:13
configt::cppt
Definition: config.h:283
configt::ansi_ct::NULL_is_zero
bool NULL_is_zero
Definition: config.h:209
configt::javat::main_class
irep_idt main_class
Definition: config.h:328
configt::ansi_ct::string_to_os
static ost string_to_os(const std::string &)
Definition: config.cpp:1190
configt::ansi_ct::ost
ost
Definition: config.h:194
configt::bv_encoding
struct configt::bv_encodingt bv_encoding
configt::ansi_ct::for_has_scope
bool for_has_scope
Definition: config.h:138
configt::cppt::cpp_standardt
cpp_standardt
Definition: config.h:285
configt::ansi_ct::set_arch_spec_s390x
void set_arch_spec_s390x()
Definition: config.cpp:458
configt::ansi_ct::wchar_t_width
std::size_t wchar_t_width
Definition: config.h:134
configt::cppt::set_cpp17
void set_cpp17()
Definition: config.h:311
configt::ansi_ct::endiannesst
endiannesst
Definition: config.h:186
configt::ansi_ct::ost::OS_MACOS
@ OS_MACOS
configt::ansi_ct::preprocessort::CLANG
@ CLANG
configt::ansi_ct::include_paths
std::list< std::string > include_paths
Definition: config.h:253
configt::ansi_ct::malloc_failure_mode_assert_then_assume
@ malloc_failure_mode_assert_then_assume
Definition: config.h:270
configt::ansi_ct::flavourt::CODEWARRIOR
@ CODEWARRIOR
optional.h
configt::ansi_ct::set_arch_spec_mips
void set_arch_spec_mips(const irep_idt &subarch)
Definition: config.cpp:353
configt::ansi_ct::os
ost os
Definition: config.h:201
configt::cppt::cpp_standardt::CPP03
@ CPP03
configt::ansi_ct::flavourt::VISUAL_STUDIO
@ VISUAL_STUDIO
configt::ansi_ct::set_32
void set_32()
Definition: config.cpp:32
configt::ansi_ct::set_64
void set_64()
Definition: config.cpp:37
configt::main
optionalt< std::string > main
Definition: config.h:341
configt::ansi_ct::set_arch_spec_i386
void set_arch_spec_i386()
Definition: config.cpp:150
configt::ansi_ct::set_16
void set_16()
Definition: config.cpp:27
configt::ansi_ct::rounding_mode
ieee_floatt::rounding_modet rounding_mode
Definition: config.h:166
configt::ansi_ct::alignment
std::size_t alignment
Definition: config.h:180
configt::cppt::cpp_standardt::CPP17
@ CPP17
configt::ansi_ct::set_LP32
void set_LP32()
int=16, long=32, pointer=32
Definition: config.cpp:131
configt::ansi_ct::set_arch_spec_power
void set_arch_spec_power(const irep_idt &subarch)
Definition: config.cpp:220
configt::ansi_ct::undefines
std::list< std::string > undefines
Definition: config.h:251
configt::ansi_c
struct configt::ansi_ct ansi_c
configt::ansi_ct::flavourt::ARM
@ ARM
configt::ansi_ct::set_arch_spec_hppa
void set_arch_spec_hppa()
Definition: config.cpp:616
configt::javat::classpath
classpatht classpath
Definition: config.h:327
configt::ansi_ct::libt::LIB_NONE
@ LIB_NONE
configt::ansi_ct::flavourt::CLANG
@ CLANG
configt::ansi_ct
Definition: config.h:121
configt
Globally accessible architectural configuration.
Definition: config.h:118
configt::ansi_ct::flavourt::NONE
@ NONE
configt::ansi_ct::char_width
std::size_t char_width
Definition: config.h:127
configt::cppt::set_cpp98
void set_cpp98()
Definition: config.h:295
configt::ansi_ct::endiannesst::NO_ENDIANNESS
@ NO_ENDIANNESS
configt::ansi_ct::set_arch_spec_ia64
void set_arch_spec_ia64()
Definition: config.cpp:526
config
configt config
Definition: config.cpp:25
configt::ansi_ct::libt
libt
Definition: config.h:256
configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN
@ IS_LITTLE_ENDIAN
configt::bv_encodingt
Definition: config.h:333
configt::ansi_ct::c_standardt::C89
@ C89
configt::cppt::set_cpp14
void set_cpp14()
Definition: config.h:307
cmdlinet
Definition: cmdline.h:20
configt::ansi_ct::set_arch_spec_arm
void set_arch_spec_arm(const irep_idt &subarch)
Definition: config.cpp:281
configt::ansi_ct::wchar_t_is_unsigned
bool wchar_t_is_unsigned
Definition: config.h:137
configt::ansi_ct::set_arch_spec_s390
void set_arch_spec_s390()
Definition: config.cpp:429
configt::ansi_ct::double_width
std::size_t double_width
Definition: config.h:132
configt::ansi_ct::preprocessor
preprocessort preprocessor
Definition: config.h:248
configt::ansi_ct::malloc_failure_mode_return_null
@ malloc_failure_mode_return_null
Definition: config.h:269
configt::ansi_ct::set_arch_spec_riscv64
void set_arch_spec_riscv64()
Definition: config.cpp:403
configt::verilogt::include_paths
std::list< std::string > include_paths
Definition: config.h:321
configt::ansi_ct::default_object_bits
static const std::size_t default_object_bits
Definition: config.h:275
configt::cppt::default_object_bits
static const std::size_t default_object_bits
Definition: config.h:316
configt::ansi_ct::string_abstraction
bool string_abstraction
Definition: config.h:263
configt::ansi_ct::set_arch_spec_alpha
void set_arch_spec_alpha()
Definition: config.cpp:324
configt::bv_encodingt::is_object_bits_default
bool is_object_bits_default
Definition: config.h:337
configt::cppt::set_cpp11
void set_cpp11()
Definition: config.h:303
configt::ansi_ct::memory_operand_size
std::size_t memory_operand_size
Definition: config.h:184
configt::ansi_ct::ost::OS_LINUX
@ OS_LINUX
configt::ansi_ct::flavourt::ANSI
@ ANSI
configt::ansi_ct::max_argc
optionalt< mp_integer > max_argc
Maximum value of argc, which is operating-systems dependent: Windows limits the number of characters ...
Definition: config.h:280
configt::ansi_ct::set_ILP64
void set_ILP64()
int=64, long=64, pointer=64
Definition: config.cpp:71
configt::ansi_ct::long_long_int_width
std::size_t long_long_int_width
Definition: config.h:129
configt::this_operating_system
static irep_idt this_operating_system()
Definition: config.cpp:1450
configt::ansi_ct::malloc_failure_mode_none
@ malloc_failure_mode_none
Definition: config.h:268
configt::javat::classpatht
std::list< std::string > classpatht
Definition: config.h:326
configt::ansi_ct::arch
irep_idt arch
Definition: config.h:206
configt::ansi_ct::ost::OS_WIN
@ OS_WIN
configt::ansi_ct::set_LLP64
void set_LLP64()
int=32, long=32, pointer=64
Definition: config.cpp:91
configt::set_from_symbol_table
void set_from_symbol_table(const symbol_tablet &)
Definition: config.cpp:1254
ieee_floatt::rounding_modet
rounding_modet
Definition: ieee_float.h:123
configt::ansi_ct::os_to_string
static std::string os_to_string(ost)
Definition: config.cpp:1175
configt::javat::default_object_bits
static const std::size_t default_object_bits
Definition: config.h:330
configt::ansi_ct::preprocessor_options
std::list< std::string > preprocessor_options
Definition: config.h:252
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
configt::ansi_ct::include_files
std::list< std::string > include_files
Definition: config.h:254
configt::ansi_ct::ost::NO_OS
@ NO_OS
configt::ansi_ct::preprocessort::GCC
@ GCC
configt::ansi_ct::set_ILP32
void set_ILP32()
int=32, long=32, pointer=32
Definition: config.cpp:111
configt::ansi_ct::default_c_standard
static c_standardt default_c_standard()
Definition: config.cpp:675
configt::ansi_ct::c_standardt::C99
@ C99
configt::ansi_ct::preprocessort::NONE
@ NONE
configt::ansi_ct::set_c11
void set_c11()
Definition: config.h:160
configt::this_architecture
static irep_idt this_architecture()
Definition: config.cpp:1350
configt::ansi_ct::libt::LIB_FULL
@ LIB_FULL
configt::verilogt
Definition: config.h:319
configt::ansi_ct::mode
flavourt mode
Definition: config.h:237
configt::ansi_ct::c_standardt::C11
@ C11
preprocessort
Definition: preprocessor.h:20
configt::ansi_ct::set_c89
void set_c89()
Definition: config.h:150
configt::ansi_ct::preprocessort::VISUAL_STUDIO
@ VISUAL_STUDIO
configt::ansi_ct::endiannesst::IS_BIG_ENDIAN
@ IS_BIG_ENDIAN
configt::set
bool set(const cmdlinet &cmdline)
Definition: config.cpp:798
configt::cppt::default_cpp_standard
static cpp_standardt default_cpp_standard()
Definition: config.cpp:690
configt::ansi_ct::c_standard
enum configt::ansi_ct::c_standardt c_standard
configt::ansi_ct::set_arch_spec_sparc
void set_arch_spec_sparc(const irep_idt &subarch)
Definition: config.cpp:486
ieee_float.h
configt::ansi_ct::set_LP64
void set_LP64()
int=32, long=64, pointer=64
Definition: config.cpp:47
configt::ansi_ct::set_arch_spec_sh4
void set_arch_spec_sh4()
Definition: config.cpp:645
configt::ansi_ct::long_double_width
std::size_t long_double_width
Definition: config.h:133
configt::java
struct configt::javat java
configt::cppt::cpp_standardt::CPP14
@ CPP14
configt::ansi_ct::set_arch_spec_v850
void set_arch_spec_v850()
Sets up the widths of variables for the Renesas V850.
Definition: config.cpp:593
configt::ansi_ct::short_int_width
std::size_t short_int_width
Definition: config.h:128
configt::ansi_ct::char_is_unsigned
bool char_is_unsigned
Definition: config.h:137
configt::ansi_ct::flavourt::GCC
@ GCC
configt::ansi_ct::set_arch_spec_x86_64
void set_arch_spec_x86_64()
Definition: config.cpp:182
configt::cppt::cpp_standardt::CPP11
@ CPP11
configt::ansi_ct::set_arch_spec_x32
void set_arch_spec_x32()
Definition: config.cpp:557
configt::ansi_ct::malloc_failure_mode
malloc_failure_modet malloc_failure_mode
Definition: config.h:273
configt::ansi_ct::pointer_width
std::size_t pointer_width
Definition: config.h:130
configt::ansi_ct::single_width
std::size_t single_width
Definition: config.h:131
configt::ansi_ct::flavourt
flavourt
Definition: config.h:227
configt::ansi_ct::lib
libt lib
Definition: config.h:261
configt::cpp
struct configt::cppt cpp
configt::ansi_ct::malloc_failure_modet
malloc_failure_modet
Definition: config.h:266
configt::set_classpath
void set_classpath(const std::string &cp)
Definition: config.cpp:1434
configt::ansi_ct::malloc_may_fail
bool malloc_may_fail
Definition: config.h:264
configt::ansi_ct::single_precision_constant
bool single_precision_constant
Definition: config.h:141
configt::ansi_ct::gcc__float128_type
bool gcc__float128_type
Definition: config.h:140
configt::set_object_bits_from_symbol_table
void set_object_bits_from_symbol_table(const symbol_tablet &)
Sets the number of bits used for object addresses.
Definition: config.cpp:1314
configt::ansi_ct::c_standardt
c_standardt
Definition: config.h:142
configt::set_arch
void set_arch(const irep_idt &)
Definition: config.cpp:702
configt::ansi_ct::int_width
std::size_t int_width
Definition: config.h:124
configt::javat
Definition: config.h:324
configt::ansi_ct::preprocessort::ARM
@ ARM
configt::ansi_ct::preprocessort::CODEWARRIOR
@ CODEWARRIOR
configt::ansi_ct::endianness
endiannesst endianness
Definition: config.h:192
configt::ansi_ct::long_int_width
std::size_t long_int_width
Definition: config.h:125
irep.h
configt::cppt::cpp_standard
enum configt::cppt::cpp_standardt cpp_standard
configt::cppt::set_cpp03
void set_cpp03()
Definition: config.h:299