77 LLVMContext& Ctx =
TargetFn->getContext();
79 auto Fn = Ev.function();
80 assert(Fn.name() ==
TargetFn->getName());
81 assert(Ev.direction() ==
Dir);
87 auto *Instr = BasicBlock::Create(Ctx, A.Name() +
":instr",
InstrFn, Exit);
88 Exit->replaceAllUsesWith(Instr);
92 for (
auto& InstrArg :
InstrFn->getArgumentList()) {
93 const Argument& Arg = Ev.argument(i);
95 Instr, Exit, &InstrArg, Arg);
98 if (++i == Ev.argument_size())
103 const Argument &Arg = Ev.expectedreturnvalue();
104 Value *ReturnValue = --(
InstrFn->arg_end());
106 Instr, Exit, ReturnValue, Arg);
109 IRBuilder<> Builder(Instr);
110 Type* IntType = Type::getInt32Ty(Ctx);
113 Args.push_back(
TeslaContext(A.getAssertion().context(), Ctx));
114 Args.push_back(ConstantInt::get(IntType, A.ID()));
116 Args.push_back(Builder.CreateGlobalStringPtr(A.Name()));
117 Args.push_back(Builder.CreateGlobalStringPtr(A.String()));
121 assert(Args.size() == UpdateStateFn->arg_size());
122 Builder.CreateCall(UpdateStateFn, Args);
123 Builder.CreateBr(Exit);