Search in sources :

Example 16 with IExpr

use of com.dat3m.dartagnan.expression.IExpr in project Dat3M by hernanponcedeleon.

the class PthreadsProcedures method mutexLock.

private static void mutexLock(VisitorBoogie visitor, Call_cmdContext ctx) {
    ExprsContext lock = ctx.call_params().exprs();
    Register register = visitor.programBuilder.getOrCreateRegister(visitor.threadCount, null, ARCH_PRECISION);
    IExpr lockAddress = (IExpr) lock.accept(visitor);
    if (lockAddress != null) {
        visitor.programBuilder.addChild(visitor.threadCount, EventFactory.Pthread.newLock(lock.getText(), lockAddress, register));
    }
}
Also used : Register(com.dat3m.dartagnan.program.Register) ExprsContext(com.dat3m.dartagnan.parsers.BoogieParser.ExprsContext) IExpr(com.dat3m.dartagnan.expression.IExpr)

Example 17 with IExpr

use of com.dat3m.dartagnan.expression.IExpr in project Dat3M by hernanponcedeleon.

the class PthreadsProcedures method mutexInit.

private static void mutexInit(VisitorBoogie visitor, Call_cmdContext ctx) {
    ExprContext lock = ctx.call_params().exprs().expr(0);
    IExpr lockAddress = (IExpr) lock.accept(visitor);
    IExpr value = (IExpr) ctx.call_params().exprs().expr(1).accept(visitor);
    if (lockAddress != null) {
        visitor.programBuilder.addChild(visitor.threadCount, EventFactory.Pthread.newInitLock(lock.getText(), lockAddress, value));
    }
}
Also used : IExpr(com.dat3m.dartagnan.expression.IExpr) ExprContext(com.dat3m.dartagnan.parsers.BoogieParser.ExprContext)

Example 18 with IExpr

use of com.dat3m.dartagnan.expression.IExpr in project Dat3M by hernanponcedeleon.

the class StdProcedures method alloc.

private static void alloc(VisitorBoogie visitor, Call_cmdContext ctx) {
    int size;
    try {
        size = ((IExpr) ctx.call_params().exprs().expr(0).accept(visitor)).reduce().getValueAsInt();
    } catch (Exception e) {
        String tmp = ctx.call_params().getText();
        tmp = tmp.contains(",") ? tmp.substring(0, tmp.indexOf(',')) : tmp.substring(0, tmp.indexOf(')'));
        tmp = tmp.substring(tmp.lastIndexOf('(') + 1);
        size = Integer.parseInt(tmp);
    }
    // Uniquely identify the allocated storage in the entire program
    String ptr = visitor.currentScope.getID() + ":" + ctx.call_params().Ident(0).getText();
    Register start = visitor.programBuilder.getRegister(visitor.threadCount, ptr);
    MemoryObject object = visitor.programBuilder.newObject(ptr, size);
    visitor.programBuilder.addChild(visitor.threadCount, EventFactory.newLocal(start, object));
    visitor.allocationRegs.add(start);
}
Also used : Register(com.dat3m.dartagnan.program.Register) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) IExpr(com.dat3m.dartagnan.expression.IExpr) ParsingException(com.dat3m.dartagnan.exception.ParsingException)

Example 19 with IExpr

use of com.dat3m.dartagnan.expression.IExpr in project Dat3M by hernanponcedeleon.

the class AndersenAliasAnalysis method processLocs.

