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 "ieee_float.h"
13 #include "irep.h"
14 
15 #include <list>
16 #include <optional>
17 
18 class cmdlinet;
19 class symbol_table_baset;
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 #define OPT_CONFIG_C_CPP \
25  "D:I:(include)(function)" \
26  "(c89)(c99)(c11)(cpp98)(cpp03)(cpp11)" \
27  "(unsigned-char)" \
28  "(round-to-even)(round-to-nearest)" \
29  "(round-to-plus-inf)(round-to-minus-inf)(round-to-zero)" \
30  "(no-library)"
31 
32 #define HELP_CONFIG_C_CPP \
33  " {y-I} {upath} \t set include path (C/C++)\n" \
34  " {y--include} {ufile} \t set include file (C/C++)\n" \
35  " {y-D} {umacro} \t define preprocessor macro (C/C++)\n" \
36  " {y--c89}, {y--c99}, {y--c11} \t " \
37  "set C language standard (default: " + \
38  std::string( \
39  configt::ansi_ct::default_c_standard() == \
40  configt::ansi_ct::c_standardt::C89 \
41  ? "c89" \
42  : configt::ansi_ct::default_c_standard() == \
43  configt::ansi_ct::c_standardt::C99 \
44  ? "c99" \
45  : configt::ansi_ct::default_c_standard() == \
46  configt::ansi_ct::c_standardt::C11 \
47  ? "c11" \
48  : "") + \
49  ")\n" \
50  " {y--cpp98}, {y--cpp03}, {y--cpp11} \t " \
51  "set C++ language standard (default: " + \
52  std::string( \
53  configt::cppt::default_cpp_standard() == \
54  configt::cppt::cpp_standardt::CPP98 \
55  ? "cpp98" \
56  : configt::cppt::default_cpp_standard() == \
57  configt::cppt::cpp_standardt::CPP03 \
58  ? "cpp03" \
59  : configt::cppt::default_cpp_standard() == \
60  configt::cppt::cpp_standardt::CPP11 \
61  ? "cpp11" \
62  : "") + \
63  ")\n" \
64  " {y--unsigned-char} \t make \"char\" unsigned by default\n" \
65  " {y--round-to-nearest}, {y--round-to-even} \t " \
66  "rounding towards nearest even (default)\n" \
67  " {y--round-to-plus-inf} \t rounding towards plus infinity\n" \
68  " {y--round-to-minus-inf} \t rounding towards minus infinity\n" \
69  " {y--round-to-zero} \t rounding towards zero\n" \
70  " {y--no-library} \t disable built-in abstract C library\n"
71 
72 #define OPT_CONFIG_LIBRARY \
73  "(malloc-fail-assert)(malloc-fail-null)(malloc-may-fail)" \
74  "(no-malloc-may-fail)" \
75  "(string-abstraction)"
76 
77 #define HELP_CONFIG_LIBRARY \
78  " {y--malloc-may-fail} \t allow malloc calls to return a null pointer\n" \
79  " {y--no-malloc-may-fail} \t disable potential malloc failure\n" \
80  " {y--malloc-fail-assert} \t " \
81  "set malloc failure mode to assert-then-assume\n" \
82  " {y--malloc-fail-null} \t set malloc failure mode to return null\n" \
83  " {y--string-abstraction} \t track C string lengths and zero-termination\n"
84 
85 #define OPT_CONFIG_JAVA "(classpath)(cp)(main-class)"
86 
87 #define OPT_CONFIG_PLATFORM \
88  "(arch):(os):" \
89  "(16)(32)(64)(LP64)(ILP64)(LLP64)(ILP32)(LP32)" \
90  "(little-endian)(big-endian)" \
91  "(i386-linux)" \
92  "(i386-win32)(win32)(winx64)" \
93  "(i386-macos)(ppc-macos)" \
94  "(gcc)"
95 
96 #define HELP_CONFIG_PLATFORM \
97  " {y--arch} {uarch_name} \t " \
98  "set architecture (default: " + \
99  id2string(configt::this_architecture()) + \
100  ") to one of: {yalpha}, {yarm}, {yarm64}, {yarmel}, {yarmhf}, {yhppa}, " \
101  "{yi386}, {yia64}, {ymips}, {ymips64}, {ymips64el}, {ymipsel}, " \
102  "{ymipsn32}, " \
103  "{ymipsn32el}, {ypowerpc}, {yppc64}, {yppc64le}, {yriscv64}, {ys390}, " \
104  "{ys390x}, {ysh4}, {ysparc}, {ysparc64}, {yv850}, {yx32}, {yx86_64}, or " \
105  "{ynone}\n" \
106  " {y--os} {uos_name} \t " \
107  "set operating system (default: " + \
108  id2string(configt::this_operating_system()) + \
109  ") to one of: {yfreebsd}, {ylinux}, {ymacos}, {ynetbsd}, {yopenbsd}, " \
110  "{ysolaris}, or {ywindows}\n" \
111  " {y--i386-linux}, {y--i386-win32}, {y--i386-macos}, {y--ppc-macos}, " \
112  "{y--win32}, {y--winx64} \t " \
113  "set architecture and operating system\n" \
114  " {y--LP64}, {y--ILP64}, {y--LLP64}, {y--ILP32}, {y--LP32} \t " \
115  "set width of int, long and pointers, but don't override default " \
116  "architecture and operating system\n" \
117  " {y--16}, {y--32}, {y--64} \t " \
118  "equivalent to {y--LP32}, {y--ILP32}, {y--LP64} (on Windows: " \
119  "{y--LLP64})\n" \
120  " {y--little-endian} \t allow little-endian word-byte conversions\n" \
121  " {y--big-endian} \t allow big-endian word-byte conversions\n" \
122  " {y--gcc} \t use GCC as preprocessor\n"
123 
124 #define OPT_CONFIG_BACKEND "(object-bits):"
125 
126 #define HELP_CONFIG_BACKEND \
127  " {y--object-bits} {un} \t number of bits used for object addresses\n"
128 
131 class configt
132 {
133 public:
134  struct ansi_ct
135  {
136  // for ANSI-C
137  std::size_t int_width;
138  std::size_t long_int_width;
139  std::size_t bool_width;
140  std::size_t char_width;
141  std::size_t short_int_width;
142  std::size_t long_long_int_width;
143  std::size_t pointer_width;
144  std::size_t single_width;
145  std::size_t double_width;
146  std::size_t long_double_width;
147  std::size_t wchar_t_width;
148 
149  // various language options
152  bool ts_18661_3_Floatn_types; // ISO/IEC TS 18661-3:2015
153  bool gcc__float128_type; // __float128, a gcc extension since 4.3/4.5
154  bool float16_type; // _Float16 (Clang >= 15, GCC >= 12)
155  bool bf16_type; // __bf16 (Clang >= 15, GCC >= 13)
157  enum class c_standardt
158  {
159  C89,
160  C99,
161  C11
164 
165  void set_c89()
166  {
168  for_has_scope = false;
169  }
170  void set_c99()
171  {
173  for_has_scope = true;
174  }
175  void set_c11()
176  {
178  for_has_scope = true;
179  }
180 
182 
183  void set_16();
184  void set_32();
185  void set_64();
186 
187  // http://www.unix.org/version2/whatsnew/lp64_wp.html
188  void set_LP64(); // int=32, long=64, pointer=64
189  void set_ILP64(); // int=64, long=64, pointer=64
190  void set_LLP64(); // int=32, long=32, pointer=64
191  void set_ILP32(); // int=32, long=32, pointer=32
192  void set_LP32(); // int=16, long=32, pointer=32
193 
194  // minimum alignment (in structs) measured in bytes
195  std::size_t alignment;
196 
197  // maximum minimum size of the operands for a machine
198  // instruction (in bytes)
199  std::size_t memory_operand_size;
200 
201  enum class endiannesst
202  {
206  };
208 
209  enum class ost
210  {
211  NO_OS,
212  OS_LINUX,
213  OS_MACOS,
214  OS_WIN
215  };
217 
218  static std::string os_to_string(ost);
219  static ost string_to_os(const std::string &);
220 
222 
223  // architecture-specific integer value of null pointer constant
225 
226  void set_arch_spec_i386();
227  void set_arch_spec_x86_64();
228  void set_arch_spec_power(const irep_idt &subarch);
229  void set_arch_spec_arm(const irep_idt &subarch);
230  void set_arch_spec_alpha();
231  void set_arch_spec_mips(const irep_idt &subarch);
232  void set_arch_spec_riscv64();
233  void set_arch_spec_s390();
234  void set_arch_spec_s390x();
235  void set_arch_spec_sparc(const irep_idt &subarch);
236  void set_arch_spec_ia64();
237  void set_arch_spec_x32();
238  void set_arch_spec_v850();
239  void set_arch_spec_hppa();
240  void set_arch_spec_sh4();
241 
242  enum class flavourt
243  {
244  NONE,
245  ANSI,
246  GCC,
247  ARM,
248  CLANG,
251  };
252  flavourt mode; // the syntax of source files
253 
254  enum class preprocessort
255  {
256  NONE,
257  GCC,
258  CLANG,
260  CODEWARRIOR,
261  ARM
262  };
263  preprocessort preprocessor; // the preprocessor to use
264 
265  std::list<std::string> defines;
266  std::list<std::string> undefines;
267  std::list<std::string> preprocessor_options;
268  std::list<std::string> include_paths;
269  std::list<std::string> include_files;
270 
271  enum class libt
272  {
273  LIB_NONE,
274  LIB_FULL
275  };
277 
279  bool malloc_may_fail = true;
280 
282  {
286  };
287 
289 
290  static const std::size_t default_object_bits = 8;
291 
295  std::optional<mp_integer> max_argc;
297 
298  struct cppt
299  {
300  enum class cpp_standardt
301  {
302  CPP98,
303  CPP03,
304  CPP11,
305  CPP14,
306  CPP17
309 
310  void set_cpp98()
311  {
313  }
314  void set_cpp03()
315  {
317  }
318  void set_cpp11()
319  {
321  }
322  void set_cpp14()
323  {
325  }
326  void set_cpp17()
327  {
329  }
330 
331  static const std::size_t default_object_bits = 8;
332  } cpp;
333 
334  struct verilogt
335  {
336  std::list<std::string> include_paths;
338 
339  struct javat
340  {
341  typedef std::list<std::string> classpatht;
344 
345  static const std::size_t default_object_bits = 16;
346  } java;
347 
349  {
350  // number of bits to encode heap object addresses
351  std::size_t object_bits = 8;
354 
355  // this is the function to start executing
356  std::optional<std::string> main;
357 
358  void set_arch(const irep_idt &);
359 
361 
362  bool set(const cmdlinet &cmdline);
363 
365  std::string object_bits_info();
366 
367  static irep_idt this_architecture();
369 
370 private:
371  void set_classpath(const std::string &cp);
372 };
373 
374 extern configt config;
375 
376 #endif // CPROVER_UTIL_CONFIG_H
Globally accessible architectural configuration.
Definition: config.h:132
void set_object_bits_from_symbol_table(const symbol_table_baset &)
Sets the number of bits used for object addresses.
Definition: config.cpp:1325
void set_arch(const irep_idt &)
Definition: config.cpp:702
struct configt::bv_encodingt bv_encoding
bool set(const cmdlinet &cmdline)
Definition: config.cpp:798
struct configt::verilogt verilog
std::string object_bits_info()
Definition: config.cpp:1350
void set_classpath(const std::string &cp)
Definition: config.cpp:1445
void set_from_symbol_table(const symbol_table_baset &)
Definition: config.cpp:1266
static irep_idt this_architecture()
Definition: config.cpp:1361
std::optional< std::string > main
Definition: config.h:356
struct configt::javat java
struct configt::cppt cpp
static irep_idt this_operating_system()
Definition: config.cpp:1461
struct configt::ansi_ct ansi_c
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:38
The symbol table base class interface.
configt config
Definition: config.cpp:25
std::size_t long_double_width
Definition: config.h:146
std::list< std::string > include_paths
Definition: config.h:268
bool for_has_scope
Definition: config.h:151
void set_arch_spec_x32()
Definition: config.cpp:557
enum configt::ansi_ct::c_standardt c_standard
void set_32()
Definition: config.cpp:32
void set_arch_spec_riscv64()
Definition: config.cpp:403
endiannesst endianness
Definition: config.h:207
bool float16_type
Definition: config.h:154
void set_16()
Definition: config.cpp:27
void set_arch_spec_sh4()
Definition: config.cpp:645
bool bf16_type
Definition: config.h:155
void set_ILP32()
int=32, long=32, pointer=32
Definition: config.cpp:111
bool ts_18661_3_Floatn_types
Definition: config.h:152
void set_arch_spec_v850()
Sets up the widths of variables for the Renesas V850.
Definition: config.cpp:593
bool wchar_t_is_unsigned
Definition: config.h:150
void set_arch_spec_hppa()
Definition: config.cpp:616
static std::string os_to_string(ost)
Definition: config.cpp:1187
std::size_t pointer_width
Definition: config.h:143
bool gcc__float128_type
Definition: config.h:153
std::optional< mp_integer > max_argc
Maximum value of argc, which is operating-systems dependent: Windows limits the number of characters ...
Definition: config.h:295
void set_c89()
Definition: config.h:165
std::list< std::string > include_files
Definition: config.h:269
void set_ILP64()
int=64, long=64, pointer=64
Definition: config.cpp:71
irep_idt arch
Definition: config.h:221
std::list< std::string > undefines
Definition: config.h:266
ieee_floatt::rounding_modet rounding_mode
Definition: config.h:181
void set_64()
Definition: config.cpp:37
std::list< std::string > preprocessor_options
Definition: config.h:267
void set_arch_spec_sparc(const irep_idt &subarch)
Definition: config.cpp:486
static ost string_to_os(const std::string &)
Definition: config.cpp:1202
std::list< std::string > defines
Definition: config.h:265
void set_c99()
Definition: config.h:170
bool single_precision_constant
Definition: config.h:156
void set_LLP64()
int=32, long=32, pointer=64
Definition: config.cpp:91
void set_arch_spec_arm(const irep_idt &subarch)
Definition: config.cpp:281
std::size_t wchar_t_width
Definition: config.h:147
preprocessort preprocessor
Definition: config.h:263
@ malloc_failure_mode_return_null
Definition: config.h:284
@ malloc_failure_mode_none
Definition: config.h:283
@ malloc_failure_mode_assert_then_assume
Definition: config.h:285
std::size_t double_width
Definition: config.h:145
bool malloc_may_fail
Definition: config.h:279
bool char_is_unsigned
Definition: config.h:150
static c_standardt default_c_standard()
Definition: config.cpp:675
void set_arch_spec_alpha()
Definition: config.cpp:324
std::size_t alignment
Definition: config.h:195
void set_arch_spec_power(const irep_idt &subarch)
Definition: config.cpp:220
std::size_t bool_width
Definition: config.h:139
bool string_abstraction
Definition: config.h:278
void set_arch_spec_s390()
Definition: config.cpp:429
void set_LP64()
int=32, long=64, pointer=64
Definition: config.cpp:47
void set_arch_spec_x86_64()
Definition: config.cpp:182
void set_LP32()
int=16, long=32, pointer=32
Definition: config.cpp:131
std::size_t memory_operand_size
Definition: config.h:199
std::size_t long_long_int_width
Definition: config.h:142
void set_arch_spec_s390x()
Definition: config.cpp:458
bool NULL_is_zero
Definition: config.h:224
std::size_t long_int_width
Definition: config.h:138
void set_arch_spec_mips(const irep_idt &subarch)
Definition: config.cpp:353
std::size_t single_width
Definition: config.h:144
void set_arch_spec_i386()
Definition: config.cpp:150
std::size_t short_int_width
Definition: config.h:141
std::size_t char_width
Definition: config.h:140
void set_c11()
Definition: config.h:175
static const std::size_t default_object_bits
Definition: config.h:290
flavourt mode
Definition: config.h:252
std::size_t int_width
Definition: config.h:137
malloc_failure_modet malloc_failure_mode
Definition: config.h:288
void set_arch_spec_ia64()
Definition: config.cpp:526
bool is_object_bits_default
Definition: config.h:352
std::size_t object_bits
Definition: config.h:351
void set_cpp14()
Definition: config.h:322
enum configt::cppt::cpp_standardt cpp_standard
void set_cpp11()
Definition: config.h:318
static const std::size_t default_object_bits
Definition: config.h:331
void set_cpp17()
Definition: config.h:326
void set_cpp03()
Definition: config.h:314
static cpp_standardt default_cpp_standard()
Definition: config.cpp:690
void set_cpp98()
Definition: config.h:310
classpatht classpath
Definition: config.h:342
std::list< std::string > classpatht
Definition: config.h:341
irep_idt main_class
Definition: config.h:343
static const std::size_t default_object_bits
Definition: config.h:345
std::list< std::string > include_paths
Definition: config.h:336