use of com.dat3m.dartagnan.expression.IConst in project Dat3M by hernanponcedeleon.
the class AtomicProcedures method atomicCmpXchg.
private static void atomicCmpXchg(VisitorBoogie visitor, Call_cmdContext ctx) {
Register reg = visitor.programBuilder.getOrCreateRegister(visitor.threadCount, visitor.currentScope.getID() + ":" + ctx.call_params().Ident(0).getText(), ARCH_PRECISION);
List<BoogieParser.ExprContext> params = ctx.call_params().exprs().expr();
IExpr addr = (IExpr) params.get(0).accept(visitor);
// NOTE: We assume a register here
IExpr expectedAddr = (IExpr) params.get(1).accept(visitor);
IExpr desiredVal = (IExpr) params.get(2).accept(visitor);
String mo = null;
boolean strong = ctx.getText().contains("strong");
if (params.size() > 3) {
mo = intToMo(((IConst) params.get(3).accept(visitor)).getValueAsInt());
// NOTE: We forget about the 5th parameter (MO on fail) because it is never used
// (see issue #123 for an explanation)
}
visitor.programBuilder.addChild(visitor.threadCount, Atomic.newCompareExchange(reg, addr, expectedAddr, desiredVal, mo, strong)).setCLine(visitor.currentLine).setSourceCodeFile(visitor.sourceCodeFile);
}
use of com.dat3m.dartagnan.expression.IConst in project Dat3M by hernanponcedeleon.
the class StdProcedures method __assert.
private static void __assert(VisitorBoogie visitor, Call_cmdContext ctx) {
Register ass = visitor.programBuilder.getOrCreateRegister(visitor.threadCount, "assert_" + visitor.assertionIndex, ARCH_PRECISION);
visitor.assertionIndex++;
ExprInterface expr = (ExprInterface) ctx.call_params().exprs().accept(visitor);
if (expr instanceof IConst && ((IConst) expr).getValue().compareTo(BigInteger.ONE) == 0) {
return;
}
Local event = EventFactory.newLocal(ass, expr);
event.addFilters(Tag.ASSERTION);
visitor.programBuilder.addChild(visitor.threadCount, event);
}
use of com.dat3m.dartagnan.expression.IConst in project Dat3M by hernanponcedeleon.
the class AndersenAliasAnalysis method processResults.
private void processResults(Program program) {
// Used to have pointer analysis when having arrays and structures
Map<Register, Set<Location>> targets = new HashMap<>();
BiConsumer<Register, Location> addTarget = (r, l) -> targets.put(r, Set.of(l));
BiConsumer<Register, MemoryObject> addTargetArray = (r, b) -> targets.put(r, IntStream.range(0, b.size()).mapToObj(i -> new Location(b, i)).collect(Collectors.toSet()));
for (Event ev : program.getCache().getEvents(FilterBasic.get(Tag.LOCAL))) {
// Not only Local events have EType.LOCAL tag
if (!(ev instanceof Local)) {
continue;
}
Local l = (Local) ev;
ExprInterface exp = l.getExpr();
Register reg = l.getResultRegister();
if (exp instanceof MemoryObject) {
addTarget.accept(reg, new Location((MemoryObject) exp, 0));
} else if (exp instanceof IExprBin) {
IExpr base = ((IExprBin) exp).getBase();
if (base instanceof MemoryObject) {
IExpr rhs = ((IExprBin) exp).getRHS();
// FIXME Address extends IConst
if (rhs instanceof IConst) {
addTarget.accept(reg, new Location((MemoryObject) base, ((IConst) rhs).getValueAsInt()));
} else {
addTargetArray.accept(reg, (MemoryObject) base);
}
continue;
}
if (!(base instanceof Register)) {
continue;
}
// accept register2 = register1 + constant
for (Location target : targets.getOrDefault(base, Set.of())) {
IExpr rhs = ((IExprBin) exp).getRHS();
// FIXME Address extends IConst
if (rhs instanceof IConst) {
int o = target.offset + ((IConst) rhs).getValueAsInt();
if (o < target.base.size()) {
addTarget.accept(reg, new Location(target.base, o));
}
} else {
addTargetArray.accept(reg, target.base);
}
}
}
}
for (Event e : program.getCache().getEvents(FilterBasic.get(Tag.MEMORY))) {
IExpr address = ((MemEvent) e).getAddress();
Set<Location> addresses;
if (address instanceof Register) {
Set<Location> target = targets.get(address);
if (target != null) {
addresses = target;
} else {
addresses = graph.getAddresses(address);
}
} else {
Constant addressConstant = new Constant(address);
if (addressConstant.failed) {
addresses = maxAddressSet;
} else {
Verify.verify(addressConstant.location != null, "memory event accessing a pure constant address");
addresses = ImmutableSet.of(addressConstant.location);
}
}
if (addresses.size() == 0) {
addresses = maxAddressSet;
}
eventAddressSpaceMap.put((MemEvent) e, ImmutableSet.copyOf(addresses));
}
}
Aggregations