comparison gen/arrays.c @ 21:8d45266bbabe trunk

[svn r25] * Fixed a lot of problems with string literals * Fixed slice-slice copying assignment
author lindquist
date Thu, 04 Oct 2007 07:01:15 +0200
parents d3ee9efe20e2
children a6360e68134a
comparison
equal deleted inserted replaced
20:42bf2eb2973b 21:8d45266bbabe
301 const llvm::ArrayType* arrty = LLVM_DtoStaticArrayType(t); 301 const llvm::ArrayType* arrty = LLVM_DtoStaticArrayType(t);
302 return llvm::ConstantArray::get(arrty, inits); 302 return llvm::ConstantArray::get(arrty, inits);
303 } 303 }
304 304
305 ////////////////////////////////////////////////////////////////////////////////////////// 305 //////////////////////////////////////////////////////////////////////////////////////////
306 static llvm::Value* get_slice_ptr(elem* e, llvm::Value*& sz)
307 {
308 assert(e->mem);
309 const llvm::Type* t = e->mem->getType()->getContainedType(0);
310 llvm::Value* ret = 0;
311 if (llvm::isa<llvm::ArrayType>(t)) {
312 ret = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb());
313
314 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0));
315 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false);
316
317 size_t numelements = llvm::cast<llvm::ArrayType>(t)->getNumElements();
318 llvm::ConstantInt* nelems = llvm::ConstantInt::get(LLVM_DtoSize_t(), numelements, false);
319
320 sz = llvm::ConstantExpr::getMul(elemsz, nelems);
321 }
322 else if (llvm::isa<llvm::StructType>(t)) {
323 ret = LLVM_DtoGEPi(e->mem, 0, 1, "tmp", gIR->scopebb());
324 ret = new llvm::LoadInst(ret, "tmp", gIR->scopebb());
325
326 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0));
327 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(LLVM_DtoSize_t(), elembsz, false);
328
329 llvm::Value* len = LLVM_DtoGEPi(e->mem, 0, 0, "tmp", gIR->scopebb());
330 len = new llvm::LoadInst(len, "tmp", gIR->scopebb());
331 sz = llvm::BinaryOperator::createMul(len,elemsz,"tmp",gIR->scopebb());
332 }
333 else {
334 assert(0);
335 }
336 return ret;
337 }
338
306 void LLVM_DtoArrayCopy(elem* dst, elem* src) 339 void LLVM_DtoArrayCopy(elem* dst, elem* src)
307 { 340 {
308 assert(0); 341 Logger::cout() << "Array copy ((((" << *src->mem << ")))) into ((((" << *dst->mem << "))))\n";
309 } 342
343 assert(dst->type == elem::SLICE);
344 assert(src->type == elem::SLICE);
345
346 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
347
348 llvm::Value* sz1;
349 llvm::Value* sz2;
350 llvm::Value* dstarr = new llvm::BitCastInst(get_slice_ptr(dst,sz1),arrty,"tmp",gIR->scopebb());
351 llvm::Value* srcarr = new llvm::BitCastInst(get_slice_ptr(src,sz2),arrty,"tmp",gIR->scopebb());
352
353 llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32();
354 std::vector<llvm::Value*> llargs;
355 llargs.resize(4);
356 llargs[0] = dstarr;
357 llargs[1] = srcarr;
358 llargs[2] = sz1;
359 llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
360
361 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
362 }
363
364 //////////////////////////////////////////////////////////////////////////////////////////
365 llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr)
366 {
367 std::vector<const llvm::Type*> types;
368 types.push_back(dim->getType());
369 types.push_back(ptr->getType());
370 const llvm::StructType* type = llvm::StructType::get(types);
371 std::vector<llvm::Constant*> values;
372 values.push_back(dim);
373 values.push_back(ptr);
374 return llvm::ConstantStruct::get(type,values);
375 }