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