Mercurial > projects > ldc
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;