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;
}
Aggregations