From 6445254a7b27ba9a4c7722b5e7f823cf339738ca Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Fri, 19 Oct 2007 17:15:30 +0200 Subject: [PATCH] [svn r52] fixed static arrays in struct literals --- gen/arrays.c | 22 ++++++++++++++++++++++ gen/arrays.h | 1 + gen/toir.c | 3 +++ test/bug18.d | 11 +++++++++++ 4 files changed, 37 insertions(+) create mode 100644 test/bug18.d diff --git a/gen/arrays.c b/gen/arrays.c index 720e0a5c..565cc918 100644 --- a/gen/arrays.c +++ b/gen/arrays.c @@ -354,6 +354,28 @@ void LLVM_DtoArrayCopy(elem* dst, elem* src) new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); } +////////////////////////////////////////////////////////////////////////////////////////// +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 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) { diff --git a/gen/arrays.h b/gen/arrays.h index af4eb952..63396375 100644 --- a/gen/arrays.h +++ b/gen/arrays.h @@ -19,6 +19,7 @@ void LLVM_DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz); 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 diff --git a/gen/toir.c b/gen/toir.c index a9f6caf4..aba5cdb3 100644 --- a/gen/toir.c +++ b/gen/toir.c @@ -1517,6 +1517,9 @@ elem* StructLiteralExp::toElem(IRState* p) 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()); } diff --git a/test/bug18.d b/test/bug18.d new file mode 100644 index 00000000..5444f104 --- /dev/null +++ b/test/bug18.d @@ -0,0 +1,11 @@ +module bug18; + +struct S { + int[9] i; +} + +void main() +{ + int[9] i; + auto s = S(i); +}