34 var_mapt::const_iterator it=
var_map.find(
object);
74 const std::string &suffix,
93 return new_symbol.
name;
101 for(
const auto &vars :
var_map)
106 assignment(goto_program, t, source_location, vars.second.w_buff0_used,
108 assignment(goto_program, t, source_location, vars.second.w_buff1_used,
110 assignment(goto_program, t, source_location, vars.second.flush_delayed,
112 assignment(goto_program, t, source_location, vars.second.read_delayed,
114 assignment(goto_program, t, source_location, vars.second.read_delayed_var,
117 for(
const auto &
id : vars.second.r_buff0_thds)
120 for(
const auto &
id : vars.second.r_buff1_thds)
129 goto_functionst::function_mapt::iterator
133 throw "weak memory instrumentation needs an entry point";
148 std::string identifier=
id2string(id_lhs);
150 const size_t pos=identifier.find(
"[]");
152 if(
pos!=std::string::npos)
155 identifier.erase(
pos);
160 const exprt symbol=ns.
lookup(identifier).symbol_expr();
169 catch(
const std::string &s)
187 assignment(goto_program, target, source_location, vars.read_delayed,
189 assignment(goto_program, target, source_location, vars.read_delayed_var,
194 assignment(goto_program, target, source_location, vars.read_new_var, new_var);
197 assignment(goto_program, target, source_location, write_object, new_var);
203 const std::string identifier=
id2string(write_object);
206 const varst &vars=(*this)(write_object);
233 const varst &vars=(*this)(write_object);
245 target->guard=if_expr;
247 target->source_location=source_location;
259 (void)source_location;
271 const unsigned current_thread)
273 const std::string identifier=
id2string(
object);
276 const varst &vars=(*this)(object);
285 original_instruction.
code().
op1());
305 const exprt cond_expr=
332 const unsigned current_thread)
334 const std::string identifier=
id2string(
object);
339 const varst &vars=(*this)(object);
363 const exprt new_value_expr=
365 buff0_used_and_mine_expr,
368 buff1_used_and_mine_expr,
373 assignment(goto_program, target, source_location,
object, new_value_expr);
384 buff0_used_and_mine_expr,
391 const exprt buff0_or_buff1_used_and_mine_expr=
392 or_exprt(buff0_used_and_mine_expr, buff1_used_and_mine_expr);
400 buff0_or_buff1_used_and_mine_expr,
406 const exprt buff0_thd_expr=
418 const exprt buff1_thd_expr=
427 buff0_or_buff1_used_and_mine_expr,
439 const unsigned current_thread,
440 const bool tso_pso_rmo)
442 const std::string identifier=
id2string(
object);
448 const varst &vars=(*this)(object);
456 const exprt nondet_bool_expr =
460 assignment(goto_program, target, source_location, choice0, nondet_bool_expr);
461 assignment(goto_program, target, source_location, choice2, nondet_bool_expr);
483 goto_program, target, source_location, vars.
flush_delayed, delay_expr);
488 bool instrumented=
false;
494 typedef std::multimap<irep_idt, source_locationt>::iterator m_itt;
495 std::pair<m_itt, m_itt> ran=
cycles_loc.equal_range(
object);
496 for(m_itt ran_it=ran.first; ran_it!=ran.second; ran_it++)
497 if(ran_it->second==source_location)
506 if(tso_pso_rmo || !instrumented)
515 const exprt cond_134_expr=
525 const exprt val_134_expr=lhs;
526 const exprt buff0_used_134_expr=buff0_used_expr;
527 const exprt buff1_used_134_expr=buff1_used_expr;
528 const exprt buff0_134_expr=buff0_expr;
529 const exprt buff1_134_expr=buff1_expr;
530 const exprt buff0_thd_134_expr=buff0_thd_expr;
531 const exprt buff1_thd_134_expr=buff1_thd_expr;
536 const exprt cond_267_expr=
and_exprt(buff0_used_expr, buff0_thd_expr);
537 const exprt val_267_expr=buff0_expr;
540 const exprt buff0_267_expr=buff0_expr;
541 const exprt buff1_267_expr=buff1_expr;
548 const exprt cond_5_expr=
554 const exprt val_5_expr=buff1_expr;
555 const exprt buff0_used_5_expr=buff0_used_expr;
557 const exprt buff0_5_expr=buff0_expr;
558 const exprt buff1_5_expr=buff1_expr;
559 const exprt buff0_thd_5_expr=buff0_thd_expr;
623 buff0_used_5_expr))));
639 buff1_used_5_expr))));
655 buff0_thd_5_expr))));
670 buff1_thd_5_expr))));
683 goto_program, target, source_location, choice1, nondet_bool_expr);
691 const exprt val_1_expr=lhs;
692 const exprt buff0_used_1_expr=buff0_used_expr;
693 const exprt buff1_used_1_expr=buff1_used_expr;
694 const exprt buff0_1_expr=buff0_expr;
695 const exprt buff1_1_expr=buff1_expr;
696 const exprt buff0_thd_1_expr=buff0_thd_expr;
697 const exprt buff1_thd_1_expr=buff1_thd_expr;
702 const exprt cond_267_expr=
703 and_exprt(buff0_used_expr, buff0_thd_expr);
704 const exprt val_267_expr=buff0_expr;
707 const exprt buff0_267_expr=buff0_expr;
708 const exprt buff1_267_expr=buff1_expr;
715 const exprt cond_3_expr=
721 const exprt val_3_expr=
if_exprt(choice0_expr, buff0_expr, lhs);
722 const exprt buff0_used_3_expr=choice0_expr;
724 const exprt buff0_3_expr=buff0_expr;
725 const exprt buff1_3_expr=buff1_expr;
732 const exprt cond_4_expr=
736 const exprt val_4_expr=
744 const exprt buff0_used_4_expr=
746 const exprt buff1_used_4_expr=choice0_expr;
747 const exprt buff0_4_expr=buff0_expr;
748 const exprt buff1_4_expr=buff1_expr;
749 const exprt buff0_thd_4_expr=buff0_thd_expr;
750 const exprt buff1_thd_4_expr=
756 const exprt cond_5_expr=
758 and_exprt(buff0_used_expr, buff1_thd_expr),
760 const exprt val_5_expr=
765 const exprt buff0_used_5_expr=choice0_expr;
767 const exprt buff0_5_expr=buff0_expr;
768 const exprt buff1_5_expr=buff1_expr;
857 buff0_used_3_expr))))));
879 buff1_used_3_expr))))));
901 buff0_thd_3_expr))))));
923 buff1_thd_3_expr))))));
926 catch(
const std::string &s)
944 identifier==
"stdin" ||
945 identifier==
"stdout" ||
946 identifier==
"stderr" ||
947 identifier==
"sys_nerr" ||
995 typedef std::multimap<irep_idt, source_locationt>::iterator m_itt;
996 std::pair<m_itt, m_itt> ran=
cycles_loc.equal_range(identifier);
997 for(m_itt ran_it=ran.first; ran_it!=ran.second; ran_it++)
998 if(ran_it->second==source_location)
1032 for(
const auto &w_entry : rw_set.
w_entries)
1034 for(
const auto &r_entry : rw_set.
r_entries)
1037 <<
" reads from " <<
id2string(r_entry.second.object)
1105 for(
const auto &w_entry : rw_set.
w_entries)
1112 original_instruction.
swap(instruction);
1122 for(
const auto &r_entry : rw_set.
r_entries)
1126 goto_program, i_it, source_location, r_entry.second.object);
1134 r_entry.second.object,
1136 (model ==
TSO || model ==
PSO || model ==
RMO));
1140 for(
const auto &w_entry : rw_set.
w_entries)
1145 for(
const auto &r_entry : rw_set.
r_entries)
1148 ns, r_entry.second.symbol_expr,
true))
1154 r_entry.second.object,
1155 w_entry.second.object);
1166 w_entry.second.object,
1167 original_instruction,
1175 for(
const auto &r_entry : rw_set.
r_entries)
1179 r_entry.second.object) !=
1187 <<
"writer " << w_entry.second.object <<
" reads "
1205 const exprt nondet_bool_expr =
1228 r_entry.second.object,
1239 w_entry.second.object,
1240 original_instruction.
code().
op1());
1247 for(
const auto &r_entry : rw_set.
r_entries)
1252 <<
"flush restore: " << r_entry.second.object <<
messaget::eom;
1259 delayed_expr, mem_value_expr, r_entry.second.symbol_expr);
1265 r_entry.second.object,
1268 goto_program, i_it, source_location,
1296 original_instruction.
swap(instruction);
1305 for(std::set<irep_idt>::iterator s_it=
past_writes.begin();
1309 goto_program, i_it, source_location, *s_it,