Search in sources :

Example 1 with FunCall

use of com.dat3m.dartagnan.program.event.core.annotations.FunCall in project Dat3M by hernanponcedeleon.

the class VisitorBoogie method visitCall_cmd.

@Override
public Object visitCall_cmd(Call_cmdContext ctx) {
    if (ctx.getText().contains("boogie_si_record") && !ctx.getText().contains("smack")) {
        Object local = ctx.call_params().exprs().expr(0).accept(this);
        if (local instanceof Register) {
            String txt = ctx.attr(0).getText();
            String cVar;
            if (ctx.getText().contains("arg:")) {
                cVar = txt.substring(txt.lastIndexOf(":") + 1, txt.lastIndexOf("\""));
            } else {
                cVar = txt.substring(txt.indexOf("\"") + 1, txt.lastIndexOf("\""));
            }
            ((Register) local).setCVar(cVar);
        }
    }
    String name = ctx.call_params().Define() == null ? ctx.call_params().Ident(0).getText() : ctx.call_params().Ident(1).getText();
    if (name.equals("$initialize")) {
        initMode = true;
    }
    if (name.equals("abort")) {
        Label label = programBuilder.getOrCreateLabel("END_OF_T" + threadCount);
        programBuilder.addChild(threadCount, EventFactory.newGoto(label));
        return null;
    }
    if (name.equals("reach_error")) {
        Register ass = programBuilder.getOrCreateRegister(threadCount, "assert_" + assertionIndex, ARCH_PRECISION);
        assertionIndex++;
        programBuilder.addChild(threadCount, EventFactory.newLocal(ass, new BConst(false))).setCLine(currentLine).setSourceCodeFile(sourceCodeFile).addFilters(Tag.ASSERTION);
        Label end = programBuilder.getOrCreateLabel("END_OF_T" + threadCount);
        programBuilder.addChild(threadCount, EventFactory.newJump(new Atom(ass, COpBin.NEQ, IValue.ONE), end));
        return null;
    }
    if (DUMMYPROCEDURES.stream().anyMatch(name::startsWith)) {
        return null;
    }
    if (PTHREADPROCEDURES.stream().anyMatch(name::contains)) {
        handlePthreadsFunctions(this, ctx);
        return null;
    }
    if (SVCOMPPROCEDURES.stream().anyMatch(name::contains)) {
        handleSvcompFunction(this, ctx);
        return null;
    }
    if (ATOMICPROCEDURES.stream().anyMatch(name::startsWith)) {
        handleAtomicFunction(this, ctx);
        return null;
    }
    if (STDPROCEDURES.stream().anyMatch(name::startsWith)) {
        handleStdFunction(this, ctx);
        return null;
    }
    if (name.contains("__VERIFIER_atomic_")) {
        atomicMode = ctx;
        if (GlobalSettings.ATOMIC_AS_LOCK) {
            SvcompProcedures.__VERIFIER_atomic(this, true);
        } else {
            SvcompProcedures.__VERIFIER_atomic_begin(this);
        }
    }
    // There will be no return for them.
    if (ctx.call_params().Define() != null && procedures.get(name).impl_body() != null) {
        Register register = programBuilder.getRegister(threadCount, currentScope.getID() + ":" + ctx.call_params().Ident(0).getText());
        if (register != null) {
            returnRegister.add(register);
        }
    }
    List<ExprInterface> callingValues = new ArrayList<>();
    if (ctx.call_params().exprs() != null) {
        callingValues = ctx.call_params().exprs().expr().stream().map(c -> (ExprInterface) c.accept(this)).collect(Collectors.toList());
    }
    if (!procedures.containsKey(name)) {
        throw new ParsingException("Procedure " + name + " is not defined");
    }
    FunCall call = EventFactory.newFunctionCall(name);
    programBuilder.addChild(threadCount, call).setCLine(currentLine).setSourceCodeFile(sourceCodeFile);
    visitProc_decl(procedures.get(name), false, callingValues);
    if (ctx.equals(atomicMode)) {
        atomicMode = null;
        if (GlobalSettings.ATOMIC_AS_LOCK) {
            SvcompProcedures.__VERIFIER_atomic(this, false);
        } else {
            SvcompProcedures.__VERIFIER_atomic_end(this);
        }
    }
    programBuilder.addChild(threadCount, EventFactory.newFunctionReturn(name)).setCLine(call.getCLine()).setSourceCodeFile(sourceCodeFile);
    if (name.equals("$initialize")) {
        initMode = false;
    }
    return null;
}
Also used : FunCall(com.dat3m.dartagnan.program.event.core.annotations.FunCall) Register(com.dat3m.dartagnan.program.Register) ParsingException(com.dat3m.dartagnan.exception.ParsingException) Label(com.dat3m.dartagnan.program.event.core.Label) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject)

Aggregations

ParsingException (com.dat3m.dartagnan.exception.ParsingException)1 Register (com.dat3m.dartagnan.program.Register)1 Label (com.dat3m.dartagnan.program.event.core.Label)1 FunCall (com.dat3m.dartagnan.program.event.core.annotations.FunCall)1 MemoryObject (com.dat3m.dartagnan.program.memory.MemoryObject)1