void unpack_closure(const Closure& closure, Scope<Value *> &dst, llvm::Type * #if LLVM_VERSION >= 37 type #endif , Value *src, IRBuilder<> *builder) { // type, type of src should be a pointer to a struct of the type returned by build_type int idx = 0; LLVMContext &context = builder->getContext(); vector<string> nm = closure.names(); for (size_t i = 0; i < nm.size(); i++) { #if LLVM_VERSION >= 37 Value *ptr = builder->CreateConstInBoundsGEP2_32(type, src, 0, idx++); #else Value *ptr = builder->CreateConstInBoundsGEP2_32(src, 0, idx++); #endif LoadInst *load = builder->CreateLoad(ptr); if (load->getType()->isPointerTy()) { // Give it a unique type so that tbaa tells llvm that this can't alias anything LLVMMDNodeArgumentType md_args[] = {MDString::get(context, nm[i])}; load->setMetadata("tbaa", MDNode::get(context, md_args)); } dst.push(nm[i], load); load->setName(nm[i]); } }
void pack_closure(llvm::Type * #if LLVM_VERSION >= 37 type #endif , Value *dst, const Closure& closure, const Scope<Value *> &src, llvm::StructType *buffer_t, IRBuilder<> *builder) { // type, type of dst should be a pointer to a struct of the type returned by build_type int idx = 0; LLVMContext &context = builder->getContext(); vector<string> nm = closure.names(); vector<llvm::Type*> ty = llvm_types(closure, buffer_t, context); for (size_t i = 0; i < nm.size(); i++) { #if LLVM_VERSION >= 37 Value *ptr = builder->CreateConstInBoundsGEP2_32(type, dst, 0, idx); #else Value *ptr = builder->CreateConstInBoundsGEP2_32(dst, 0, idx); #endif Value *val; if (!ends_with(nm[i], ".buffer") || src.contains(nm[i])) { val = src.get(nm[i]); if (val->getType() != ty[i]) { val = builder->CreateBitCast(val, ty[i]); } } else { // Skip over buffers not in the symbol table. They must not be needed. val = ConstantPointerNull::get(buffer_t->getPointerTo()); } builder->CreateStore(val, ptr); idx++; } }