changeset 48:4d171915a77b trunk

[svn r52] fixed static arrays in struct literals
author lindquist
date Fri, 19 Oct 2007 17:15:30 +0200
parents 6d60e6049c4e
children e5c4bece7fa1
files gen/arrays.c gen/arrays.h gen/toir.c test/bug18.d
diffstat 4 files changed, 37 insertions(+), 0 deletions(-) [+]
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;
--- a/gen/arrays.h	Fri Oct 19 17:00:35 2007 +0200
+++ b/gen/arrays.h	Fri Oct 19 17:15:30 2007 +0200
@@ -19,6 +19,7 @@
 
 void LLVM_DtoCatArrayElement(llvm::Value* arr, Expression* exp);
 
+void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src);
 llvm::Value* LLVM_DtoStaticArrayCompare(TOK op, llvm::Value* l, llvm::Value* r);
 
 #endif // LLVMC_GEN_ARRAYS_H
--- a/gen/toir.c	Fri Oct 19 17:00:35 2007 +0200
+++ b/gen/toir.c	Fri Oct 19 17:15:30 2007 +0200
@@ -1517,6 +1517,9 @@
                 else if (vxtype->ty == Tarray) {
                     LLVM_DtoArrayAssign(arrptr,val);
                 }
+                else if (vxtype->ty == Tsarray) {
+                    LLVM_DtoStaticArrayCopy(arrptr,val);
+                }
                 else
                     new llvm::StoreInst(val, arrptr, p->scopebb());
             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/bug18.d	Fri Oct 19 17:15:30 2007 +0200
@@ -0,0 +1,11 @@
+module bug18;
+
+struct S {
+    int[9] i;
+}
+
+void main()
+{
+    int[9] i;
+    auto s = S(i);
+}