use of com.dat3m.dartagnan.expression.Atom in project Dat3M by hernanponcedeleon.
the class AtomicAsLock method run.
private void run(MemoryObject address, Thread thread) {
Label end;
if (thread.getExit() instanceof Label) {
end = (Label) thread.getExit();
} else {
end = newLabel("__VERIFIER_atomic_thread_end");
thread.getExit().setSuccessor(end);
thread.updateExit(end);
}
Register register = thread.newRegister(ARCH_PRECISION);
for (Event predecessor = thread.getEntry(); predecessor != null; ) {
Event event = predecessor.getSuccessor();
boolean begin = event instanceof BeginAtomic;
if (begin || event instanceof EndAtomic) {
Event load = EventFactory.newLoad(register, address, null);
Event check = EventFactory.newJump(new Atom(register, NEQ, begin ? IValue.ZERO : IValue.ONE), end);
Event store = EventFactory.newStore(address, begin ? IValue.ONE : IValue.ZERO, null);
load.setOId(event.getOId());
check.setOId(event.getOId());
store.setOId(event.getOId());
load.addFilters(Tag.C11.LOCK, Tag.RMW);
check.addFilters(Tag.C11.LOCK, Tag.RMW);
store.addFilters(Tag.C11.LOCK, Tag.RMW);
predecessor.setSuccessor(load);
load.setSuccessor(check);
check.setSuccessor(store);
store.setSuccessor(event.getSuccessor());
predecessor = store;
} else {
predecessor = event;
}
}
}
use of com.dat3m.dartagnan.expression.Atom in project Dat3M by hernanponcedeleon.
the class VisitorBase method visitUnlock.
@Override
public List<Event> visitUnlock(Unlock e) {
Register resultRegister = e.getResultRegister();
IExpr address = e.getAddress();
String mo = e.getMo();
List<Event> events = eventSequence(newLoad(resultRegister, address, mo), newJump(new Atom(resultRegister, NEQ, IValue.ONE), (Label) e.getThread().getExit()), newStore(address, IValue.ZERO, mo));
for (Event child : events) {
child.addFilters(C11.LOCK, RMW);
}
return events;
}
Aggregations