Mercurial > projects > ldc
diff gen/arrays.c @ 22:a6360e68134a trunk
[svn r26] * Fixed templates defining a constant value
* Fixed problem with slice-slice copy assignment if a side was a temporary slice
author | lindquist |
---|---|
date | Thu, 04 Oct 2007 07:35:02 +0200 |
parents | 8d45266bbabe |
children | 4648206ca213 |
line wrap: on
line diff
--- a/gen/arrays.c Thu Oct 04 07:01:15 2007 +0200 +++ b/gen/arrays.c Thu Oct 04 07:35:02 2007 +0200 @@ -308,7 +308,21 @@ assert(e->mem); const llvm::Type* t = e->mem->getType()->getContainedType(0); llvm::Value* ret = 0; - if (llvm::isa<llvm::ArrayType>(t)) { + if (e->arg != 0) { + // this means it's a real slice + ret = e->mem; + + size_t elembsz = gTargetData->getTypeSize(ret->getType()); + llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false); + + if (llvm::isa<llvm::ConstantInt>(e->arg)) { + sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e->arg)); + } + else { + sz = llvm::BinaryOperator::createMul(elemsz,e->arg,"tmp",gIR->scopebb()); + } + } + else if (llvm::isa<llvm::ArrayType>(t)) { ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb()); size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0));