diff gen/arrays.c @ 48:4d171915a77b trunk

[svn r52] fixed static arrays in struct literals
author lindquist
date Fri, 19 Oct 2007 17:15:30 +0200
parents eb7bf7b7972e
children 61bc1b4ad3c4
line wrap: on
line diff
--- a/gen/arrays.c	Fri Oct 19 17:00:35 2007 +0200
+++ b/gen/arrays.c	Fri Oct 19 17:15:30 2007 +0200
@@ -355,6 +355,28 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
+void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src)
+{
+    assert(dst->getType() == src->getType());
+    size_t arrsz = gTargetData->getTypeSize(dst->getType()->getContainedType(0));
+    llvm::Value* n = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrsz, false);
+
+    llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
+    llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
+    llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb());
+
+    llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32();
+    std::vector<llvm::Value*> llargs;
+    llargs.resize(4);
+    llargs[0] = dstarr;
+    llargs[1] = srcarr;
+    llargs[2] = n;
+    llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
+
+    new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
 llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr)
 {
     std::vector<const llvm::Type*> types;