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 <util/message.h>
16 #include <util/namespace.h>
17 #include <util/replace_expr.h>
18 #include <util/std_code.h>
19 
20 #include "allocate_objects.h"
21 #include "goto_program.h"
22 #include "scope_tree.h"
23 
24 #include <list>
25 #include <unordered_set>
26 #include <vector>
27 
30 
31 class goto_convertt:public messaget
32 {
33 public:
34  void
35  goto_convert(const codet &code, goto_programt &dest, const irep_idt &mode);
36 
38  symbol_table_baset &_symbol_table,
39  message_handlert &_message_handler):
40  messaget(_message_handler),
41  symbol_table(_symbol_table),
42  ns(_symbol_table),
43  tmp_symbol_prefix("goto_convertt")
44  {
45  }
46 
47  virtual ~goto_convertt()
48  {
49  }
50 
51 protected:
54  std::string tmp_symbol_prefix;
56 
57  void goto_convert_rec(
58  const codet &code,
59  goto_programt &dest,
60  const irep_idt &mode);
61 
62  //
63  // tools for symbols
64  //
66  const typet &type,
67  const std::string &suffix,
68  goto_programt &dest,
69  const source_locationt &,
70  const irep_idt &mode);
71 
73  const exprt &expr,
74  goto_programt &dest,
75  const irep_idt &mode);
76 
77  //
78  // translation of C expressions (with side effects)
79  // into the program logic
80  //
81 
82  void clean_expr(
83  exprt &expr,
84  goto_programt &dest,
85  const irep_idt &mode,
86  bool result_is_used = true);
87 
88  void
89  clean_expr_address_of(exprt &expr, goto_programt &dest, const irep_idt &mode);
90 
91  static bool needs_cleaning(const exprt &expr);
92 
93  // Do we need to introduce a temporary for the value of an assignment
94  // to the given lhs? E.g., a[i] needs a temporary as its value may change
95  // when i is changed; likewise, *p needs a temporary as its value may change
96  // when p is changed.
97  static bool assignment_lhs_needs_temporary(const exprt &lhs)
98  {
99  return lhs.id() != ID_symbol;
100  }
101 
102  void make_temp_symbol(
103  exprt &expr,
104  const std::string &suffix,
105  goto_programt &,
106  const irep_idt &mode);
107 
108  void rewrite_boolean(exprt &dest);
109 
110  void remove_side_effect(
111  side_effect_exprt &expr,
112  goto_programt &dest,
113  const irep_idt &mode,
114  bool result_is_used,
115  bool address_taken);
116  void remove_assignment(
117  side_effect_exprt &expr,
118  goto_programt &dest,
119  bool result_is_used,
120  bool address_taken,
121  const irep_idt &mode);
122  void remove_pre(
123  side_effect_exprt &expr,
124  goto_programt &dest,
125  bool result_is_used,
126  bool address_taken,
127  const irep_idt &mode);
128  void remove_post(
129  side_effect_exprt &expr,
130  goto_programt &dest,
131  const irep_idt &mode,
132  bool result_is_used);
135  goto_programt &dest,
136  const irep_idt &mode,
137  bool result_is_used);
138  void remove_cpp_new(
139  side_effect_exprt &expr,
140  goto_programt &dest,
141  bool result_is_used);
142  void remove_cpp_delete(
143  side_effect_exprt &expr,
144  goto_programt &dest);
145  void remove_malloc(
146  side_effect_exprt &expr,
147  goto_programt &dest,
148  const irep_idt &mode,
149  bool result_is_used);
151  side_effect_exprt &expr,
152  goto_programt &dest);
154  side_effect_exprt &expr,
155  goto_programt &dest,
156  const irep_idt &mode,
157  bool result_is_used);
159  exprt &expr,
160  goto_programt &dest,
161  const irep_idt &mode);
162  void remove_overflow(
164  goto_programt &dest,
165  bool result_is_used,
166  const irep_idt &mode);
167 
168  virtual void do_cpp_new(
169  const exprt &lhs,
170  const side_effect_exprt &rhs,
171  goto_programt &dest);
172 
174  const exprt &lhs,
175  const side_effect_exprt &rhs,
176  goto_programt &dest);
177 
179  const exprt &lhs,
180  const side_effect_exprt &rhs,
181  goto_programt &dest);
182 
183  static void replace_new_object(
184  const exprt &object,
185  exprt &dest);
186 
187  void cpp_new_initializer(
188  const exprt &lhs,
189  const side_effect_exprt &rhs,
190  goto_programt &dest);
191 
192  //
193  // function calls
194  //
195 
196  virtual void do_function_call(
197  const exprt &lhs,
198  const exprt &function,
199  const exprt::operandst &arguments,
200  goto_programt &dest,
201  const irep_idt &mode);
202 
203  virtual void do_function_call_if(
204  const exprt &lhs,
205  const if_exprt &function,
206  const exprt::operandst &arguments,
207  goto_programt &dest,
208  const irep_idt &mode);
209 
210  virtual void do_function_call_symbol(
211  const exprt &lhs,
212  const symbol_exprt &function,
213  const exprt::operandst &arguments,
214  goto_programt &dest,
215  const irep_idt &mode);
216 
217  virtual void do_function_call_symbol(const symbolt &)
218  {
219  }
220 
221  virtual void do_function_call_other(
222  const exprt &lhs,
223  const exprt &function,
224  const exprt::operandst &arguments,
225  goto_programt &dest);
226 
227  //
228  // conversion
229  //
230  void convert_block(
231  const code_blockt &code,
232  goto_programt &dest,
233  const irep_idt &mode);
235  const code_frontend_declt &,
236  goto_programt &,
237  const irep_idt &mode);
238  void convert_decl_type(const codet &code, goto_programt &dest);
239  void convert_expression(
240  const code_expressiont &code,
241  goto_programt &dest,
242  const irep_idt &mode);
243  void convert_assign(
244  const code_assignt &code,
245  goto_programt &dest,
246  const irep_idt &mode);
247  void convert_cpp_delete(const codet &code, goto_programt &dest);
249  const codet &code,
251  const irep_idt &mode);
252  void
253  convert_for(const code_fort &code, goto_programt &dest, const irep_idt &mode);
254  void convert_while(
255  const code_whilet &code,
256  goto_programt &dest,
257  const irep_idt &mode);
258  void convert_dowhile(
259  const code_dowhilet &code,
260  goto_programt &dest,
261  const irep_idt &mode);
262  void convert_assume(
263  const code_assumet &code,
264  goto_programt &dest,
265  const irep_idt &mode);
266  void convert_assert(
267  const code_assertt &code,
268  goto_programt &dest,
269  const irep_idt &mode);
270  void convert_switch(
271  const code_switcht &code,
272  goto_programt &dest,
273  const irep_idt &mode);
274  void convert_break(
275  const code_breakt &code,
276  goto_programt &dest,
277  const irep_idt &mode);
278  void convert_return(
279  const code_frontend_returnt &,
280  goto_programt &dest,
281  const irep_idt &mode);
282  void convert_continue(
283  const code_continuet &code,
284  goto_programt &dest,
285  const irep_idt &mode);
286  void convert_ifthenelse(
287  const code_ifthenelset &code,
288  goto_programt &dest,
289  const irep_idt &mode);
290  void convert_goto(const code_gotot &code, goto_programt &dest);
291  void convert_gcc_computed_goto(const codet &code, goto_programt &dest);
292  void convert_skip(const codet &code, goto_programt &dest);
293  void convert_label(
294  const code_labelt &code,
295  goto_programt &dest,
296  const irep_idt &mode);
297  void convert_gcc_local_label(const codet &code, goto_programt &dest);
298  void convert_switch_case(
299  const code_switch_caset &code,
300  goto_programt &dest,
301  const irep_idt &mode);
304  goto_programt &dest,
305  const irep_idt &mode);
307  const code_function_callt &code,
308  goto_programt &dest,
309  const irep_idt &mode);
310  void convert_start_thread(const codet &code, goto_programt &dest);
311  void convert_end_thread(const codet &code, goto_programt &dest);
312  void convert_atomic_begin(const codet &code, goto_programt &dest);
313  void convert_atomic_end(const codet &code, goto_programt &dest);
315  const codet &code,
316  goto_programt &dest,
317  const irep_idt &mode);
319  const codet &code,
320  goto_programt &dest,
321  const irep_idt &mode);
322  void convert_msc_leave(
323  const codet &code,
324  goto_programt &dest,
325  const irep_idt &mode);
326  void convert_try_catch(
327  const codet &code,
328  goto_programt &dest,
329  const irep_idt &mode);
331  const codet &code,
332  goto_programt &dest,
333  const irep_idt &mode);
335  const codet &code,
336  goto_programt &dest,
337  const irep_idt &mode);
339  const codet &code,
340  goto_programt &dest,
341  const irep_idt &mode);
342  void convert_asm(const code_asmt &code, goto_programt &dest);
343 
344  void convert(const codet &code, goto_programt &dest, const irep_idt &mode);
345 
346  void copy(
347  const codet &code,
349  goto_programt &dest);
350 
351  //
352  // exceptions
353  //
354 
355  symbol_exprt exception_flag(const irep_idt &mode);
356 
358  const source_locationt &source_location,
359  goto_programt &dest,
360  const irep_idt &mode,
361  std::optional<node_indext> destructor_end_point = {},
362  std::optional<node_indext> destructor_start_point = {});
363 
365  goto_programt &dest,
366  std::unordered_map<irep_idt, symbolt, irep_id_hash> &label_flags,
367  const build_declaration_hops_inputst &inputs);
368 
369  //
370  // gotos
371  //
372 
373  void finish_gotos(goto_programt &dest, const irep_idt &mode);
376 
377  typedef std::map<irep_idt,
378  std::pair<goto_programt::targett, node_indext>>
380  typedef std::list<std::pair<goto_programt::targett, node_indext>>
382  typedef std::list<goto_programt::targett> computed_gotost;
384  typedef std::list<std::pair<goto_programt::targett, caset> > casest;
385  typedef std::map<
387  casest::iterator,
390 
391  struct targetst
392  {
393  goto_programt *prefix = nullptr;
394  goto_programt *suffix = nullptr;
395 
398 
403 
406 
409 
412 
414  return_set(false),
415  has_return_value(false),
416  break_set(false),
417  continue_set(false),
418  default_set(false),
419  throw_set(false),
420  leave_set(false),
425  {
426  }
427 
428  void set_break(goto_programt::targett _break_target)
429  {
430  break_set=true;
431  break_target=_break_target;
433  }
434 
435  void set_continue(goto_programt::targett _continue_target)
436  {
437  continue_set=true;
438  continue_target=_continue_target;
440  }
441 
442  void set_default(goto_programt::targett _default_target)
443  {
444  default_set=true;
445  default_target=_default_target;
446  }
447 
448  void set_return(goto_programt::targett _return_target)
449  {
450  return_set=true;
451  return_target=_return_target;
452  }
453 
454  void set_throw(goto_programt::targett _throw_target)
455  {
456  throw_set=true;
457  throw_target=_throw_target;
459  }
460 
461  void set_leave(goto_programt::targett _leave_target)
462  {
463  leave_set=true;
464  leave_target=_leave_target;
466  }
468 
470  {
471  // for 'while', 'for', 'dowhile'
472 
474  {
479  }
480 
482  {
487  }
488 
492  };
493 
495  {
496  // for 'switch'
497 
499  {
507  }
508 
510  {
517  }
518 
523 
526  };
527 
529  {
530  // for 'try...catch' and the like
531 
532  explicit throw_targett(const targetst &targets)
533  {
537  }
538 
540  {
543  }
544 
546  bool throw_set;
548  };
549 
551  {
552  // for 'try...leave...finally'
553 
554  explicit leave_targett(const targetst &targets)
555  {
559  }
560 
562  {
565  }
566 
568  bool leave_set;
570  };
571 
573  const exprt &value,
574  const caset &case_op);
575 
576  // if(cond) { true_case } else { false_case }
577  void generate_ifthenelse(
578  const exprt &cond,
579  const source_locationt &,
580  goto_programt &true_case,
581  const source_locationt &,
582  goto_programt &false_case,
583  const source_locationt &,
584  goto_programt &dest,
585  const irep_idt &mode);
586 
587  // if(guard) goto target_true; else goto target_false;
589  const exprt &guard,
590  goto_programt::targett target_true,
591  goto_programt::targett target_false,
592  const source_locationt &,
593  goto_programt &dest,
594  const irep_idt &mode);
595 
596  // if(guard) goto target;
598  const exprt &guard,
599  goto_programt::targett target_true,
600  const source_locationt &,
601  goto_programt &dest,
602  const irep_idt &mode);
603 
604  // turn a OP b OP c into a list a, b, c
605  static void collect_operands(
606  const exprt &expr,
607  const irep_idt &id,
608  std::list<exprt> &dest);
609 
610  // START_THREAD; ... END_THREAD;
612  const code_blockt &thread_body,
613  goto_programt &dest,
614  const irep_idt &mode);
615 
616  //
617  // misc
618  //
619  irep_idt get_string_constant(const exprt &expr);
620  bool get_string_constant(const exprt &expr, irep_idt &);
621  exprt get_constant(const exprt &expr);
622 
623  // some built-in functions
624  void do_atomic_begin(
625  const exprt &lhs,
626  const symbol_exprt &function,
627  const exprt::operandst &arguments,
628  goto_programt &dest);
629  void do_atomic_end(
630  const exprt &lhs,
631  const symbol_exprt &function,
632  const exprt::operandst &arguments,
633  goto_programt &dest);
635  const exprt &lhs,
636  const symbol_exprt &function,
637  const exprt::operandst &arguments,
638  goto_programt &dest);
640  const exprt &lhs,
641  const symbol_exprt &rhs,
642  const exprt::operandst &arguments,
643  goto_programt &dest);
644  void do_array_op(
645  const irep_idt &id,
646  const exprt &lhs,
647  const symbol_exprt &function,
648  const exprt::operandst &arguments,
649  goto_programt &dest);
650  void do_printf(
651  const exprt &lhs,
652  const symbol_exprt &function,
653  const exprt::operandst &arguments,
654  goto_programt &dest);
655  void do_scanf(
656  const exprt &lhs,
657  const symbol_exprt &function,
658  const exprt::operandst &arguments,
659  goto_programt &dest);
660  void do_input(
661  const exprt &rhs,
662  const exprt::operandst &arguments,
663  goto_programt &dest);
664  void do_output(
665  const exprt &rhs,
666  const exprt::operandst &arguments,
667  goto_programt &dest);
668  void do_prob_coin(
669  const exprt &lhs,
670  const symbol_exprt &function,
671  const exprt::operandst &arguments,
672  goto_programt &dest);
673  void do_prob_uniform(
674  const exprt &lhs,
675  const symbol_exprt &function,
676  const exprt::operandst &arguments,
677  goto_programt &dest);
678  void do_havoc_slice(
679  const exprt &lhs,
680  const symbol_exprt &function,
681  const exprt::operandst &arguments,
682  goto_programt &dest,
683  const irep_idt &mode);
684  void do_alloca(
685  const exprt &lhs,
686  const symbol_exprt &function,
687  const exprt::operandst &arguments,
688  goto_programt &dest,
689  const irep_idt &mode);
690 
691  exprt get_array_argument(const exprt &src);
692 };
693 
694 #endif // CPROVER_GOTO_PROGRAMS_GOTO_CONVERT_CLASS_H
std::unordered_set< symbol_exprt, irep_hash > address_taken(const std::vector< exprt > &src)
lifetimet
Selects the kind of objects allocated.
@ STATIC_GLOBAL
Allocate global objects with static lifetime.
static exprt guard(const exprt::operandst &guards, exprt cond)
codet representation of an inline assembler statement.
Definition: std_code.h:1253
A non-fatal assertion, which checks a condition then permits execution to continue.
Definition: std_code.h:270
A goto_instruction_codet representing an assignment in the program.
An assumption, which must hold in subsequent code.
Definition: std_code.h:217
A codet representing sequential composition of program statements.
Definition: std_code.h:130
codet representation of a break statement (within a for or while loop).
Definition: std_code.h:1182
codet representation of a continue statement (within a for or while loop).
Definition: std_code.h:1218
codet representation of a do while statement.
Definition: std_code.h:672
codet representation of an expression statement.
Definition: std_code.h:1394
codet representation of a for statement.
Definition: std_code.h:734
A codet representing the declaration of a local variable.
Definition: std_code.h:347
codet representation of a "return from a function" statement.
Definition: std_code.h:893
goto_instruction_codet representation of a function call statement.
codet representation of a switch-case, i.e. a case statement within a switch.
Definition: std_code.h:1097
codet representation of a goto statement.
Definition: std_code.h:841
codet representation of an if-then-else statement.
Definition: std_code.h:460
codet representation of a label for branch targets.
Definition: std_code.h:959
codet representation of a switch-case, i.e. a case statement within a switch.
Definition: std_code.h:1023
codet representing a switch statement.
Definition: std_code.h:548
codet representing a while statement.
Definition: std_code.h:610
Data structure for representing an arbitrary statement in a program.
Definition: std_code_base.h:29
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:38
Base class for all expressions.
Definition: expr.h:56
std::vector< exprt > operandst
Definition: expr.h:58
void convert_for(const code_fort &code, goto_programt &dest, const irep_idt &mode)
void convert_assume(const code_assumet &code, goto_programt &dest, const irep_idt &mode)
void remove_temporary_object(side_effect_exprt &expr, goto_programt &dest)
void remove_function_call(side_effect_expr_function_callt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
void do_havoc_slice(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
symbol_table_baset & symbol_table
void do_input(const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void remove_pre(side_effect_exprt &expr, goto_programt &dest, bool result_is_used, bool address_taken, const irep_idt &mode)
void convert_expression(const code_expressiont &code, goto_programt &dest, const irep_idt &mode)
void do_array_op(const irep_idt &id, const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void convert_while(const code_whilet &code, goto_programt &dest, const irep_idt &mode)
void convert_assign(const code_assignt &code, goto_programt &dest, const irep_idt &mode)
void convert_gcc_computed_goto(const codet &code, goto_programt &dest)
void goto_convert_rec(const codet &code, goto_programt &dest, const irep_idt &mode)
void convert_CPROVER_throw(const codet &code, goto_programt &dest, const irep_idt &mode)
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...
void convert_atomic_begin(const codet &code, goto_programt &dest)
virtual void do_function_call_if(const exprt &lhs, const if_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
void goto_convert(const codet &code, goto_programt &dest, const irep_idt &mode)
void remove_overflow(side_effect_expr_overflowt &expr, goto_programt &dest, bool result_is_used, const irep_idt &mode)
void convert_msc_try_finally(const codet &code, goto_programt &dest, const irep_idt &mode)
void convert_gcc_switch_case_range(const code_gcc_switch_case_ranget &, goto_programt &dest, const irep_idt &mode)
virtual void do_function_call(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
irep_idt get_string_constant(const exprt &expr)
void convert_label(const code_labelt &code, goto_programt &dest, const irep_idt &mode)
void copy(const codet &code, goto_program_instruction_typet type, goto_programt &dest)
exprt get_constant(const exprt &expr)
void generate_ifthenelse(const exprt &cond, const source_locationt &, goto_programt &true_case, const source_locationt &, goto_programt &false_case, const source_locationt &, goto_programt &dest, const irep_idt &mode)
if(guard) true_case; else false_case;
void remove_post(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
void convert_start_thread(const codet &code, goto_programt &dest)
void finish_gotos(goto_programt &dest, const irep_idt &mode)
void remove_malloc(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
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;
void convert_ifthenelse(const code_ifthenelset &code, goto_programt &dest, const irep_idt &mode)
void do_prob_coin(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void convert_atomic_end(const codet &code, goto_programt &dest)
void unwind_destructor_stack(const source_locationt &source_location, goto_programt &dest, const irep_idt &mode, std::optional< node_indext > destructor_end_point={}, std::optional< node_indext > destructor_start_point={})
Unwinds the destructor stack and creates destructors for each node between destructor_start_point and...
void remove_cpp_delete(side_effect_exprt &expr, goto_programt &dest)
std::string tmp_symbol_prefix
void convert_frontend_decl(const code_frontend_declt &, goto_programt &, const irep_idt &mode)
void convert_gcc_local_label(const codet &code, goto_programt &dest)
void remove_side_effect(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used, bool address_taken)
struct goto_convertt::targetst targets
void convert_break(const code_breakt &code, goto_programt &dest, const irep_idt &mode)
void convert_function_call(const code_function_callt &code, goto_programt &dest, const irep_idt &mode)
symbolt & new_tmp_symbol(const typet &type, const std::string &suffix, goto_programt &dest, const source_locationt &, const irep_idt &mode)
void do_atomic_end(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void convert_goto(const code_gotot &code, goto_programt &dest)
symbol_exprt exception_flag(const irep_idt &mode)
exprt case_guard(const exprt &value, const caset &case_op)
void convert_CPROVER_try_catch(const codet &code, goto_programt &dest, const irep_idt &mode)
void remove_statement_expression(side_effect_exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used)
void convert_cpp_delete(const codet &code, goto_programt &dest)
void convert_switch(const code_switcht &code, goto_programt &dest, const irep_idt &mode)
static void collect_operands(const exprt &expr, const irep_idt &id, std::list< exprt > &dest)
void do_java_new(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
symbol_exprt make_compound_literal(const exprt &expr, goto_programt &dest, const irep_idt &mode)
void convert_decl_type(const codet &code, goto_programt &dest)
void convert_dowhile(const code_dowhilet &code, goto_programt &dest, const irep_idt &mode)
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
void clean_expr(exprt &expr, goto_programt &dest, const irep_idt &mode, bool result_is_used=true)
void convert_loop_contracts(const codet &code, goto_programt::targett loop, const irep_idt &mode)
void convert_skip(const codet &code, goto_programt &dest)
void convert_asm(const code_asmt &code, goto_programt &dest)
Definition: goto_asm.cpp:14
void convert_switch_case(const code_switch_caset &code, goto_programt &dest, const irep_idt &mode)
void do_output(const exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void convert_msc_try_except(const codet &code, goto_programt &dest, const irep_idt &mode)
void convert_continue(const code_continuet &code, goto_programt &dest, const irep_idt &mode)
void convert_try_catch(const codet &code, goto_programt &dest, const irep_idt &mode)
void cpp_new_initializer(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
builds a goto program for object initialization after new
goto_convertt(symbol_table_baset &_symbol_table, message_handlert &_message_handler)
std::map< irep_idt, std::pair< goto_programt::targett, node_indext > > labelst
void do_printf(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void build_declaration_hops(goto_programt &dest, std::unordered_map< irep_idt, symbolt, irep_id_hash > &label_flags, const build_declaration_hops_inputst &inputs)
exprt get_array_argument(const exprt &src)
void convert_assert(const code_assertt &code, goto_programt &dest, const irep_idt &mode)
static bool needs_cleaning(const exprt &expr)
Returns 'true' for expressions that may change the program state.
void do_java_new_array(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
void clean_expr_address_of(exprt &expr, goto_programt &dest, const irep_idt &mode)
virtual void do_function_call_symbol(const symbolt &)
void remove_assignment(side_effect_exprt &expr, goto_programt &dest, bool result_is_used, bool address_taken, const irep_idt &mode)
void do_alloca(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest, const irep_idt &mode)
alloca allocates memory that is freed when leaving the function (and not the block,...
virtual void do_function_call_other(const exprt &lhs, const exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void finish_computed_gotos(goto_programt &dest)
void do_scanf(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void convert(const codet &code, goto_programt &dest, const irep_idt &mode)
converts 'code' and appends the result to 'dest'
void do_create_thread(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void convert_CPROVER_try_finally(const codet &code, goto_programt &dest, const irep_idt &mode)
virtual ~goto_convertt()
std::list< std::pair< goto_programt::targett, node_indext > > gotost
exprt::operandst caset
void do_atomic_begin(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
void remove_cpp_new(side_effect_exprt &expr, goto_programt &dest, bool result_is_used)
void do_array_equal(const exprt &lhs, const symbol_exprt &rhs, const exprt::operandst &arguments, goto_programt &dest)
void remove_gcc_conditional_expression(exprt &expr, goto_programt &dest, const irep_idt &mode)
static void replace_new_object(const exprt &object, exprt &dest)
void convert_msc_leave(const codet &code, goto_programt &dest, const irep_idt &mode)
void make_temp_symbol(exprt &expr, const std::string &suffix, goto_programt &, const irep_idt &mode)
void convert_return(const code_frontend_returnt &, goto_programt &dest, const irep_idt &mode)
virtual void do_cpp_new(const exprt &lhs, const side_effect_exprt &rhs, goto_programt &dest)
void convert_block(const code_blockt &code, goto_programt &dest, const irep_idt &mode)
std::list< goto_programt::targett > computed_gotost
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.
std::map< goto_programt::targett, casest::iterator, goto_programt::target_less_than > cases_mapt
void rewrite_boolean(exprt &dest)
re-write boolean operators into ?:
void do_prob_uniform(const exprt &lhs, const symbol_exprt &function, const exprt::operandst &arguments, goto_programt &dest)
static bool assignment_lhs_needs_temporary(const exprt &lhs)
std::list< std::pair< goto_programt::targett, caset > > casest
void convert_end_thread(const codet &code, goto_programt &dest)
A generic container class for the GOTO intermediate representation of one function.
Definition: goto_program.h:73
instructionst::iterator targett
Definition: goto_program.h:614
The trinary if-then-else operator.
Definition: std_expr.h:2370
const irep_idt & id() const
Definition: irep.h:384
Class that provides messages with a built-in verbosity 'level'.
Definition: message.h:155
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:94
Tree to keep track of the destructors generated along each branch of a function.
Definition: scope_tree.h:93
node_indext get_current_node() const
Gets the node that the next addition will be added to as a child.
Definition: scope_tree.cpp:109
A side_effect_exprt representation of a function call side effect.
Definition: std_code.h:1692
A Boolean expression returning true, iff the result of performing operation kind on operands a and b ...
Definition: c_expr.h:117
An expression containing a side effect.
Definition: std_code.h:1450
Expression to hold a symbol (variable)
Definition: std_expr.h:131
The symbol table base class interface.
Symbol table entry.
Definition: symbol.h:28
The type of an expression, extends irept.
Definition: type.h:29
Concrete Goto Program.
goto_program_instruction_typet
The type of an instruction in a GOTO program.
Definition: goto_program.h:32
std::size_t node_indext
Definition: scope_tree.h:19
break_continue_targetst(const targetst &targets)
break_switch_targetst(const targetst &targets)
void restore(targetst &targets)
leave_targett(const targetst &targets)
goto_programt::targett leave_target
computed_gotost computed_gotos
goto_programt::targett continue_target
void set_leave(goto_programt::targett _leave_target)
void set_return(goto_programt::targett _return_target)
void set_break(goto_programt::targett _break_target)
goto_programt::targett default_target
goto_programt::targett return_target
goto_programt::targett leave_target
void set_throw(goto_programt::targett _throw_target)
void set_default(goto_programt::targett _default_target)
void set_continue(goto_programt::targett _continue_target)
goto_programt::targett throw_target
goto_programt::targett break_target
goto_programt::targett throw_target
throw_targett(const targetst &targets)
void restore(targetst &targets)
A total order over targett and const_targett.
Definition: goto_program.h:392
dstringt irep_idt