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