aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/ArrayParameters.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/ArrayParameters.cc')
-rw-r--r--lib/CodeGen/ArrayParameters.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/CodeGen/ArrayParameters.cc b/lib/CodeGen/ArrayParameters.cc
index 3359c66..a5f0beb 100644
--- a/lib/CodeGen/ArrayParameters.cc
+++ b/lib/CodeGen/ArrayParameters.cc
@@ -51,6 +51,28 @@ void ArrayHandler::bindArrayParameter(const std::string &Name,
false);
FunctionCallee MemcpyFunc = TheModule->getOrInsertFunction("memcpy", MemcpyType);
Builder->CreateCall(MemcpyFunc, {Copy, DataPtr, TotalBytes});
+ if (CG.containsString(ElemInfo)) {
+ auto *F = Builder->GetInsertBlock()->getParent();
+ auto *Index = CG.CreateEntryBlockAlloca(F, Type::getInt64Ty(*TheContext), "copy_index");
+ auto *Check = BasicBlock::Create(*TheContext, "copy_check", F);
+ auto *Body = BasicBlock::Create(*TheContext, "copy_element", F);
+ auto *Done = BasicBlock::Create(*TheContext, "copy_done", F);
+ Builder->CreateStore(Builder->getInt64(0), Index);
+ Builder->CreateBr(Check);
+ Builder->SetInsertPoint(Check);
+ Value *I = Builder->CreateLoad(Builder->getInt64Ty(), Index);
+ Builder->CreateCondBr(Builder->CreateICmpULT(I, TotalElements), Body, Done);
+ Builder->SetInsertPoint(Body);
+ std::vector<size_t> Transfers;
+ Value *Source = Builder->CreateGEP(ElemInfo->LLVMType, DataPtr, I);
+ Value *Value = CG.copyClassValue(ElemInfo, Source, Transfers);
+ if (!Value) return;
+ Builder->CreateStore(Value, Builder->CreateGEP(ElemInfo->LLVMType, Copy, I));
+ CG.transferObjects(Transfers);
+ Builder->CreateStore(Builder->CreateAdd(I, Builder->getInt64(1)), Index);
+ Builder->CreateBr(Check);
+ Builder->SetInsertPoint(Done);
+ }
Ptr = Copy;
}