Mercurial > projects > ldc
comparison 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 |
comparison
equal
deleted
inserted
replaced
21:8d45266bbabe | 22:a6360e68134a |
---|---|
306 static llvm::Value* get_slice_ptr(elem* e, llvm::Value*& sz) | 306 static llvm::Value* get_slice_ptr(elem* e, llvm::Value*& sz) |
307 { | 307 { |
308 assert(e->mem); | 308 assert(e->mem); |
309 const llvm::Type* t = e->mem->getType()->getContainedType(0); | 309 const llvm::Type* t = e->mem->getType()->getContainedType(0); |
310 llvm::Value* ret = 0; | 310 llvm::Value* ret = 0; |
311 if (llvm::isa<llvm::ArrayType>(t)) { | 311 if (e->arg != 0) { |
312 // this means it's a real slice | |
313 ret = e->mem; | |
314 | |
315 size_t elembsz = gTargetData->getTypeSize(ret->getType()); | |
316 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false); | |
317 | |
318 if (llvm::isa<llvm::ConstantInt>(e->arg)) { | |
319 sz = llvm::ConstantExpr::getMul(elemsz, llvm::cast<llvm::Constant>(e->arg)); | |
320 } | |
321 else { | |
322 sz = llvm::BinaryOperator::createMul(elemsz,e->arg,"tmp",gIR->scopebb()); | |
323 } | |
324 } | |
325 else if (llvm::isa<llvm::ArrayType>(t)) { | |
312 ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb()); | 326 ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb()); |
313 | 327 |
314 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); | 328 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); |
315 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false); | 329 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false); |
316 | 330 |