bool memory_model_sct::program_order_is_relaxed( partial_order_concurrencyt::event_it e1, partial_order_concurrencyt::event_it e2) const { assert(is_shared_read(e1) || is_shared_write(e1)); assert(is_shared_read(e2) || is_shared_write(e2)); return false; }
bool memory_model_psot::program_order_is_relaxed( partial_order_concurrencyt::event_it e1, partial_order_concurrencyt::event_it e2) const { assert(is_shared_read(e1) || is_shared_write(e1)); assert(is_shared_read(e2) || is_shared_write(e2)); // no po relaxation within atomic sections if(e1->atomic_section_id!=0 && e1->atomic_section_id==e2->atomic_section_id) return false; // no relaxation if induced wsi if(is_shared_write(e1) && is_shared_write(e2) && address(e1)==address(e2)) return false; // only read/read and read/write are maintained return is_shared_write(e1); }
void memory_model_sct::build_per_thread_map( const symex_target_equationt &equation, per_thread_mapt &dest) const { // this orders the events within a thread for(eventst::const_iterator e_it=equation.SSA_steps.begin(); e_it!=equation.SSA_steps.end(); e_it++) { // concurreny-related? if(!is_shared_read(e_it) && !is_shared_write(e_it) && !is_spawn(e_it) && !is_memory_barrier(e_it)) continue; dest[e_it->source.thread_nr].push_back(e_it); } }
void symex_target_equationt::SSA_stept::output( const namespacet &ns, std::ostream &out) const { if(source.is_set) { out << "Thread " << source.thread_nr; if(source.pc->source_location.is_not_nil()) out << " " << source.pc->source_location << std::endl; else out << std::endl; } switch(type) { case goto_trace_stept::ASSERT: out << "ASSERT " << from_expr(ns, "", cond_expr) << std::endl; break; case goto_trace_stept::ASSUME: out << "ASSUME " << from_expr(ns, "", cond_expr) << std::endl; break; case goto_trace_stept::LOCATION: out << "LOCATION" << std::endl; break; case goto_trace_stept::INPUT: out << "INPUT" << std::endl; break; case goto_trace_stept::OUTPUT: out << "OUTPUT" << std::endl; break; case goto_trace_stept::DECL: out << "DECL" << std::endl; out << from_expr(ns, "", ssa_lhs) << std::endl; break; case goto_trace_stept::ASSIGNMENT: out << "ASSIGNMENT ("; switch(assignment_type) { case HIDDEN: out << "HIDDEN"; break; case STATE: out << "STATE"; break; case VISIBLE_ACTUAL_PARAMETER: out << "VISIBLE_ACTUAL_PARAMETER"; break; case HIDDEN_ACTUAL_PARAMETER: out << "HIDDEN_ACTUAL_PARAMETER"; break; case PHI: out << "PHI"; break; case GUARD: out << "GUARD"; break; default:; } out << ")" << std::endl; break; case goto_trace_stept::DEAD: out << "DEAD" << std::endl; break; case goto_trace_stept::FUNCTION_CALL: out << "FUNCTION_CALL" << std::endl; break; case goto_trace_stept::FUNCTION_RETURN: out << "FUNCTION_RETURN" << std::endl; break; case goto_trace_stept::CONSTRAINT: out << "CONSTRAINT" << std::endl; break; case goto_trace_stept::SHARED_READ: out << "SHARED READ" << std::endl; break; case goto_trace_stept::SHARED_WRITE: out << "SHARED WRITE" << std::endl; break; case goto_trace_stept::ATOMIC_BEGIN: out << "ATOMIC_BEGIN" << std::endl; break; case goto_trace_stept::ATOMIC_END: out << "AUTOMIC_END" << std::endl; break; case goto_trace_stept::SPAWN: out << "SPAWN" << std::endl; break; case goto_trace_stept::MEMORY_BARRIER: out << "MEMORY_BARRIER" << std::endl; break; case goto_trace_stept::GOTO: out << "IF " << from_expr(ns, "", cond_expr) << " GOTO" << std::endl; break; default: assert(false); } if(is_assert() || is_assume() || is_assignment() || is_constraint()) out << from_expr(ns, "", cond_expr) << std::endl; if(is_assert() || is_constraint()) out << comment << std::endl; if(is_shared_read() || is_shared_write()) out << from_expr(ns, "", ssa_lhs) << std::endl; out << "Guard: " << from_expr(ns, "", guard) << std::endl; }