private void processLocs(Program program) {
    for (Event ev : program.getCache().getEvents(FilterBasic.get(Tag.MEMORY))) {
        MemEvent e = (MemEvent) ev;
        IExpr address = e.getAddress();
        // Collect for each v events of form: p = *v, *v = q
        if (address instanceof Register) {
            graph.addEvent((Register) address, e);
            continue;
        }
        Constant addressConstant = new Constant(address);
        if (addressConstant.failed) {
            // r = *(CompExpr) -> loc(r) = max
            if (e instanceof RegWriter) {
                Register register = ((RegWriter) e).getResultRegister();
                graph.addAllAddresses(register, maxAddressSet);
                variables.add(register);
            }
            // FIXME if e is a store event, then all locations should include its values
            eventAddressSpaceMap.put(e, maxAddressSet);
            continue;
        }
        // address is a constant
        Location location = addressConstant.location;
        if (location == null) {
            throw new RuntimeException("memory event accessing a pure constant address");
        }
        eventAddressSpaceMap.put(e, ImmutableSet.of(location));
        if (e instanceof RegWriter) {
            graph.addEdge(location, ((RegWriter) e).getResultRegister());
            continue;
        }
        // event is a store operation
        Verify.verify(e.is(Tag.WRITE), "memory event that is neither tagged \"W\" nor a register writer");
        ExprInterface value = e.getMemValue();
        if (value instanceof Register) {
            graph.addEdge(value, location);
            continue;
        }
        Constant v = new Constant(value);
        if (v.failed) {
            graph.addAllAddresses(location, maxAddressSet);
        } else if (v.location != null) {
            graph.addAddress(location, v.location);
        }
        variables.add(location);
    }
}
Also used : ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) IExpr(com.dat3m.dartagnan.expression.IExpr)

Example 20 with IExpr

use of com.dat3m.dartagnan.expression.IExpr 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));
    }
}
Also used : MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) IntStream(java.util.stream.IntStream) java.util(java.util) Verify(com.google.common.base.Verify) ImmutableSet(com.google.common.collect.ImmutableSet) ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) Configuration(org.sosy_lab.common.configuration.Configuration) com.dat3m.dartagnan.program.event.core(com.dat3m.dartagnan.program.event.core) Collectors(java.util.stream.Collectors) IConst(com.dat3m.dartagnan.expression.IConst) Sets(com.google.common.collect.Sets) Tag(com.dat3m.dartagnan.program.event.Tag) PLUS(com.dat3m.dartagnan.expression.op.IOpBin.PLUS) IExpr(com.dat3m.dartagnan.expression.IExpr) BiConsumer(java.util.function.BiConsumer) IExprBin(com.dat3m.dartagnan.expression.IExprBin) Program(com.dat3m.dartagnan.program.Program) Preconditions(com.google.common.base.Preconditions) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) FilterBasic(com.dat3m.dartagnan.program.filter.FilterBasic) InvalidConfigurationException(org.sosy_lab.common.configuration.InvalidConfigurationException) IExprBin(com.dat3m.dartagnan.expression.IExprBin) ImmutableSet(com.google.common.collect.ImmutableSet) ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) IConst(com.dat3m.dartagnan.expression.IConst) Register(com.dat3m.dartagnan.program.Register) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) IExpr(com.dat3m.dartagnan.expression.IExpr)

Aggregations

IExpr (com.dat3m.dartagnan.expression.IExpr)23 Register (com.dat3m.dartagnan.program.Register)16 IConst (com.dat3m.dartagnan.expression.IConst)7 IExprBin (com.dat3m.dartagnan.expression.IExprBin)6 ExprInterface (com.dat3m.dartagnan.expression.ExprInterface)4 IValue (com.dat3m.dartagnan.expression.IValue)4 BigInteger (java.math.BigInteger)4 ExprsContext (com.dat3m.dartagnan.parsers.BoogieParser.ExprsContext)2 Event (com.dat3m.dartagnan.program.event.core.Event)2 RegWriter (com.dat3m.dartagnan.program.event.core.utils.RegWriter)2 MemoryObject (com.dat3m.dartagnan.program.memory.MemoryObject)2 ParsingException (com.dat3m.dartagnan.exception.ParsingException)1 Atom (com.dat3m.dartagnan.expression.Atom)1 IOpBin (com.dat3m.dartagnan.expression.op.IOpBin)1 PLUS (com.dat3m.dartagnan.expression.op.IOpBin.PLUS)1 ExprContext (com.dat3m.dartagnan.parsers.BoogieParser.ExprContext)1 Program (com.dat3m.dartagnan.program.Program)1 AliasAnalysis (com.dat3m.dartagnan.program.analysis.AliasAnalysis)1 Tag (com.dat3m.dartagnan.program.event.Tag)1 com.dat3m.dartagnan.program.event.core (com.dat3m.dartagnan.program.event.core)1