Mercurial > projects > ldc
comparison gen/arrays.cpp @ 133:44a95ac7368a trunk
[svn r137] Many fixes towards tango.io.Console working, but not quite there yet...
In particular, assertions has been fixed to include file/line info, and much more!
author | lindquist |
---|---|
date | Mon, 14 Jan 2008 05:11:54 +0100 |
parents | 1700239cab2e |
children | 0e28624814e8 |
comparison
equal
deleted
inserted
replaced
132:1700239cab2e | 133:44a95ac7368a |
---|---|
22 const llvm::Type* arrty; | 22 const llvm::Type* arrty; |
23 | 23 |
24 if (at == llvm::Type::VoidTy) { | 24 if (at == llvm::Type::VoidTy) { |
25 at = llvm::Type::Int8Ty; | 25 at = llvm::Type::Int8Ty; |
26 } | 26 } |
27 arrty = llvm::PointerType::get(at); | 27 arrty = getPtrToType(at); |
28 | 28 |
29 std::vector<const llvm::Type*> members; | 29 std::vector<const llvm::Type*> members; |
30 if (global.params.is64bit) | 30 if (global.params.is64bit) |
31 members.push_back(llvm::Type::Int64Ty); | 31 members.push_back(llvm::Type::Int64Ty); |
32 else | 32 else |
96 if (!arrty) | 96 if (!arrty) |
97 { | 97 { |
98 Logger::cout() << "invalid: " << *src << '\n'; | 98 Logger::cout() << "invalid: " << *src << '\n'; |
99 assert(0); | 99 assert(0); |
100 } | 100 } |
101 llvm::Type* dstty = llvm::PointerType::get(arrty->getElementType()); | 101 const llvm::Type* dstty = getPtrToType(arrty->getElementType()); |
102 | 102 |
103 llvm::Value* dstlen = DtoGEPi(dst,0,0,"tmp",gIR->scopebb()); | 103 llvm::Value* dstlen = DtoGEPi(dst,0,0,"tmp",gIR->scopebb()); |
104 llvm::Value* srclen = DtoConstSize_t(arrty->getNumElements()); | 104 llvm::Value* srclen = DtoConstSize_t(arrty->getNumElements()); |
105 new llvm::StoreInst(srclen, dstlen, gIR->scopebb()); | 105 new llvm::StoreInst(srclen, dstlen, gIR->scopebb()); |
106 | 106 |
159 if (size_t arrsz = checkRectArrayInit(pt, finalTy)) { | 159 if (size_t arrsz = checkRectArrayInit(pt, finalTy)) { |
160 assert(finalTy == t); | 160 assert(finalTy == t); |
161 llvm::Constant* c = isaConstant(dim); | 161 llvm::Constant* c = isaConstant(dim); |
162 assert(c); | 162 assert(c); |
163 dim = llvm::ConstantExpr::getMul(c, DtoConstSize_t(arrsz)); | 163 dim = llvm::ConstantExpr::getMul(c, DtoConstSize_t(arrsz)); |
164 ptr = gIR->ir->CreateBitCast(ptr, llvm::PointerType::get(finalTy), "tmp"); | 164 ptr = gIR->ir->CreateBitCast(ptr, getPtrToType(finalTy), "tmp"); |
165 } | 165 } |
166 else if (isaStruct(t)) { | 166 else if (isaStruct(t)) { |
167 aggrsz = gTargetData->getTypeSize(t); | 167 aggrsz = getABITypeSize(t); |
168 llvm::Constant* c = isaConstant(val); | 168 llvm::Constant* c = isaConstant(val); |
169 if (c && c->isNullValue()) { | 169 if (c && c->isNullValue()) { |
170 llvm::Value* nbytes; | 170 llvm::Value* nbytes; |
171 if (aggrsz == 1) | 171 if (aggrsz == 1) |
172 nbytes = dim; | 172 nbytes = dim; |
174 nbytes = gIR->ir->CreateMul(dim, DtoConstSize_t(aggrsz), "tmp"); | 174 nbytes = gIR->ir->CreateMul(dim, DtoConstSize_t(aggrsz), "tmp"); |
175 DtoMemSetZero(ptr,nbytes); | 175 DtoMemSetZero(ptr,nbytes); |
176 return; | 176 return; |
177 } | 177 } |
178 else { | 178 else { |
179 ptr = gIR->ir->CreateBitCast(ptr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); | 179 ptr = gIR->ir->CreateBitCast(ptr, getPtrToType(llvm::Type::Int8Ty), "tmp"); |
180 } | 180 } |
181 } | 181 } |
182 else { | 182 else { |
183 assert(t == pt); | 183 assert(t == pt); |
184 } | 184 } |
197 args.push_back(DtoConstSize_t(aggrsz)); | 197 args.push_back(DtoConstSize_t(aggrsz)); |
198 } | 198 } |
199 else if (isaPointer(t)) { | 199 else if (isaPointer(t)) { |
200 funcname = "_d_array_init_pointer"; | 200 funcname = "_d_array_init_pointer"; |
201 | 201 |
202 const llvm::Type* dstty = llvm::PointerType::get(llvm::PointerType::get(llvm::Type::Int8Ty)); | 202 const llvm::Type* dstty = getPtrToType(getPtrToType(llvm::Type::Int8Ty)); |
203 if (args[0]->getType() != dstty) | 203 if (args[0]->getType() != dstty) |
204 args[0] = new llvm::BitCastInst(args[0],dstty,"tmp",gIR->scopebb()); | 204 args[0] = new llvm::BitCastInst(args[0],dstty,"tmp",gIR->scopebb()); |
205 | 205 |
206 const llvm::Type* valty = llvm::PointerType::get(llvm::Type::Int8Ty); | 206 const llvm::Type* valty = getPtrToType(llvm::Type::Int8Ty); |
207 if (args[2]->getType() != valty) | 207 if (args[2]->getType() != valty) |
208 args[2] = new llvm::BitCastInst(args[2],valty,"tmp",gIR->scopebb()); | 208 args[2] = new llvm::BitCastInst(args[2],valty,"tmp",gIR->scopebb()); |
209 } | 209 } |
210 else if (t == llvm::Type::Int1Ty) { | 210 else if (t == llvm::Type::Int1Ty) { |
211 funcname = "_d_array_init_i1"; | 211 funcname = "_d_array_init_i1"; |
363 llvm::Value* ret = 0; | 363 llvm::Value* ret = 0; |
364 if (e->len != 0) { | 364 if (e->len != 0) { |
365 // this means it's a real slice | 365 // this means it's a real slice |
366 ret = e->ptr; | 366 ret = e->ptr; |
367 | 367 |
368 size_t elembsz = gTargetData->getTypeSize(ret->getType()); | 368 size_t elembsz = getABITypeSize(ret->getType()); |
369 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); | 369 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); |
370 | 370 |
371 if (isaConstantInt(e->len)) { | 371 if (isaConstantInt(e->len)) { |
372 sz = llvm::ConstantExpr::getMul(elemsz, isaConstant(e->len)); | 372 sz = llvm::ConstantExpr::getMul(elemsz, isaConstant(e->len)); |
373 } | 373 } |
376 } | 376 } |
377 } | 377 } |
378 else if (isaArray(t)) { | 378 else if (isaArray(t)) { |
379 ret = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); | 379 ret = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); |
380 | 380 |
381 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); | 381 size_t elembsz = getABITypeSize(ret->getType()->getContainedType(0)); |
382 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); | 382 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); |
383 | 383 |
384 size_t numelements = isaArray(t)->getNumElements(); | 384 size_t numelements = isaArray(t)->getNumElements(); |
385 llvm::ConstantInt* nelems = llvm::ConstantInt::get(DtoSize_t(), numelements, false); | 385 llvm::ConstantInt* nelems = llvm::ConstantInt::get(DtoSize_t(), numelements, false); |
386 | 386 |
388 } | 388 } |
389 else if (isaStruct(t)) { | 389 else if (isaStruct(t)) { |
390 ret = DtoGEPi(e->ptr, 0, 1, "tmp", gIR->scopebb()); | 390 ret = DtoGEPi(e->ptr, 0, 1, "tmp", gIR->scopebb()); |
391 ret = new llvm::LoadInst(ret, "tmp", gIR->scopebb()); | 391 ret = new llvm::LoadInst(ret, "tmp", gIR->scopebb()); |
392 | 392 |
393 size_t elembsz = gTargetData->getTypeSize(ret->getType()->getContainedType(0)); | 393 size_t elembsz = getABITypeSize(ret->getType()->getContainedType(0)); |
394 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); | 394 llvm::ConstantInt* elemsz = llvm::ConstantInt::get(DtoSize_t(), elembsz, false); |
395 | 395 |
396 llvm::Value* len = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); | 396 llvm::Value* len = DtoGEPi(e->ptr, 0, 0, "tmp", gIR->scopebb()); |
397 len = new llvm::LoadInst(len, "tmp", gIR->scopebb()); | 397 len = new llvm::LoadInst(len, "tmp", gIR->scopebb()); |
398 sz = llvm::BinaryOperator::createMul(len,elemsz,"tmp",gIR->scopebb()); | 398 sz = llvm::BinaryOperator::createMul(len,elemsz,"tmp",gIR->scopebb()); |
403 return ret; | 403 return ret; |
404 } | 404 } |
405 | 405 |
406 void DtoArrayCopySlices(DSliceValue* dst, DSliceValue* src) | 406 void DtoArrayCopySlices(DSliceValue* dst, DSliceValue* src) |
407 { | 407 { |
408 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); | 408 const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); |
409 | 409 |
410 llvm::Value* sz1; | 410 llvm::Value* sz1; |
411 llvm::Value* dstarr = new llvm::BitCastInst(get_slice_ptr(dst,sz1),arrty,"tmp",gIR->scopebb()); | 411 llvm::Value* dstarr = new llvm::BitCastInst(get_slice_ptr(dst,sz1),arrty,"tmp",gIR->scopebb()); |
412 | 412 |
413 llvm::Value* sz2; | 413 llvm::Value* sz2; |
424 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); | 424 new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb()); |
425 } | 425 } |
426 | 426 |
427 void DtoArrayCopyToSlice(DSliceValue* dst, DValue* src) | 427 void DtoArrayCopyToSlice(DSliceValue* dst, DValue* src) |
428 { | 428 { |
429 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); | 429 const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); |
430 | 430 |
431 llvm::Value* sz1; | 431 llvm::Value* sz1; |
432 llvm::Value* dstarr = new llvm::BitCastInst(get_slice_ptr(dst,sz1),arrty,"tmp",gIR->scopebb()); | 432 llvm::Value* dstarr = new llvm::BitCastInst(get_slice_ptr(dst,sz1),arrty,"tmp",gIR->scopebb()); |
433 llvm::Value* srcarr = new llvm::BitCastInst(DtoArrayPtr(src),arrty,"tmp",gIR->scopebb()); | 433 llvm::Value* srcarr = new llvm::BitCastInst(DtoArrayPtr(src),arrty,"tmp",gIR->scopebb()); |
434 | 434 |
445 | 445 |
446 ////////////////////////////////////////////////////////////////////////////////////////// | 446 ////////////////////////////////////////////////////////////////////////////////////////// |
447 void DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src) | 447 void DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src) |
448 { | 448 { |
449 assert(dst->getType() == src->getType()); | 449 assert(dst->getType() == src->getType()); |
450 size_t arrsz = gTargetData->getTypeSize(dst->getType()->getContainedType(0)); | 450 size_t arrsz = getABITypeSize(dst->getType()->getContainedType(0)); |
451 llvm::Value* n = llvm::ConstantInt::get(DtoSize_t(), arrsz, false); | 451 llvm::Value* n = llvm::ConstantInt::get(DtoSize_t(), arrsz, false); |
452 | 452 |
453 llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty); | 453 const llvm::Type* arrty = getPtrToType(llvm::Type::Int8Ty); |
454 llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); | 454 llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb()); |
455 llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); | 455 llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb()); |
456 | 456 |
457 llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32(); | 457 llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32(); |
458 std::vector<llvm::Value*> llargs; | 458 std::vector<llvm::Value*> llargs; |
481 ////////////////////////////////////////////////////////////////////////////////////////// | 481 ////////////////////////////////////////////////////////////////////////////////////////// |
482 llvm::Value* DtoNewDynArray(llvm::Value* dst, llvm::Value* dim, Type* dty, bool doinit) | 482 llvm::Value* DtoNewDynArray(llvm::Value* dst, llvm::Value* dim, Type* dty, bool doinit) |
483 { | 483 { |
484 const llvm::Type* ty = DtoType(dty); | 484 const llvm::Type* ty = DtoType(dty); |
485 assert(ty != llvm::Type::VoidTy); | 485 assert(ty != llvm::Type::VoidTy); |
486 size_t sz = gTargetData->getTypeSize(ty); | 486 size_t sz = getABITypeSize(ty); |
487 llvm::ConstantInt* n = llvm::ConstantInt::get(DtoSize_t(), sz, false); | 487 llvm::ConstantInt* n = llvm::ConstantInt::get(DtoSize_t(), sz, false); |
488 llvm::Value* bytesize = (sz == 1) ? dim : llvm::BinaryOperator::createMul(n,dim,"tmp",gIR->scopebb()); | 488 llvm::Value* bytesize = (sz == 1) ? dim : llvm::BinaryOperator::createMul(n,dim,"tmp",gIR->scopebb()); |
489 | 489 |
490 llvm::Value* nullptr = llvm::ConstantPointerNull::get(llvm::PointerType::get(ty)); | 490 llvm::Value* nullptr = llvm::ConstantPointerNull::get(getPtrToType(ty)); |
491 | 491 |
492 llvm::Value* newptr = DtoRealloc(nullptr, bytesize); | 492 llvm::Value* newptr = DtoRealloc(nullptr, bytesize); |
493 | 493 |
494 if (doinit) { | 494 if (doinit) { |
495 DValue* e = dty->defaultInit()->toElem(gIR); | 495 DValue* e = dty->defaultInit()->toElem(gIR); |
508 llvm::Value* DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz) | 508 llvm::Value* DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz) |
509 { | 509 { |
510 llvm::Value* ptr = DtoGEPi(arr, 0, 1, "tmp", gIR->scopebb()); | 510 llvm::Value* ptr = DtoGEPi(arr, 0, 1, "tmp", gIR->scopebb()); |
511 llvm::Value* ptrld = new llvm::LoadInst(ptr,"tmp",gIR->scopebb()); | 511 llvm::Value* ptrld = new llvm::LoadInst(ptr,"tmp",gIR->scopebb()); |
512 | 512 |
513 size_t isz = gTargetData->getTypeSize(ptrld->getType()->getContainedType(0)); | 513 size_t isz = getABITypeSize(ptrld->getType()->getContainedType(0)); |
514 llvm::ConstantInt* n = llvm::ConstantInt::get(DtoSize_t(), isz, false); | 514 llvm::ConstantInt* n = llvm::ConstantInt::get(DtoSize_t(), isz, false); |
515 llvm::Value* bytesz = (isz == 1) ? sz : llvm::BinaryOperator::createMul(n,sz,"tmp",gIR->scopebb()); | 515 llvm::Value* bytesz = (isz == 1) ? sz : llvm::BinaryOperator::createMul(n,sz,"tmp",gIR->scopebb()); |
516 | 516 |
517 llvm::Value* newptr = DtoRealloc(ptrld, bytesz); | 517 llvm::Value* newptr = DtoRealloc(ptrld, bytesz); |
518 new llvm::StoreInst(newptr,ptr,gIR->scopebb()); | 518 new llvm::StoreInst(newptr,ptr,gIR->scopebb()); |
756 } | 756 } |
757 | 757 |
758 ////////////////////////////////////////////////////////////////////////////////////////// | 758 ////////////////////////////////////////////////////////////////////////////////////////// |
759 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty) | 759 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty) |
760 { | 760 { |
761 size_t esz = gTargetData->getTypeSize(elemty); | 761 size_t esz = getABITypeSize(elemty); |
762 size_t nsz = gTargetData->getTypeSize(newelemty); | 762 size_t nsz = getABITypeSize(newelemty); |
763 if (esz == nsz) | 763 if (esz == nsz) |
764 return len; | 764 return len; |
765 | 765 |
766 std::vector<llvm::Value*> args; | 766 std::vector<llvm::Value*> args; |
767 args.push_back(len); | 767 args.push_back(len); |
896 Logger::cout() << "to pointer" << '\n'; | 896 Logger::cout() << "to pointer" << '\n'; |
897 assert(fromtype->next == totype->next || totype->next->ty == Tvoid); | 897 assert(fromtype->next == totype->next || totype->next->ty == Tvoid); |
898 llvm::Value* ptr = DtoGEPi(u->getRVal(),0,1,"tmp",gIR->scopebb()); | 898 llvm::Value* ptr = DtoGEPi(u->getRVal(),0,1,"tmp",gIR->scopebb()); |
899 rval = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); | 899 rval = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); |
900 if (fromtype->next != totype->next) | 900 if (fromtype->next != totype->next) |
901 rval = gIR->ir->CreateBitCast(rval, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp"); | 901 rval = gIR->ir->CreateBitCast(rval, getPtrToType(llvm::Type::Int8Ty), "tmp"); |
902 } | 902 } |
903 else if (totype->ty == Tarray) { | 903 else if (totype->ty == Tarray) { |
904 Logger::cout() << "to array" << '\n'; | 904 Logger::cout() << "to array" << '\n'; |
905 const llvm::Type* ptrty = DtoType(totype->next); | 905 const llvm::Type* ptrty = DtoType(totype->next); |
906 if (ptrty == llvm::Type::VoidTy) | 906 if (ptrty == llvm::Type::VoidTy) |
907 ptrty = llvm::Type::Int8Ty; | 907 ptrty = llvm::Type::Int8Ty; |
908 ptrty = llvm::PointerType::get(ptrty); | 908 ptrty = getPtrToType(ptrty); |
909 | 909 |
910 const llvm::Type* ety = DtoType(fromtype->next); | 910 const llvm::Type* ety = DtoType(fromtype->next); |
911 if (ety == llvm::Type::VoidTy) | 911 if (ety == llvm::Type::VoidTy) |
912 ety = llvm::Type::Int8Ty; | 912 ety = llvm::Type::Int8Ty; |
913 | 913 |