use of com.dat3m.dartagnan.program.event.core.CondJump in project Dat3M by hernanponcedeleon.
the class ExceptionsTest method JumpWithNullExpr.
@Test(expected = NullPointerException.class)
public void JumpWithNullExpr() throws Exception {
ProgramBuilder pb = new ProgramBuilder();
pb.initThread(0);
Label end = pb.getOrCreateLabel("END");
// The expr cannot be null
pb.addChild(0, new CondJump(null, end));
}
use of com.dat3m.dartagnan.program.event.core.CondJump in project Dat3M by hernanponcedeleon.
the class VisitorLitmusC method visitIfExpression.
@Override
public Object visitIfExpression(LitmusCParser.IfExpressionContext ctx) {
ExprInterface expr = (ExprInterface) ctx.re().accept(this);
ifId++;
Label elseL = programBuilder.getOrCreateLabel("else_" + ifId);
Label endL = programBuilder.getOrCreateLabel("end_" + ifId);
IfAsJump ifEvent = EventFactory.newIfJumpUnless(expr, elseL, endL);
programBuilder.addChild(currentThread, ifEvent);
for (LitmusCParser.ExpressionContext expressionContext : ctx.expression()) expressionContext.accept(this);
CondJump jumpToEnd = EventFactory.newGoto(endL);
jumpToEnd.addFilters(Tag.IFI);
programBuilder.addChild(currentThread, jumpToEnd);
programBuilder.addChild(currentThread, elseL);
if (ctx.elseExpression() != null) {
ctx.elseExpression().accept(this);
}
programBuilder.addChild(currentThread, endL);
return null;
}
use of com.dat3m.dartagnan.program.event.core.CondJump in project Dat3M by hernanponcedeleon.
the class BranchEquivalence method computeBranches.
// ========================== Branching Property =========================
private Branch computeBranches(Event start, Map<Event, Branch> branchMap, Map<Event, Branch> finalBranchMap) {
if (branchMap.containsKey(start)) {
// <start> was already visited
return branchMap.get(start);
}
Branch b = new Branch(start);
branchMap.put(start, b);
Event succ = start;
do {
if (succ instanceof CondJump) {
CondJump jump = (CondJump) succ;
if (!alwaysSplitOnJump && jump.isGoto()) {
// There is only one branch we can proceed on, so we don't need to split the current branch
succ = jump.getLabel();
} else {
// Split into two branches...
Branch b1 = computeBranches(jump.getSuccessor(), branchMap, finalBranchMap);
Branch b2 = computeBranches(jump.getLabel(), branchMap, finalBranchMap);
b1.parents.add(b);
b.children.add(b1);
b2.parents.add(b);
b.children.add(b2);
return b;
}
} else {
// No branching happened, thus we stay on the current branch
succ = succ.getSuccessor();
}
if (succ == null) {
finalBranchMap.put(b.events.get(b.events.size() - 1), b);
return b;
} else if ((succ instanceof Label && !((Label) succ).getJumpSet().isEmpty()) || branchMap.containsKey(succ)) {
// We ran into a merge point
Branch b1 = computeBranches(succ, branchMap, finalBranchMap);
b1.parents.add(b);
b.children.add(b1);
return b;
} else {
b.events.add(succ);
}
} while (true);
}
use of com.dat3m.dartagnan.program.event.core.CondJump in project Dat3M by hernanponcedeleon.
the class Dependency method process.
private void process(Thread thread, ExecutionAnalysis exec) {
Map<Event, Set<Writer>> jumps = new HashMap<>();
Set<Writer> state = new HashSet<>();
for (Register register : thread.getRegisters()) {
state.add(new Writer(register, null));
}
for (Event event : thread.getEvents()) {
// merge with incoming jumps
Set<Writer> j = jumps.remove(event);
if (j != null) {
state.addAll(j);
}
// collecting dependencies, mixing 'data' and 'addr'
Set<Register> registers = new HashSet<>();
if (event instanceof RegReaderData) {
registers.addAll(((RegReaderData) event).getDataRegs());
}
if (event instanceof MemEvent) {
registers.addAll(((MemEvent) event).getAddress().getRegs());
}
if (!registers.isEmpty()) {
Map<Register, State> result = new HashMap<>();
for (Register register : registers) {
if (register.getThreadId() == Register.NO_THREAD) {
continue;
}
State writers;
if (register.getThreadId() != event.getThread().getId()) {
writers = finalWriters.get(register);
checkArgument(writers != null, "Helper thread %s should be listed after their creator thread %s.", thread.getId(), register.getThreadId());
if (writers.may.size() != 1) {
logger.warn("Writers {} for inter-thread register {} read by event {} of thread {}", writers.may, register, event, thread.getId());
}
} else {
writers = process(state, register, exec);
if (!writers.initialized) {
logger.warn("Uninitialized register {} read by event {} of thread {}", register, event, thread.getId());
}
}
result.put(register, writers);
}
map.put(event, result);
}
// update state, if changed by event
if (event instanceof RegWriter) {
Register register = ((RegWriter) event).getResultRegister();
if (event.cfImpliesExec()) {
state.removeIf(e -> e.register.equals(register));
}
state.add(new Writer(register, event));
}
// copy state, if branching
if (event instanceof CondJump) {
jumps.computeIfAbsent(((CondJump) event).getLabel(), k -> new HashSet<>()).addAll(state);
if (((CondJump) event).isGoto()) {
state.clear();
}
}
}
if (!jumps.isEmpty()) {
logger.warn("Thread {} contains jumps to removed labels {}", thread.getId(), jumps.keySet());
for (Set<Writer> j : jumps.values()) {
state.addAll(j);
}
}
for (Register register : thread.getRegisters()) {
finalWriters.put(register, process(state, register, exec));
}
}
use of com.dat3m.dartagnan.program.event.core.CondJump in project Dat3M by hernanponcedeleon.
the class ProgramBuilder method validateLabels.
private void validateLabels(Thread thread) throws MalformedProgramException {
Map<String, Label> threadLabels = new HashMap<>();
Set<String> referencedLabels = new HashSet<>();
Event e = thread.getEntry();
while (e != null) {
if (e instanceof CondJump) {
referencedLabels.add(((CondJump) e).getLabel().getName());
} else if (e instanceof Label) {
Label label = labels.remove(((Label) e).getName());
if (label == null) {
throw new MalformedProgramException("Duplicated label " + ((Label) e).getName());
}
threadLabels.put(label.getName(), label);
}
e = e.getSuccessor();
}
for (String labelName : referencedLabels) {
if (!threadLabels.containsKey(labelName)) {
throw new MalformedProgramException("Illegal jump to label " + labelName);
}
}
}
Aggregations