- // Setup the closure function.
- BasicBlock *lambda_entry = BasicBlock::Create(*ctx_, "entry", f);
- builder_->SetInsertPoint(lambda_entry);
- auto it = f->arg_begin();
- llvm::Value* task_id = &(*it++);
- llvm::Value* penv = &(*it++);
- cdata = builder_->CreatePointerCast(&(*it++), cdata->getType());
- // setup new variable map, swap it with current var context.
- std::unordered_map<const Variable*, llvm::Value*> new_vmap;
- UnpackClosureData(cdata, vfields, &new_vmap);
- // setup parallel env
- ParallelEnv par_env;
- par_env.task_id = Var("task_id", Int(32));
- par_env.num_task = Var("num_task", Int(32));
- new_vmap[par_env.task_id.get()] = task_id;
- new_vmap[par_env.num_task.get()] = builder_->CreateLoad(
- builder_->CreateInBoundsGEP(
- penv, {ConstInt32(0), ConstInt32(1)}));
- par_env.penv = penv;
- std::swap(function_, f);
This file has been truncated. show original