CBMC
goto_convert_class.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Program Transformation
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #ifndef CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
13 #define CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
14 
15 #include <list>
16 #include <vector>
17 #include <unordered_set>
18 
19 #include <util/message.h>
20 #include <util/namespace.h>
21 #include <util/replace_expr.h>
22 #include <util/std_code.h>
23 
24 #include "allocate_objects.h"
25 #include "destructor_tree.h"
26 #include "goto_program.h"
27 
29 
30 class goto_convertt:public messaget
31 {
32 public:
33  void
34  goto_convert(const codet &code, goto_programt &dest, const irep_idt &mode);
35 
37  symbol_table_baset &_symbol_table,
38  message_handlert &_message_handler):
39  messaget(_message_handler),
40  symbol_table(_symbol_table),
41  ns(_symbol_table),
42  tmp_symbol_prefix("goto_convertt")
43  {
44  }
45 
46  virtual ~goto_convertt()
47  {
48  }
49 
50 protected:
53  std::string tmp_symbol_prefix;
55 
56  void goto_convert_rec(
57  const codet &code,
58  goto_programt &dest,
59  const irep_idt &mode);
60 
61  //
62  // tools for symbols
63  //
65  const typet &type,
66  const std::string &suffix,
67  goto_programt &dest,
68  const source_locationt &,
69  const irep_idt &mode);
70 
72  const exprt &expr,
73  goto_programt &dest,
74  const irep_idt &mode);
75 
76  //
77  // translation of C expressions (with side effects)
78  // into the program logic
79  //
80 
81  void clean_expr(
82  exprt &expr,
83  goto_programt &dest,
84  const irep_idt &mode,
85  bool result_is_used = true);
86 
87  void
88  clean_expr_address_of(exprt &expr, goto_programt &dest, const irep_idt &mode);
89 
90  static bool needs_cleaning(const exprt &expr);
91 
92  // Do we need to introduce a temporary for the value of an assignment
93  // to the given lhs? E.g., a[i] needs a temporary as its value may change
94  // when i is changed; likewise, *p needs a temporary as its value may change
95  // when p is changed.
96  static bool assignment_lhs_needs_temporary(const exprt &lhs)
97  {
98  return lhs.id() != ID_symbol;
99  }
100 
101  void make_temp_symbol(
102  exprt &expr,
103  const std::string &suffix,
104  goto_programt &,
105  const irep_idt &mode);
106 
107  void rewrite_boolean(exprt &dest);
108 
109  static bool has_function_call(const exprt &expr);
110 
111  void remove_side_effect(
112  side_effect_exprt &expr,
113  goto_programt &dest,
114  const irep_idt &mode,
115  bool result_is_used,
116  bool address_taken);
117  void remove_assignment(
118  side_effect_exprt &expr,
119  goto_programt &dest,
120  bool result_is_used,
121  bool address_taken,
122  const irep_idt &mode);
123  void remove_pre(
124  side_effect_exprt &expr,
125  goto_programt &dest,
126  bool result_is_used,
127  bool address_taken,
128  const irep_idt &mode);
129  void remove_post(
130  side_effect_exprt &expr,
131  goto_programt &dest,
132  const irep_idt &mode,
133  bool result_is_used);
136  goto_programt &dest,
137  const irep_idt &mode,
138  bool result_is_used);
139  void remove_cpp_new(
140  side_effect_exprt &expr,
141  goto_programt &dest,
142  bool result_is_used);
143  void remove_cpp_delete(
144  side_effect_exprt &expr,
145  goto_programt &dest);
146  void remove_malloc(
147  side_effect_exprt &expr,
148  goto_programt &dest,
149  const irep_idt &mode,
150  bool result_is_used);
152  side_effect_exprt &expr,
153  goto_programt &dest);
155  side_effect_exprt &expr,
156  goto_programt &dest,
157  const irep_idt &mode,
158  bool result_is_used);
160  exprt &expr,
161  goto_programt &dest,
162  const irep_idt &mode);
163  void remove_overflow(
165  goto_programt &dest,
166  bool result_is_used,
167  const irep_idt &mode);
168 
169  virtual void do_cpp_new(
170  const exprt &lhs,
171  const side_effect_exprt &rhs,
172  goto_programt &dest);
173 
174  void do_java_new(
175  const exprt &lhs,
176  const side_effect_exprt &rhs,
177  goto_programt &dest);
178 
179  void do_java_new_array(
180  const exprt &lhs,
181  const side_effect_exprt &rhs,
182  goto_programt &dest);
183 
184  static void replace_new_object(
185  const exprt &object,
186  exprt &dest);
187 
188  void cpp_new_initializer(
189  const exprt &lhs,
190  const side_effect_exprt &rhs,
191  goto_programt &dest);
192 
193  //
194  // function calls
195  //
196 
197  virtual void do_function_call(
198  const exprt &lhs,
199  const exprt &function,
200  const exprt::operandst &arguments,
201  goto_programt &dest,
202  const irep_idt &mode);
203 
204  virtual void do_function_call_if(
205  const exprt &lhs,
206  const if_exprt &function,
207  const exprt::operandst &arguments,
208  goto_programt &dest,
209  const irep_idt &mode);
210 
211  virtual void do_function_call_symbol(
212  const exprt &lhs,
213  const symbol_exprt &function,
214  const exprt::operandst &arguments,
215  goto_programt &dest,
216  const irep_idt &mode);
217 
218  virtual void do_function_call_symbol(const symbolt &)
219  {
220  }
221 
222  virtual void do_function_call_other(
223  const exprt &lhs,
224  const exprt &function,
225  const exprt::operandst &arguments,
226  goto_programt &dest);
227 
228  //
229  // conversion
230  //
231  void convert_block(
232  const code_blockt &code,
233  goto_programt &dest,
234  const irep_idt &mode);
236  const code_frontend_declt &,
237  goto_programt &,
238  const irep_idt &mode);
239  void convert_decl_type(const codet &code, goto_programt &dest);
240  void convert_expression(
241  const code_expressiont &code,
242  goto_programt &dest,
243  const irep_idt &mode);
244  void convert_assign(
245  const code_assignt &code,
246  goto_programt &dest,
247  const irep_idt &mode);
248  void convert_cpp_delete(const codet &code, goto_programt &dest);
250  const codet &code,
252  const irep_idt &mode);
253  void
254  convert_for(const code_fort &code, goto_programt &dest, const irep_idt &mode);
255  void convert_while(
256  const code_whilet &code,
257  goto_programt &dest,
258  const irep_idt &mode);
259  void convert_dowhile(
260  const code_dowhilet &code,
261  goto_programt &dest,
262  const irep_idt &mode);
263  void convert_assume(
264  const code_assumet &code,
265  goto_programt &dest,
266  const irep_idt &mode);
267  void convert_assert(
268  const code_assertt &code,
269  goto_programt &dest,
270  const irep_idt &mode);
271  void convert_switch(
272  const code_switcht &code,
273  goto_programt &dest,
274  const irep_idt &mode);
275  void convert_break(
276  const code_breakt &code,
277  goto_programt &dest,
278  const irep_idt &mode);
279  void convert_return(
280  const code_frontend_returnt &,
281  goto_programt &dest,
282  const irep_idt &mode);
283  void convert_continue(
284  const code_continuet &code,
285  goto_programt &dest,
286  const irep_idt &mode);
287  void convert_ifthenelse(
288  const code_ifthenelset &code,
289  goto_programt &dest,
290  const irep_idt &mode);
291  void convert_goto(const code_gotot &code, goto_programt &dest);
292  void convert_gcc_computed_goto(const codet &code, goto_programt &dest);
293  void convert_skip(const codet &code, goto_programt &dest);
294  void convert_label(
295  const code_labelt &code,
296  goto_programt &dest,
297  const irep_idt &mode);
298  void convert_gcc_local_label(const codet &code, goto_programt &dest);
299  void convert_switch_case(
300  const code_switch_caset &code,
301  goto_programt &dest,
302  const irep_idt &mode);
305  goto_programt &dest,
306  const irep_idt &mode);
308  const code_function_callt &code,
309  goto_programt &dest,
310  const irep_idt &mode);
311  void convert_start_thread(const codet &code, goto_programt &dest);
312  void convert_end_thread(const codet &code, goto_programt &dest);
313  void convert_atomic_begin(const codet &code, goto_programt &dest);
314  void convert_atomic_end(const codet &code, goto_programt &dest);
316  const codet &code,
317  goto_programt &dest,
318  const irep_idt &mode);
320  const codet &code,
321  goto_programt &dest,
322  const irep_idt &mode);
323  void convert_msc_leave(
324  const codet &code,
325  goto_programt &dest,
326  const irep_idt &mode);
327  void convert_try_catch(
328  const codet &code,
329  goto_programt &dest,
330  const irep_idt &mode);
332  const codet &code,
333  goto_programt &dest,
334  const irep_idt &mode);
336  const codet &code,
337  goto_programt &dest,
338  const irep_idt &mode);
340  const codet &code,
341  goto_programt &dest,
342  const irep_idt &mode);
343  void convert_asm(const code_asmt &code, goto_programt &dest);
344 
345  void convert(const codet &code, goto_programt &dest, const irep_idt &mode);
346 
347  void copy(
348  const codet &code,
350  goto_programt &dest);
351 
352  //
353  // exceptions
354  //
355 
356  symbol_exprt exception_flag(const irep_idt &mode);
357 
359  const source_locationt &source_location,
360  goto_programt &dest,
361  const irep_idt &mode,
362  optionalt<node_indext> destructor_start_point = {},
363  optionalt<node_indext> destructor_end_point = {});
364 
365  //
366  // gotos
367  //
368 
369  void finish_gotos(goto_programt &dest, const irep_idt &mode);
372 
373  typedef std::map<irep_idt,
374  std::pair<goto_programt::targett, node_indext>>
376  typedef std::list<std::pair<goto_programt::targett, node_indext>>
378  typedef std::list<goto_programt::targett> computed_gotost;
380  typedef std::list<std::pair<goto_programt::targett, caset> > casest;
381  typedef std::map<goto_programt::targett, casest::iterator> cases_mapt;
382 
383  struct targetst
384  {
387 
392 
395 
398 
401 
403  return_set(false),
404  has_return_value(false),
405  break_set(false),
406  continue_set(false),
407  default_set(false),
408  throw_set(false),
409  leave_set(false),
414  {
415  }
416 
417  void set_break(goto_programt::targett _break_target)
418  {
419  break_set=true;
420  break_target=_break_target;
422  }
423 
424  void set_continue(goto_programt::targett _continue_target)
425  {
426  continue_set=true;
427  continue_target=_continue_target;
429  }
430 
431  void set_default(goto_programt::targett _default_target)
432  {
433  default_set=true;
434  default_target=_default_target;
435  }
436 
437  void set_return(goto_programt::targett _return_target)
438  {
439  return_set=true;
440  return_target=_return_target;
441  }
442 
443  void set_throw(goto_programt::targett _throw_target)
444  {
445  throw_set=true;
446  throw_target=_throw_target;
448  }
449 
450  void set_leave(goto_programt::targett _leave_target)
451  {
452  leave_set=true;
453  leave_target=_leave_target;
455  }
456  } targets;
457 
459  {
460  // for 'while', 'for', 'dowhile'
461 
463  {
468  }
469 
471  {
476  }
477 
481  };
482 
484  {
485  // for 'switch'
486 
488  {
496  }
497 
499  {
506  }
507 
512 
515  };
516 
518  {
519  // for 'try...catch' and the like
520 
521  explicit throw_targett(const targetst &targets)
522  {
526  }
527 
529  {
532  }
533 
535  bool throw_set;
537  };
538 
540  {
541  // for 'try...leave...finally'
542 
543  explicit leave_targett(const targetst &targets)
544  {
548  }
549 
551  {
554  }
555 
557  bool leave_set;
559  };
560 
562  const exprt &value,
563  const caset &case_op);
564 
565  // if(cond) { true_case } else { false_case }
566  void generate_ifthenelse(
567  const exprt &cond,
568  goto_programt &true_case,
569  goto_programt &false_case,
570  const source_locationt &,
571  goto_programt &dest,
572  const irep_idt &mode);
573 
574  // if(guard) goto target_true; else goto target_false;
576  const exprt &guard,
577  goto_programt::targett target_true,
578  goto_programt::targett target_false,
579  const source_locationt &,
580  goto_programt &dest,
581  const irep_idt &mode);
582 
583  // if(guard) goto target;
585  const exprt &guard,
586  goto_programt::targett target_true,
587  const source_locationt &,
588  goto_programt &dest,
589  const irep_idt &mode);
590 
591  // turn a OP b OP c into a list a, b, c
592  static void collect_operands(
593  const exprt &expr,
594  const irep_idt &id,
595  std::list<exprt> &dest);
596 
597  // START_THREAD; ... END_THREAD;
599  const code_blockt &thread_body,
600  goto_programt &dest,
601  const irep_idt &mode);
602 
603  //
604  // misc
605  //
606  irep_idt get_string_constant(const exprt &expr);
607  bool get_string_constant(const exprt &expr, irep_idt &);
608  exprt get_constant(const exprt &expr);
609 
624  void do_enum_is_in_range(
625  const exprt &lhs,
626  const symbol_exprt &function,
627  const exprt::operandst &arguments,
628  goto_programt &dest);
629 
630  // some built-in functions
631  void do_atomic_begin(
632  const exprt &lhs,
633  const symbol_exprt &function,
634  const exprt::operandst &arguments,
635  goto_programt &dest);
636  void do_atomic_end(
637  const exprt &lhs,
638  const symbol_exprt &function,
639  const exprt::operandst &arguments,
640  goto_programt &dest);
641  void do_create_thread(
642  const exprt &lhs,
643  const symbol_exprt &function,
644  const exprt::operandst &arguments,
645  goto_programt &dest);
646  void do_array_equal(
647  const exprt &lhs,
648  const symbol_exprt &rhs,
649  const exprt::operandst &arguments,
650  goto_programt &dest);
651  void do_array_op(
652  const irep_idt &id,
653  const exprt &lhs,
654  const symbol_exprt &function,
655  const exprt::operandst &arguments,
656  goto_programt &dest);
657  void do_printf(
658  const exprt &lhs,
659  const symbol_exprt &function,
660  const exprt::operandst &arguments,
661  goto_programt &dest);
662  void do_scanf(
663  const exprt &lhs,
664  const symbol_exprt &function,
665  const exprt::operandst &arguments,
666  goto_programt &dest);
667  void do_input(
668  const exprt &rhs,
669  const exprt::operandst &arguments,
670  goto_programt &dest);
671  void do_output(
672  const exprt &rhs,
673  const exprt::operandst &arguments,
674  goto_programt &dest);
675  void do_prob_coin(
676  const exprt &lhs,
677  const symbol_exprt &function,
678  const exprt::operandst &arguments,
679  goto_programt &dest);
680  void do_prob_uniform(
681  const exprt &lhs,
682  const symbol_exprt &function,
683  const exprt::operandst &arguments,
684  goto_programt &dest);
685  void do_havoc_slice(
686  const exprt &lhs,
687  const symbol_exprt &function,
688  const exprt::operandst &arguments,
689  goto_programt &dest,
690  const irep_idt &mode);
691 
692  exprt get_array_argument(const exprt &src);
693 };
694 
695 #endif // CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
messaget
Class that provides messages with a built-in verbosity 'level'.
Definition: message.h:154
goto_convertt::do_havoc_slice
void do_havoc_slice(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
Definition: builtin_functions.cpp:645
goto_convertt::convert_function_call
void convert_function_call(const code_function_callt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_function_call.cpp:18
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
goto_convertt::convert_dowhile
void convert_dowhile(const code_dowhilet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1051
code_blockt
A codet representing sequential composition of program statements.
Definition: std_code.h:129
goto_convertt::break_switch_targetst::cases
casest cases
Definition: goto_convert_class.h:513
goto_convertt::do_cpp_new
virtual void do_cpp_new(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
Definition: builtin_functions.cpp:389
code_switch_caset
codet representation of a switch-case, i.e. a case statement within a switch.
Definition: std_code.h:1022
goto_convertt::targetst::set_break
void set_break(goto_programt::targett _break_target)
Definition: goto_convert_class.h:417
goto_convertt::needs_cleaning
static bool needs_cleaning(const exprt &expr)
Returns 'true' for expressions that may change the program state.
Definition: goto_clean_expr.cpp:67
goto_convertt::do_output
void do_output(const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:328
goto_convertt::break_switch_targetst::default_target
goto_programt::targett default_target
Definition: goto_convert_class.h:509
goto_convertt::generate_conditional_branch
void generate_conditional_branch(const exprt &guard, goto_programt::targett target_true, goto_programt::targett target_false, const source_locationt &, goto_programt &dest, const irep_idt &mode)
if(guard) goto target_true; else goto target_false;
Definition: goto_convert.cpp:1700
goto_convertt::ns
namespacet ns
Definition: goto_convert_class.h:52
goto_convertt::convert_msc_try_finally
void convert_msc_try_finally(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:17
code_whilet
codet representing a while statement.
Definition: std_code.h:609
goto_convertt::targetst::leave_target
goto_programt::targett leave_target
Definition: goto_convert_class.h:397
goto_convertt::do_create_thread
void do_create_thread(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
goto_convertt::replace_new_object
static void replace_new_object(const exprt &object, exprt &dest)
Definition: goto_convert_side_effect.cpp:409
code_asmt
codet representation of an inline assembler statement.
Definition: std_code.h:1252
goto_convertt::convert
void convert(const codet &code, goto_programt &dest, const irep_idt &mode)
converts 'code' and appends the result to 'dest'
Definition: goto_convert.cpp:430
code_fort
codet representation of a for statement.
Definition: std_code.h:733
goto_convertt::leave_targett::leave_set
bool leave_set
Definition: goto_convert_class.h:557
goto_convertt::copy
void copy(const codet &code, goto_program_instruction_typet type, goto_programt &dest)
Definition: goto_convert.cpp:300
goto_convertt::targetst::default_set
bool default_set
Definition: goto_convert_class.h:386
typet
The type of an expression, extends irept.
Definition: type.h:28
goto_convertt::convert_frontend_decl
void convert_frontend_decl(const code_frontend_declt &, goto_programt &, const irep_idt &mode)
Definition: goto_convert.cpp:610
goto_convertt::clean_expr
void clean_expr(exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used=true)
Definition: goto_clean_expr.cpp:166
goto_convertt::get_array_argument
exprt get_array_argument(const exprt &src)
Definition: builtin_functions.cpp:538
goto_convertt::goto_convert_rec
void goto_convert_rec(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:287
goto_convertt::cpp_new_initializer
void cpp_new_initializer(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
builds a goto program for object initialization after new
Definition: builtin_functions.cpp:510
goto_convertt::has_function_call
static bool has_function_call(const exprt &expr)
Definition: goto_convert_side_effect.cpp:25
side_effect_expr_function_callt
A side_effect_exprt representation of a function call side effect.
Definition: std_code.h:1691
goto_convertt::remove_gcc_conditional_expression
void remove_gcc_conditional_expression(exprt &expr, goto_programt &dest, const irep_idt &mode)
Definition: goto_clean_expr.cpp:508
if_exprt
The trinary if-then-else operator.
Definition: std_expr.h:2322
goto_convertt::convert_skip
void convert_skip(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:841
goto_convertt::do_atomic_end
void do_atomic_end(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:366
goto_convertt::convert_CPROVER_try_finally
void convert_CPROVER_try_finally(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:212
goto_convertt::cases_mapt
std::map< goto_programt::targett, casest::iterator > cases_mapt
Definition: goto_convert_class.h:381
goto_convertt::convert_assert
void convert_assert(const code_assertt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:827
goto_convertt::~goto_convertt
virtual ~goto_convertt()
Definition: goto_convert_class.h:46
goto_convertt::tmp_symbol_prefix
std::string tmp_symbol_prefix
Definition: goto_convert_class.h:53
goto_convertt::convert_try_catch
void convert_try_catch(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:86
goto_convertt::finish_gotos
void finish_gotos(goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:109
goto_convertt::targetst::throw_target
goto_programt::targett throw_target
Definition: goto_convert_class.h:397
code_assertt
A non-fatal assertion, which checks a condition then permits execution to continue.
Definition: std_code.h:269
goto_convertt::convert_ifthenelse
void convert_ifthenelse(const code_ifthenelset &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1436
goto_convertt::do_function_call
virtual void do_function_call(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_function_call.cpp:31
goto_convertt::generate_ifthenelse
void generate_ifthenelse(const exprt &cond, goto_programt &true_case, goto_programt &false_case, const source_locationt &, goto_programt &dest, const irep_idt &mode)
if(guard) true_case; else false_case;
Definition: goto_convert.cpp:1509
code_frontend_declt
A codet representing the declaration of a local variable.
Definition: std_code.h:346
goto_convertt::convert_assume
void convert_assume(const code_assumet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:849
goto_convertt::remove_function_call
void remove_function_call(side_effect_expr_function_callt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
Definition: goto_convert_side_effect.cpp:354
goto_convertt::leave_targett
Definition: goto_convert_class.h:539
exprt
Base class for all expressions.
Definition: expr.h:55
goto_convertt::convert_block
void convert_block(const code_blockt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:543
goto_convertt::targetst::cases_map
cases_mapt cases_map
Definition: goto_convert_class.h:394
code_continuet
codet representation of a continue statement (within a for or while loop).
Definition: std_code.h:1217
goto_convertt::break_switch_targetst::default_set
bool default_set
Definition: goto_convert_class.h:510
irep_idt
dstringt irep_idt
Definition: irep.h:37
code_gcc_switch_case_ranget
codet representation of a switch-case, i.e. a case statement within a switch.
Definition: std_code.h:1096
goto_convertt::clean_expr_address_of
void clean_expr_address_of(exprt &expr, goto_programt &dest, const irep_idt &mode)
Definition: goto_clean_expr.cpp:439
node_indext
std::size_t node_indext
Definition: destructor_tree.h:15
symbol_exprt
Expression to hold a symbol (variable)
Definition: std_expr.h:112
namespace.h
goto_convertt::generate_thread_block
void generate_thread_block(const code_blockt &thread_body, goto_programt &dest, const irep_idt &mode)
Generates the necessary goto-instructions to represent a thread-block.
Definition: goto_convert.cpp:1950
goto_convertt::break_continue_targetst::break_continue_targetst
break_continue_targetst(const targetst &targets)
Definition: goto_convert_class.h:462
goto_convertt::do_array_equal
void do_array_equal(const exprt &lhs, const symbol_exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
goto_convertt::convert_switch_case
void convert_switch_case(const code_switch_caset &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:357
goto_convertt::targetst::throw_set
bool throw_set
Definition: goto_convert_class.h:386
code_ifthenelset
codet representation of an if-then-else statement.
Definition: std_code.h:459
goto_convertt::new_tmp_symbol
symbolt & new_tmp_symbol(const typet &type, const std::string &suffix, goto_programt &dest, const source_locationt &, const irep_idt &mode)
Definition: goto_convert.cpp:1861
goto_convertt::goto_convert
void goto_convert(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:279
goto_convertt::leave_targett::leave_targett
leave_targett(const targetst &targets)
Definition: goto_convert_class.h:543
goto_convertt::do_function_call_symbol
virtual void do_function_call_symbol(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
add function calls to function queue for later processing
Definition: builtin_functions.cpp:725
goto_convertt::throw_targett
Definition: goto_convert_class.h:517
goto_convertt::targetst::set_leave
void set_leave(goto_programt::targett _leave_target)
Definition: goto_convert_class.h:450
goto_convertt::targetst::leave_set
bool leave_set
Definition: goto_convert_class.h:386
goto_convertt::remove_overflow
void remove_overflow(side_effect_expr_overflowt &expr, goto_programt &dest, bool result_is_used, const irep_idt &mode)
Definition: goto_convert_side_effect.cpp:601
goto_convertt::targetst::has_return_value
bool has_return_value
Definition: goto_convert_class.h:385
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
goto_convertt::targetst::labels
labelst labels
Definition: goto_convert_class.h:388
goto_convertt::do_enum_is_in_range
void do_enum_is_in_range(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Converts calls to the built in enum_is_in_range function to a test that the given enum value is in th...
Definition: builtin_functions.cpp:618
goto_convertt::convert_break
void convert_break(const code_breakt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1270
code_function_callt
goto_instruction_codet representation of a function call statement.
Definition: goto_instruction_code.h:271
goto_convertt::targetst::gotos
gotost gotos
Definition: goto_convert_class.h:389
goto_convertt::break_switch_targetst::cases_map
cases_mapt cases_map
Definition: goto_convert_class.h:514
goto_convertt::exception_flag
symbol_exprt exception_flag(const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:236
code_dowhilet
codet representation of a do while statement.
Definition: std_code.h:671
goto_convertt::break_switch_targetst::restore
void restore(targetst &targets)
Definition: goto_convert_class.h:498
goto_convertt::targets
struct goto_convertt::targetst targets
goto_convertt::convert_expression
void convert_expression(const code_expressiont &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:573
goto_convertt::break_switch_targetst::break_target
goto_programt::targett break_target
Definition: goto_convert_class.h:508
goto_convertt::leave_targett::leave_stack_node
node_indext leave_stack_node
Definition: goto_convert_class.h:558
goto_convertt::convert_continue
void convert_continue(const code_continuet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1347
goto_convertt::do_scanf
void do_scanf(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:210
goto_convertt::unwind_destructor_stack
void unwind_destructor_stack(const source_locationt &source_location, goto_programt &dest, const irep_idt &mode, optionalt< node_indext > destructor_start_point={}, optionalt< node_indext > destructor_end_point={})
Unwinds the destructor stack and creates destructors for each node between destructor_start_point and...
Definition: goto_convert_exceptions.cpp:284
goto_convertt::convert_CPROVER_try_catch
void convert_CPROVER_try_catch(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:145
code_breakt
codet representation of a break statement (within a for or while loop).
Definition: std_code.h:1181
goto_convertt
Definition: goto_convert_class.h:30
goto_convertt::break_continue_targetst::break_set
bool break_set
Definition: goto_convert_class.h:480
goto_convertt::get_string_constant
irep_idt get_string_constant(const exprt &expr)
Definition: goto_convert.cpp:1821
goto_convertt::targetst::break_stack_node
node_indext break_stack_node
Definition: goto_convert_class.h:399
goto_convertt::rewrite_boolean
void rewrite_boolean(exprt &dest)
re-write boolean operators into ?:
Definition: goto_clean_expr.cpp:101
code_gotot
codet representation of a goto statement.
Definition: std_code.h:840
goto_convertt::targetst::break_target
goto_programt::targett break_target
Definition: goto_convert_class.h:396
goto_convertt::remove_assignment
void remove_assignment(side_effect_exprt &expr, goto_programt &dest, bool result_is_used, bool address_taken, const irep_idt &mode)
Definition: goto_convert_side_effect.cpp:38
code_labelt
codet representation of a label for branch targets.
Definition: std_code.h:958
goto_convertt::convert_CPROVER_throw
void convert_CPROVER_throw(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:181
goto_convertt::do_function_call_other
virtual void do_function_call_other(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: goto_convert_function_call.cpp:146
goto_convertt::optimize_guarded_gotos
void optimize_guarded_gotos(goto_programt &dest)
Rewrite "if(x) goto z; goto y; z:" into "if(!x) goto y;" This only works if the "goto y" is not a bra...
Definition: goto_convert.cpp:235
symbol_table_baset
The symbol table base class interface.
Definition: symbol_table_base.h:21
goto_convertt::do_java_new
void do_java_new(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
code_assumet
An assumption, which must hold in subsequent code.
Definition: std_code.h:216
goto_convertt::break_continue_targetst::continue_target
goto_programt::targett continue_target
Definition: goto_convert_class.h:479
goto_convertt::remove_statement_expression
void remove_statement_expression(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
Definition: goto_convert_side_effect.cpp:532
goto_convertt::remove_malloc
void remove_malloc(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
Definition: goto_convert_side_effect.cpp:463
goto_convertt::targetst::set_return
void set_return(goto_programt::targett _return_target)
Definition: goto_convert_class.h:437
goto_convertt::make_compound_literal
symbol_exprt make_compound_literal(const exprt &expr, goto_programt &dest, const irep_idt &mode)
Definition: goto_clean_expr.cpp:20
destructor_tree.h
goto_convertt::remove_cpp_new
void remove_cpp_new(side_effect_exprt &expr, goto_programt &dest, bool result_is_used)
Definition: goto_convert_side_effect.cpp:420
goto_convertt::convert_goto
void convert_goto(const code_gotot &code, goto_programt &dest)
Definition: goto_convert.cpp:1366
goto_convertt::break_switch_targetst::break_stack_node
node_indext break_stack_node
Definition: goto_convert_class.h:511
goto_convertt::targetst::return_set
bool return_set
Definition: goto_convert_class.h:385
goto_convertt::convert_return
void convert_return(const code_frontend_returnt &, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1287
irept::id
const irep_idt & id() const
Definition: irep.h:396
message_handlert
Definition: message.h:27
goto_convertt::targetst::continue_set
bool continue_set
Definition: goto_convert_class.h:385
goto_convertt::break_continue_targetst::restore
void restore(targetst &targets)
Definition: goto_convert_class.h:470
exprt::operandst
std::vector< exprt > operandst
Definition: expr.h:58
goto_convertt::targetst::break_set
bool break_set
Definition: goto_convert_class.h:385
goto_convertt::convert_for
void convert_for(const code_fort &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:903
goto_convertt::targetst::set_throw
void set_throw(goto_programt::targett _throw_target)
Definition: goto_convert_class.h:443
goto_convertt::remove_cpp_delete
void remove_cpp_delete(side_effect_exprt &expr, goto_programt &dest)
Definition: goto_convert_side_effect.cpp:447
goto_convertt::caset
exprt::operandst caset
Definition: goto_convert_class.h:379
goto_convertt::remove_post
void remove_post(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
Definition: goto_convert_side_effect.cpp:271
goto_convertt::get_constant
exprt get_constant(const exprt &expr)
Definition: goto_convert.cpp:1835
goto_convertt::goto_convertt
goto_convertt(symbol_table_baset &_symbol_table, message_handlert &_message_handler)
Definition: goto_convert_class.h:36
std_code.h
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
goto_convertt::convert_while
void convert_while(const code_whilet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:995
goto_convertt::convert_assign
void convert_assign(const code_assignt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:682
goto_convertt::targetst::default_target
goto_programt::targett default_target
Definition: goto_convert_class.h:397
goto_convertt::do_java_new_array
void do_java_new_array(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
goto_convertt::do_function_call_symbol
virtual void do_function_call_symbol(const symbolt &)
Definition: goto_convert_class.h:218
goto_program.h
goto_convertt::collect_operands
static void collect_operands(const exprt &expr, const irep_idt &id, std::list< exprt > &dest)
Definition: goto_convert.cpp:1482
goto_program_instruction_typet
goto_program_instruction_typet
The type of an instruction in a GOTO program.
Definition: goto_program.h:31
goto_convertt::do_function_call_if
virtual void do_function_call_if(const exprt &lhs, const if_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_function_call.cpp:83
lifetimet
lifetimet
Selects the kind of objects allocated.
Definition: allocate_objects.h:16
code_frontend_returnt
codet representation of a "return from a function" statement.
Definition: std_code.h:892
source_locationt
Definition: source_location.h:18
goto_convertt::remove_temporary_object
void remove_temporary_object(side_effect_exprt &expr, goto_programt &dest)
Definition: goto_convert_side_effect.cpp:496
goto_convertt::convert_asm
void convert_asm(const code_asmt &code, goto_programt &dest)
Definition: goto_asm.cpp:14
goto_convertt::finish_computed_gotos
void finish_computed_gotos(goto_programt &dest)
Definition: goto_convert.cpp:202
goto_convertt::do_input
void do_input(const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:313
goto_convertt::do_printf
void do_printf(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:196
goto_convertt::targetst
Definition: goto_convert_class.h:383
goto_convertt::do_atomic_begin
void do_atomic_begin(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:343
goto_convertt::break_switch_targetst::break_switch_targetst
break_switch_targetst(const targetst &targets)
Definition: goto_convert_class.h:487
goto_convertt::convert_msc_leave
void convert_msc_leave(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:70
goto_convertt::throw_targett::restore
void restore(targetst &targets)
Definition: goto_convert_class.h:528
goto_convertt::targetst::destructor_stack
destructor_treet destructor_stack
Definition: goto_convert_class.h:391
goto_convertt::case_guard
exprt case_guard(const exprt &value, const caset &case_op)
Definition: goto_convert.cpp:1120
goto_convertt::convert_gcc_local_label
void convert_gcc_local_label(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:350
code_switcht
codet representing a switch statement.
Definition: std_code.h:547
symbolt
Symbol table entry.
Definition: symbol.h:27
goto_convertt::convert_start_thread
void convert_start_thread(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:1388
goto_convertt::targetst::cases
casest cases
Definition: goto_convert_class.h:393
goto_convertt::convert_msc_try_except
void convert_msc_try_except(const codet &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert_exceptions.cpp:55
goto_convertt::break_switch_targetst::break_set
bool break_set
Definition: goto_convert_class.h:510
goto_convertt::gotost
std::list< std::pair< goto_programt::targett, node_indext > > gotost
Definition: goto_convert_class.h:377
goto_convertt::computed_gotost
std::list< goto_programt::targett > computed_gotost
Definition: goto_convert_class.h:378
goto_convertt::throw_targett::throw_set
bool throw_set
Definition: goto_convert_class.h:535
destructor_treet::get_current_node
node_indext get_current_node() const
Gets the node that the next addition will be added to as a child.
Definition: destructor_tree.cpp:97
lifetimet::STATIC_GLOBAL
@ STATIC_GLOBAL
Allocate global objects with static lifetime.
goto_convertt::remove_pre
void remove_pre(side_effect_exprt &expr, goto_programt &dest, bool result_is_used, bool address_taken, const irep_idt &mode)
Definition: goto_convert_side_effect.cpp:179
goto_convertt::targetst::set_continue
void set_continue(goto_programt::targett _continue_target)
Definition: goto_convert_class.h:424
goto_programt
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:72
goto_convertt::do_array_op
void do_array_op(const irep_idt &id, const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:571
goto_convertt::remove_side_effect
void remove_side_effect(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used, bool address_taken)
Definition: goto_convert_side_effect.cpp:673
goto_convertt::labelst
std::map< irep_idt, std::pair< goto_programt::targett, node_indext > > labelst
Definition: goto_convert_class.h:375
goto_convertt::symbol_table
symbol_table_baset & symbol_table
Definition: goto_convert_class.h:51
goto_convertt::break_continue_targetst::continue_set
bool continue_set
Definition: goto_convert_class.h:480
goto_convertt::leave_targett::leave_target
goto_programt::targett leave_target
Definition: goto_convert_class.h:556
goto_convertt::convert_cpp_delete
void convert_cpp_delete(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:765
goto_convertt::assignment_lhs_needs_temporary
static bool assignment_lhs_needs_temporary(const exprt &lhs)
Definition: goto_convert_class.h:96
goto_convertt::convert_loop_contracts
void convert_loop_contracts(const codet &code, goto_programt::targett loop, const irep_idt &mode)
Definition: goto_convert.cpp:861
side_effect_expr_overflowt
A Boolean expression returning true, iff the result of performing operation kind on operands a and b ...
Definition: c_expr.h:116
replace_expr.h
goto_convertt::convert_atomic_end
void convert_atomic_end(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:1424
goto_convertt::targetst::continue_target
goto_programt::targett continue_target
Definition: goto_convert_class.h:396
goto_convertt::break_switch_targetst
Definition: goto_convert_class.h:483
goto_convertt::throw_targett::throw_target
goto_programt::targett throw_target
Definition: goto_convert_class.h:534
code_assignt
A goto_instruction_codet representing an assignment in the program.
Definition: goto_instruction_code.h:22
goto_convertt::convert_label
void convert_label(const code_labelt &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:309
message.h
goto_convertt::targetst::leave_stack_node
node_indext leave_stack_node
Definition: goto_convert_class.h:400
goto_convertt::convert_gcc_switch_case_range
void convert_gcc_switch_case_range(const code_gcc_switch_case_ranget &, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:389
goto_convertt::lifetime
lifetimet lifetime
Definition: goto_convert_class.h:54
goto_convertt::break_continue_targetst
Definition: goto_convert_class.h:458
goto_convertt::targetst::set_default
void set_default(goto_programt::targett _default_target)
Definition: goto_convert_class.h:431
allocate_objects.h
goto_convertt::targetst::continue_stack_node
node_indext continue_stack_node
Definition: goto_convert_class.h:399
goto_convertt::throw_targett::throw_stack_node
node_indext throw_stack_node
Definition: goto_convert_class.h:536
goto_convertt::leave_targett::restore
void restore(targetst &targets)
Definition: goto_convert_class.h:550
goto_convertt::throw_targett::throw_targett
throw_targett(const targetst &targets)
Definition: goto_convert_class.h:521
goto_convertt::casest
std::list< std::pair< goto_programt::targett, caset > > casest
Definition: goto_convert_class.h:380
goto_convertt::targetst::targetst
targetst()
Definition: goto_convert_class.h:402
goto_programt::targett
instructionst::iterator targett
Definition: goto_program.h:586
side_effect_exprt
An expression containing a side effect.
Definition: std_code.h:1449
goto_convertt::convert_atomic_begin
void convert_atomic_begin(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:1412
goto_convertt::convert_decl_type
void convert_decl_type(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:675
goto_convertt::targetst::computed_gotos
computed_gotost computed_gotos
Definition: goto_convert_class.h:390
goto_convertt::do_prob_uniform
void do_prob_uniform(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:32
goto_convertt::do_prob_coin
void do_prob_coin(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
Definition: builtin_functions.cpp:110
goto_convertt::targetst::throw_stack_node
node_indext throw_stack_node
Definition: goto_convert_class.h:399
code_expressiont
codet representation of an expression statement.
Definition: std_code.h:1393
goto_convertt::convert_switch
void convert_switch(const code_switcht &code, goto_programt &dest, const irep_idt &mode)
Definition: goto_convert.cpp:1149
goto_convertt::break_continue_targetst::break_target
goto_programt::targett break_target
Definition: goto_convert_class.h:478
codet
Data structure for representing an arbitrary statement in a program.
Definition: std_code_base.h:28
destructor_treet
Tree to keep track of the destructors generated along each branch of a function.
Definition: destructor_tree.h:88
goto_convertt::targetst::return_target
goto_programt::targett return_target
Definition: goto_convert_class.h:396
goto_convertt::make_temp_symbol
void make_temp_symbol(exprt &expr, const std::string &suffix, goto_programt &, const irep_idt &mode)
Definition: goto_convert.cpp:1884
goto_convertt::convert_end_thread
void convert_end_thread(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:1400
goto_convertt::convert_gcc_computed_goto
void convert_gcc_computed_goto(const codet &code, goto_programt &dest)
Definition: goto_convert.cpp:1376