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